FE EXAM

フラグメンテーション(断片化)

メモリの割り当てと解放を繰り返すうちに、使えない細切れの領域ができてしまう現象。

INTERACTIVE VISUALIZATION
使用中
内部断片化
外部断片化
空き
フェーズ
idle
合計空き
640KB
連続して取れる最大
640KB
シナリオ
ステップ1 / 7
STEP 1/7空っぽのメモリまだ何も置かれていないメモリ(主記憶=CPUが直接読み書きする記憶)です。横長のバーがメモリ全体を表します。左から順に区画やプログラムが置かれていく様子を追っていきます。
メモリ(主記憶 640KB)空き640KB
空きの状況
空きの合計   = 640KB
連続最大    = 640KB
解説

📌
フラグメンテーションとは

使用中の間に空き(赤)が細切れに散らばる

フラグメンテーション(断片化)とは、メモリ(=主記憶)の割り当てと解放を繰り返すうちに、使えない細切れの領域ができてしまう現象のことです。メモリが「歯抜け」のようになり、有効に活用できなくなります。

身近な例で考えると、映画館の座席に似ています。お客さんが入れ替わると、空席があちこちにポツポツ残ります。空席の合計は十分でも、5人グループが横並びで座れる連続した席が見つからない、という状況が起こります。これがメモリで起きるのがフラグメンテーションです。

上のツールで▶ボタンを押すと、固定区画での内部断片化と、可変区画での外部断片化が順番に起こり、最後にコンパクションで解消される流れを確認できます。

⚖️
内部/外部断片化の違い

内部断片化プログラム余り外部断片化内:区画の内側に余り / 外:空きが分断

断片化には2種類あります。
内部断片化:割り当てた区画の内側にできる未使用の余り。あらかじめ決めた大きさの区画にプログラムを入れる固定区画方式で起こります。区画>プログラムだと差分が余ります。
外部断片化:空き領域があちこちに分断され、連続した大きな領域が取れない状態。必要なサイズだけ割り当てる可変区画方式で、割り当てと解放を繰り返すと起こります。

言い換えると、内部は「枠の中の無駄」、外部は「枠の外(すき間)の無駄」です。外部断片化が厄介なのは、空きの合計が十分でも連続していないために割り当てに失敗する点です。上のツールのSTEP5で、合計440KBの空きがあっても300KBが置けない様子を確認できます。

🧹
解消方法(コンパクション等)

↓ コンパクション連続した空き

断片化を解消する代表的な方法は次の2つです。
コンパクション(記憶の再配置):使用中の領域をメモリの片側へ寄せて、散らばった空きを1か所にまとめます。連続した大きな空きが生まれ、外部断片化が解消されます。
ページング:メモリを固定サイズのページに分けて管理する方式。連続領域を必要としないため、そもそも外部断片化が起こりません。

コンパクションは、本棚にすき間なく本を詰め直す作業に似ています。ただし移動には手間(処理時間)がかかるため、頻繁には行えません。一方ページングは仕組みそのもので断片化を防ぐので、現代のOS(基本ソフト)の多くが採用しています。上のツールのSTEP6で、片側に詰めて空きをまとめる様子を確認できます。

💡
なぜ断片化が問題になるか

合計空き = 90KB 連続最大 = 30KB要求 50KB → 置けない(連続不足)

なぜ断片化が問題か。一番の実害は、「空きの合計は十分なのに、新しいプログラムを置けない」状態が起きることです。プログラムはメモリの連続した1つのかたまりとして置かれます。空きがバラバラに散らばっていると、合計は足りていても「50KB続けて空いている場所」がなければ置けません。

上の図では、空きの合計は90KBありますが、どこも30KB以下のかたまりにしかなっていません。このため50KBのプログラムは置けません。
合計空きが大きくても意味がない ― 連続していなければ使えない
割り当て失敗 ― 実際のメモリ不足ではなく「配置できない」ために起きる
処理の遅れ ― 解消のためにコンパクションを行う処理時間が余分にかかる

身近な例で考えると、駐車場に空きスペースはあちこちあるのに、大型トラックが停められる連続した2台分のスペースがない状態です。「空きゼロ」ではなく「使える形で空いていない」のが断片化の本質です。上のツールのSTEP5でこの「連続空き不足で置けない」様子をインタラクティブに確認できます。

🗂️
断片化の発生条件を整理する

固定区画方式余り→ 内部断片化可変区画方式→ 外部断片化

2種類の断片化は、それぞれ異なる方式で発生します。「どちらの方式でどちらの断片化か」を表で確認しましょう。

比較項目内部断片化外部断片化
発生する方式固定区画方式可変区画方式
無駄の場所区画の内側(割り当て済み領域内)区画の外側(解放された空き)
具体的な無駄区画よりプログラムが小さいときの差分空きが細切れになって連続しない
主な解消法可変区画方式への変更・サイズ最適化コンパクション・ページング方式の採用

整理すると、内部断片化は「決まった枠に小さいものを入れたときの余り」外部断片化は「使ったり返したりを繰り返した後のすき間の散らばり」です。固定区画と可変区画はそれぞれ、互いの断片化を防ぎながら別の断片化を引き起こすというトレードオフがあります。どちらも完璧ではないからこそ、ページングやコンパクションという解消手段が生まれました。

練習問題

🎯
基本情報技術者 練習問題

Q1.内部断片化の説明として最も適切なものはどれか。
A.空き領域があちこちに分断され、連続した大きな領域が取れない状態
B.割り当てた区画の中にできる、使われない余りの領域
C.プログラムが使えるメモリが完全になくなった状態
D.物理メモリより大きなプログラムを動かす仕組み
Q2.外部断片化が起こりやすい方式と、その特徴の組み合わせとして正しいものはどれか。
A.可変区画方式 — 空きの合計は足りても連続して取れず割り当てに失敗することがある
B.固定区画方式 — 区画の内側に必ず余りができる
C.ページング方式 — 必ず外部断片化が発生する
D.可変区画方式 — 空きが連続しているので常に割り当てに成功する
Q3.外部断片化を解消する方法として適切なものはどれか。
A.すべてのプログラムを強制終了する
B.区画サイズをプログラムより必ず大きくする
C.コンパクションで使用中領域を片側へ詰め、空きを1か所にまとめる
D.補助記憶を使わないようにする

関連コンテンツ