情報処理試験を勉強していると、「メモリコンパクションって何?ガベージコレクションやデフラグと何が違うの?」と混乱しがちです。この記事では、メモリコンパクションの意味・仕組み・試験での出題パターンを図解付きで整理します。

対象試験と出題頻度

メモリコンパクションは、応用情報技術者試験で出題されるテーマです。

OS(オペレーティングシステム)の記憶管理分野に属し、主記憶管理の選択肢として繰り返し登場しています。

詳細をクリックして確認
対象試験:
応用情報技術者
出題頻度:
★★★☆☆
ランクB(標準)覚えておくと有利

用語の定義

メモリコンパクション(Memory Compaction)とは、一言で言うと

 「主記憶上に散らばった空き領域を詰め合わせて、一つの連続した空き領域にまとめる処理

のことです。

イメージとしては、本棚の整理です。

本棚から何冊か本を抜くと、あちこちに小さな隙間ができます。新しい分厚い本を入れたくても、どの隙間にも入りません。そこで、残っている本を端から順に詰めて寄せれば、棚の右端にまとまった空きスペースが生まれます。

メモリコンパクションはこれと同じことを主記憶上で行う処理です。

📊 メモリコンパクションの基本情報

項目 内容
英語名 Memory Compaction
別名 コンパクション、デフラグメンテーション(主記憶対象の場合)
対象 主記憶(実記憶)上の空き領域
発生原因 可変区画方式でプログラムの割当て・解放を繰り返すことによるフラグメンテーション
処理内容 使用中の領域を移動(動的再配置)し、空き領域を連続化する

解説

なぜメモリコンパクションが必要になるのか

OSが主記憶を管理する方式の一つに「可変区画方式」があります。

可変区画方式は、実行するプログラムのサイズに合わせて主記憶を動的に区切って割り当てる方式です。

この方式でプログラムの割当てと解放を繰り返すと、使用中の領域の間に小さな空き領域が点在する状態になります。これが「フラグメンテーション(断片化)」です。

合計では十分な空き容量があるのに、連続した空き領域が不足して新しいプログラムをロードできない――という困った状態を招きます。

フラグメンテーション発生 → コンパクション実行の流れ

【Before】フラグメンテーション発生中の主記憶

プログラムA
空き
プログラムB
空き
プログラムC

▲ 空き領域が3か所に分散 → 合計は十分でも大きなプログラムが入らない

メモリコンパクション実行

【After】コンパクション実行後の主記憶

プログラムA
プログラムB
プログラムC
連続した空き領域

▲ 使用中の領域を前方に詰めて、末尾にまとまった空き領域を確保

処理の仕組み

コンパクションの内部処理は「動的再配置」と呼ばれる操作の連続です。

OSは使用中のセグメント(プログラムが占有するメモリ領域)をアドレスの若い方向へ移動させ、空き領域を末尾にまとめます。

セグメントの移動は「読取り→書込み」をメモリアクセス単位ごとに繰り返すため、移動量が大きいほど処理時間がかかります。

詳細:アクセス時間の計算例(何となくで覚えたい人は飛ばしてOK)

FE H29秋 問19で出題された計算問題を例にします。

条件:移動対象のセグメントが800kバイト、1回のメモリアクセスは4バイト単位、読取り30ナノ秒・書込み30ナノ秒

手順① アクセス回数 = 800,000 ÷ 4 = 200,000回

手順② 読取り+書込み = 200,000 × 2 = 400,000回

手順③ 合計時間 = 400,000 × 30ナノ秒 = 12,000,000ナノ秒 = 12ミリ秒

※ 「読取り+書込み」で2倍にする点を忘れやすいので注意。

混同しやすい用語との違い

メモリコンパクションは、ガベージコレクションやデフラグメンテーションと混同されやすい用語です。

それぞれの違いを整理します。

用語 対象 やること
メモリコンパクション 主記憶の空き領域 使用中の領域を移動して、散らばった空き領域を一つに連続化する
ガベージコレクション ヒープ領域(プログラムが動的確保したメモリ) 不要になったメモリ領域を回収して再利用可能にする
デフラグメンテーション 補助記憶(HDD等) ファイルの断片化を解消して連続配置に並べ替える

ポイントは「何を対象にしているか」です。

主記憶の空き領域ならコンパクション、ヒープ領域の不要メモリならガベージコレクション、補助記憶のファイル断片化ならデフラグメンテーション。この対応関係を押さえておけば選択肢の入れ替えに惑わされません。

では、この用語が試験でどのように出題されるか見ていきましょう。

💡 メモリコンパクションの核心を3行で

・可変区画方式の主記憶で起きるフラグメンテーションを解消する処理
・使用中の領域を前方に詰め、末尾に連続した空き領域をつくる(動的再配置)
・ガベージコレクション(ヒープ対象)やデフラグメンテーション(補助記憶対象)とは対象が異なる


試験ではこう出る!

メモリコンパクションは、AP午前の主記憶管理分野で繰り返し出題されています。ただし「メモリコンパクションとは何か」を正面から問う問題より、ひっかけ選択肢として登場するケースが多い点がこの用語の特徴です。

