最終更新日:2026年10月3日
fe fe-technology computer-system
まず結論
動的再配置(コンパクション)は、主記憶上で分散した空き領域を、使用中の領域を移動して一つの連続した空き領域にまとめる処理です。
FEでは、次の2段階で考えると判断しやすくなります。
空き領域が細かく分散
→ 外部フラグメンテーション
使用中の領域を移動して空きをまとめる
→ 動的再配置(コンパクション)
計算問題では、さらに次の型を使います。
移動時間 = 移動量 ÷ 1回のアクセス量 × 2(読取り+書込み)× 1回のアクセス時間
特に、「移動」には読取りだけでなく書込みも必要という点が重要です。
直感的な説明
メモリを、荷物を置く棚だと考えます。
途中の荷物を取り出すと、空きスペースが離れた場所にできます。
500KB
100KB
800KB
800KB
500KB
800KB
900KB
空き容量そのものは、
100KB + 800KB = 900KB
で変わっていません。
変わるのは空き領域の並び方です。
動的再配置は、使用中の領域を詰めることで、分散した空きを連続した大きな領域にします。
定義・仕組み
外部フラグメンテーション
可変長の領域を確保・解放していると、使用中の領域の間に小さな空きが残ることがあります。
使用中 | 空き | 使用中 | 空き | 使用中
空き容量の合計は十分でも、大きな連続領域を確保できないことがあります。
これが外部フラグメンテーションです。
動的再配置(コンパクション)
分散した空きをまとめるため、使用中の領域を移動します。
移動前
使用中 | 空き | 使用中 | 空き
↓ コンパクション
移動後
使用中 | 使用中 | ─── 空き ───
この処理にはデータの移動が必要なので、メモリアクセスの時間がかかります。
内部フラグメンテーションとの違い
内部フラグメンテーションは、確保した領域の内部に使われない部分が生じる状態です。
外部フラグメンテーション
→ 領域と領域の間に空きが分散
内部フラグメンテーション
→ 確保した領域の中に未使用部分
「外に分散」か「確保領域の内側で余る」かで切り分けます。
科目Aでどう出る?
判断軸1:実際に何バイト移動するか
例えば、
500KB | 空き100KB | 800KB | 空き800KB
という配置なら、空きを一つにするために800KBの領域を左へ移せます。
このとき処理するのは、最終的な空き900KBではありません。
実際に移動するデータ量=800KB
です。
判断軸2:アクセス回数を求める
1回のメモリアクセスが4バイト単位なら、
800KB = 800,000バイト
800,000 ÷ 4
= 200,000回
です。
ただし、これは片方向のアクセス回数です。
判断軸3:「移動」は読取り+書込み
データを移動するには、
元の場所から読取り
↓
新しい場所へ書込み
が必要です。
したがって、
200,000回 × 2
= 400,000回
となります。
1回のアクセスが30nsなら、
400,000 × 30ns
= 12,000,000ns
= 12ms
です。
試験中の計算の型
① 移動するデータ量を決める
↓
② 1回のアクセス量で割る
↓
③ 読取り+書込みなので ×2
↓
④ 1回のアクセス時間を掛ける
↓
⑤ ns → ms など単位を変換
式だけを暗記するより、この処理順を覚える方が別の数値でも対応しやすくなります。
どんな場面で使う?
動的再配置は、可変長の領域を割り当てた結果、主記憶上の空き領域が細かく分散した場合に、それらを連続した領域へまとめる考え方です。
ただし、データを実際に移動するためコストがかかります。
そのためFEでは、
空きをまとめるメリットと、データ移動に時間がかかること
をセットで理解しておくと判断しやすくなります。
よくある誤解・混同
空き容量の合計を移動量にする
違います。
空き100KB + 空き800KB
= 空き合計900KB
でも、移動するのが800KBの使用中領域なら、計算に使う移動量は800KBです。
「最終的に何KB空くか」と「何KB動かすか」を分けます。
読取り回数だけで計算する
ここが特に危険です。
800KBを4バイトずつ、1アクセス30nsで読むだけなら、
800,000 ÷ 4 × 30ns
= 6ms
です。
しかし、データ移動には書込みも必要です。
6ms(読取り)
+ 6ms(書込み)
= 12ms
「コピー」「移動」という言葉を見たら、読取りと書込みの両方を確認します。
外部フラグメンテーションと内部フラグメンテーション
空き領域があちこちに分散
→ 外部フラグメンテーション
確保した領域の内部に余り
→ 内部フラグメンテーション
動的再配置でまとめようとしているのは、前者の分散した空き領域です。
コンパクションとページングは同じ
同じではありません。
コンパクションは、使用中の領域を移動して連続した空きを作る処理です。
一方、ページングではメモリを固定長の単位で扱います。
試験では、可変長領域の間に空きが分散している図が出たら、外部フラグメンテーションやコンパクションを疑います。
まとめ(試験直前用)
- 空き領域が細かく分散 → 外部フラグメンテーション
- 使用中の領域を移動して空きをまとめる → 動的再配置(コンパクション)
- 移動時間では、まず実際に移動するデータ量を見る
- アクセス回数 = 移動量 ÷ 1回のアクセス量
- データ移動は読取り+書込みなので、基本的に両方のアクセスを数える
- ns、μs、msの単位変換を最後に確認する
「何KB空くか」ではなく「何KB動かすか」。さらに、移動なら「読む+書く」。