メモリの割り当てと解放を繰り返すうちに、使えない細切れの領域ができてしまう現象。
フラグメンテーション(断片化)とは、メモリ(=主記憶)の割り当てと解放を繰り返すうちに、使えない細切れの領域ができてしまう現象のことです。メモリが「歯抜け」のようになり、有効に活用できなくなります。
身近な例で考えると、映画館の座席に似ています。お客さんが入れ替わると、空席があちこちにポツポツ残ります。空席の合計は十分でも、5人グループが横並びで座れる連続した席が見つからない、という状況が起こります。これがメモリで起きるのがフラグメンテーションです。
上のツールで▶ボタンを押すと、固定区画での内部断片化と、可変区画での外部断片化が順番に起こり、最後にコンパクションで解消される流れを確認できます。
断片化には2種類あります。
・内部断片化:割り当てた区画の内側にできる未使用の余り。あらかじめ決めた大きさの区画にプログラムを入れる固定区画方式で起こります。区画>プログラムだと差分が余ります。
・外部断片化:空き領域があちこちに分断され、連続した大きな領域が取れない状態。必要なサイズだけ割り当てる可変区画方式で、割り当てと解放を繰り返すと起こります。
言い換えると、内部は「枠の中の無駄」、外部は「枠の外(すき間)の無駄」です。外部断片化が厄介なのは、空きの合計が十分でも連続していないために割り当てに失敗する点です。上のツールのSTEP5で、合計440KBの空きがあっても300KBが置けない様子を確認できます。
断片化を解消する代表的な方法は次の2つです。
・コンパクション(記憶の再配置):使用中の領域をメモリの片側へ寄せて、散らばった空きを1か所にまとめます。連続した大きな空きが生まれ、外部断片化が解消されます。
・ページング:メモリを固定サイズのページに分けて管理する方式。連続領域を必要としないため、そもそも外部断片化が起こりません。
コンパクションは、本棚にすき間なく本を詰め直す作業に似ています。ただし移動には手間(処理時間)がかかるため、頻繁には行えません。一方ページングは仕組みそのもので断片化を防ぐので、現代のOS(基本ソフト)の多くが採用しています。上のツールのSTEP6で、片側に詰めて空きをまとめる様子を確認できます。
なぜ断片化が問題か。一番の実害は、「空きの合計は十分なのに、新しいプログラムを置けない」状態が起きることです。プログラムはメモリの連続した1つのかたまりとして置かれます。空きがバラバラに散らばっていると、合計は足りていても「50KB続けて空いている場所」がなければ置けません。
上の図では、空きの合計は90KBありますが、どこも30KB以下のかたまりにしかなっていません。このため50KBのプログラムは置けません。
・合計空きが大きくても意味がない ― 連続していなければ使えない
・割り当て失敗 ― 実際のメモリ不足ではなく「配置できない」ために起きる
・処理の遅れ ― 解消のためにコンパクションを行う処理時間が余分にかかる
身近な例で考えると、駐車場に空きスペースはあちこちあるのに、大型トラックが停められる連続した2台分のスペースがない状態です。「空きゼロ」ではなく「使える形で空いていない」のが断片化の本質です。上のツールのSTEP5でこの「連続空き不足で置けない」様子をインタラクティブに確認できます。
2種類の断片化は、それぞれ異なる方式で発生します。「どちらの方式でどちらの断片化か」を表で確認しましょう。
| 比較項目 | 内部断片化 | 外部断片化 |
|---|---|---|
| 発生する方式 | 固定区画方式 | 可変区画方式 |
| 無駄の場所 | 区画の内側(割り当て済み領域内) | 区画の外側(解放された空き) |
| 具体的な無駄 | 区画よりプログラムが小さいときの差分 | 空きが細切れになって連続しない |
| 主な解消法 | 可変区画方式への変更・サイズ最適化 | コンパクション・ページング方式の採用 |
整理すると、内部断片化は「決まった枠に小さいものを入れたときの余り」、外部断片化は「使ったり返したりを繰り返した後のすき間の散らばり」です。固定区画と可変区画はそれぞれ、互いの断片化を防ぎながら別の断片化を引き起こすというトレードオフがあります。どちらも完璧ではないからこそ、ページングやコンパクションという解消手段が生まれました。