📊 過去問での出題実績

試験回 出題内容 問われたポイント
AP R3春
午前 問18
主記憶管理に関する記述の正誤を選ぶ問題。選択肢アで「空き領域を結合して連続領域にする=可変区画方式」という誤った記述が出題。 ・正しくはメモリコンパクションの説明
・「可変区画方式」とのすり替えがひっかけ
AP H28秋
午前 問16
R3春 問18と同一構成の問題(流用)。 ・AP・旧SW間で長年使い回されている定番問題
・選択肢の文言もほぼ同一
AP H24秋
午前 問17
上記2回と同一構成の問題(流用)。 ・3回にわたり同じ問題が出題された実績あり
FE H29秋
午前 問19
セグメントの動的再配置に必要なメモリアクセス時間を計算させる問題。 ・コンパクション実行時の計算問題
・読取り+書込みで2倍にする点がポイント

📝 IPA試験での出題パターン

パターン1:「主記憶管理の用語を正しく対応させよ」
AP午前で最も多い形式です。「空き領域を結合して連続領域にする」の説明文に「可変区画方式」というラベルを貼った選択肢がひっかけとして登場します。正しくはメモリコンパクションの説明であり、可変区画方式は「プログラムサイズに応じて区画を動的に割り当てる方式」です。ここだけは確実に押さえてください。

 

パターン2:「コンパクション時の計算問題」
FEで出題された実績があります。移動対象のバイト数÷アクセス単位で回数を求め、読取り+書込みで2倍にし、1回あたりの時間を掛ける手順です。計算自体は単純ですが、「2倍にする」ステップを忘れると不正解になります。

 

試験ではここまででOKです。コンパクションのアルゴリズム詳細(どのセグメントから移動するか等)まで問われることはないので、深追いは不要です。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。


Q. 可変区画方式の主記憶管理において、プログラムの割当てと解放を繰り返した結果、空き領域が断片化した。この空き領域を一つの連続した領域にまとめる処理として、最も適切なものはどれか。

  • A. プログラムが動的に確保したヒープ領域のうち、不要になった領域を回収して再利用可能にする処理である。
  • B. 使用中の領域を移動(動的再配置)し、主記憶上の分散した空き領域を連続した一つの領域にまとめる処理である。
  • C. 主記憶の容量を超えるプログラムを実行するために、補助記憶との間でページ単位のデータ入替えを行う処理である。

正解と解説を見る

正解:B

解説:
メモリコンパクションは、主記憶上の断片化した空き領域を連続化する処理です。使用中のセグメントを前方に詰めることで、末尾にまとまった空き領域を確保します。

選択肢Aはガベージコレクションの説明です。ガベージコレクションはプログラムが動的に確保したヒープ領域の不要部分を回収する処理であり、主記憶全体の空き領域の連続化とは目的が異なります。選択肢Cはページングによる仮想記憶の説明です。仮想記憶は主記憶と補助記憶の間でページを入れ替える仕組みであり、主記憶内の領域再配置とは無関係です。


よくある質問(FAQ)

Q. 固定区画方式ではメモリコンパクションは不要ですか?

不要です。固定区画方式はあらかじめ決められたサイズで主記憶を区切るため、区画同士の間に隙間が生じる「外部フラグメンテーション」は発生しません。ただし、区画のサイズよりも小さいプログラムを割り当てた場合に区画内に無駄が生じる「内部フラグメンテーション」は発生します。内部フラグメンテーションはコンパクションでは解消できないため、固定区画方式ではそもそも実行する意味がありません。

Q. メモリコンパクションにはデメリットはありますか?

あります。最大のデメリットは処理時間です。使用中の領域を物理的に移動させるため、移動量に比例してCPU時間を消費します。コンパクション実行中は対象領域のプログラムが一時停止する場合もあり、リアルタイム性が要求されるシステムでは頻繁に実行できません。このコスト問題を根本的に回避するために、現代のOSではページング方式の仮想記憶が主流になっています。

Q. 現代のOSでもメモリコンパクションは使われていますか?

汎用OS(Windows・Linux・macOS)ではページング方式の仮想記憶が標準であり、可変区画方式のコンパクションをOS全体で実行する場面はほぼありません。ただし、Android(Linux カーネル)にはzRAMやCMA(Contiguous Memory Allocator)と呼ばれる仕組みがあり、連続した物理メモリが必要なデバイスドライバ向けに限定的なコンパクション処理が行われています。また、Java VMやGo言語のランタイムではガベージコレクションの一環としてヒープ領域のコンパクションが実行されます。

Q. 「スワッピング」や「ロールアウト」との違いは何ですか?

スワッピングは、プロセス全体を主記憶と補助記憶の間で入れ替える処理です。ロールアウトはスワッピングの一部で、優先順位の低いプロセスを補助記憶に退避させる操作を指します。どちらも主記憶と補助記憶の間でデータを移動させる処理であるのに対し、コンパクションは主記憶の内部だけで領域を再配置する処理です。「主記憶の中だけで完結するかどうか」が区別のポイントです。