OPERATING SYSTEMS / MEMORY MANAGEMENT
ページングとセグメンテーションを図解|外部断片化・内部断片化・仮想記憶
容量は空いているのに、どうして置けない? メモリを区切る単位の違いから、OSの設計思想を読み解きます。
1. 本棚の空きスペースから考える
高さが異なる本を「同じ本のまとまり」で収納すると、間に少しずつ隙間ができます。棚全体の空きが十分でも、厚い本をまとめて入れる幅が残らないことがあります。これが外部断片化を理解する入口です。
一方、すべての本を同じ大きさの箱に入れれば、箱を棚のどこに置いても構いません。「6箱必要」なら、連続した場所ではなく空いている6か所へ分けて置けます。この発想がページングです。ただし箱の中に少し空きができる欠点もあります。
2. なぜOSがメモリを区切るのか
プログラムには命令、データ、スタックなどさまざまな情報があります。実際のRAMは有限で、複数のプロセスが共有します。どのプログラムがどの場所を使うか管理し、ほかのプログラムの領域を勝手に触らせない仕組みが必要です。
そこで各プロセスには仮想アドレス空間を見せ、OSとハードウェアが実際の物理メモリの場所へ対応付けます。論理的なアドレスと物理的な位置を分離すると、プログラムはRAM上の配置を意識せず実行できます。
3. セグメンテーション:意味に沿って分ける
セグメンテーション(Segmentation、セグメンテーション)は、コード・データ・スタックなど論理的な意味を持つ可変長の領域に分ける方式です。古典的な単純セグメンテーションでは、各セグメントの開始位置(base)と長さ(limit)を管理します。
たとえばコードは「読み取り・実行可、書き込み不可」、データは「読み書き可」のように、意味に合わせた保護と共有を考えやすくなります。反面、可変長のセグメントを物理メモリに連続配置する設計では、空き領域が細切れになり得ます。
4. ページング:意味と無関係に固定長で分ける
ページング(Paging、ページング)は、仮想アドレス空間を固定長のページ(page)に分け、物理RAM側も同じ大きさのページ枠(page frame、フレーム)に分ける方式です。ページがRAMのどの枠に置かれるかは、ページテーブルで対応付けます。
同じサイズの枠であれば、データの一部分を物理メモリ上のどこに置いてもよいため、通常の固定長ページングでは外部断片化は発生しません。これが今回の中心となる長所です。
空きは3+5=8マス。しかし最大の連続空きは5マス。6マスのセグメントを置けない。
6マスのデータは2マスのページ×3個に分け、離れた3枠へ配置できる。
模式図です。各マスとページ枠の大きさは例示用で、実際のOSの物理メモリ配置を示すものではありません。
5. 外部断片化はなぜ起きるのか
連続領域しか使えない方式を考えます。メモリにA・B・Cが配置され、Bが終了すると、その場所だけ穴が開きます。別のプログラムが開始・終了を繰り返すと、空き容量が点在します。
例えば「空き3マス」と「空き5マス」が別々にあっても、必要なのが連続6マスなら割り当てられません。この状況では合計8マス空いている事実は助けになりません。外部断片化の改善には、領域を移動して空きをまとめるコンパクション(compaction、圧縮・詰め直し)などが考えられますが、移動コストや参照更新の負担があります。
6. 固定長でも内部断片化は残る
ページサイズが4KiBで、プログラムのあるデータが9KiB必要なら、ページは3個必要で合計12KiBを確保します。最後のページの3KiBは未使用になります。これが内部断片化です。
9KiBを保存するために12KiB分のページ枠を使った例。ページサイズを小さくすれば平均的な余りは減りやすいものの、管理するページ数やページテーブルが増えます。
7. アドレス変換はどう動く?
CPUが仮想アドレスを出すと、MMU(Memory Management Unit、メモリ・マネジメント・ユニット:メモリ管理ユニット)がページ番号とページ内の位置に分けます。ページテーブルを使ってページ番号を物理ページ枠番号へ変換し、ページ内の位置はそのまま使います。
ページ内オフセット100
実際にはTLB(Translation Lookaside Buffer、トランスレーション・ルックアサイド・バッファ)というアドレス変換のキャッシュを利用して、毎回ページテーブルを辿る負荷を減らします。ページがRAMにない場合はページフォールトが起こり、必要に応じてページを読み込みます。
8. 方式を比較する
| 観点 | 単純セグメンテーション | ページング |
|---|---|---|
| 分割単位 | コード・データなど意味を持つ可変長領域 | 意味と無関係な固定長ページ |
| 物理配置 | 古典的な単純方式では各領域に連続した空きを要求 | ページごとに離れた枠へ配置可能 |
| 断片化 | 外部断片化が起こり得る | 通常、外部断片化なし。内部断片化はあり得る |
| 保護と共有 | セグメント単位で論理的に扱いやすい | ページ単位でアクセス権や共有を設定可能 |
| 大きさの変更 | 論理領域は可変長。ただし配置し直しが必要なことも | ページの大きさは固定でも、ページ数を増減して領域の規模を変えられる |
9. ラボ:実際に配置してみる
メモリ容量とページサイズ、配置するデータの大きさを変えてください。可変長では連続した領域が必要で、固定長ではページ単位に分割できる違いが分かります。厳密な「穴」の発生は上の図に示し、ラボは再配置した際の各方式の配置効率を扱います。
メモリ配置シミュレーター
容量を1マス=1単位として、A〜Eの領域を先頭から配置します。チェックを外すとその領域を解放した状態にし、残った領域を先頭から再配置する教育用モデルです。実OSのアロケータを完全に再現するものではありません。
セグメントは、まとまった連続領域が必要。
全領域を配置できました。可変長の領域を途中で解放すると穴が残り、外部断片化の原因になります。
| 領域 | 要求サイズ | 割当 | 余り |
|---|---|---|---|
| A | 3 | 0, 1, 2 | 0 |
| B | 5 | 3, 4, 5, 6, 7 | 0 |
| C | 2 | 8, 9 | 0 |
| D | 4 | 10, 11, 12, 13 | 0 |
| E | 6 | 14, 15, 16, 17, 18, 19 | 0 |
10. メモリ共有とアクセス保護
セグメンテーションはコード領域・データ領域のような意味のある境界を表現しやすいのが特徴です。しかし現代のページングでも、ページテーブルの権限ビットを使って読み取り・書き込み・実行の制限を与えられます。また、異なるプロセスの仮想ページを同じ物理ページ枠へ対応付けることで、共有ライブラリや共有メモリを実現できます。
したがって「論理的な保護や共有に向く」という伝統的なセグメンテーションの特徴と、「ページングでは不可能」という断定は区別する必要があります。
11. 領域の拡張はページングでも可能
動的にメモリを増やすプログラムは珍しくありません。ページングでは1ページのサイズは固定でも、ページテーブルに新しいページを追加すれば利用可能な領域全体のサイズは増やせます。セグメンテーションの可変長という特徴は、区画のサイズ自体が論理単位で異なる、という意味です。
12. 関連技術:ページフォールトとスラッシング
固定長ページで外部断片化を避けられても、RAMが不足すれば問題は残ります。必要なページがRAMになければページフォールトが起こり、ディスクなどから読み込みます。入替えが多発して処理能力が落ちる現象をスラッシング(Thrashing、スラッシング)と呼びます。
ページングの長所は「断片化をなくしてどんな状況でも速くすること」ではなく、「離れた固定長の物理ページ枠を柔軟に利用できること」です。
13. ほかの方式と共存することもある
アーキテクチャによっては、セグメントによる論理的な区分とページングを組み合わせるページ化セグメンテーションがあります。現代の汎用OSでも、プロセスのアドレス空間をコード・ヒープ・スタックといった論理的領域として管理しながら、最終的な物理メモリ配置にはページングを利用することがあります。名前だけで「完全に二者択一」と思わないことが重要です。
14. 設問で原理を確認する
今回の設問は「仮想記憶方式において、セグメンテーション方式と比較した場合のページング方式の長所」です。選択肢の重要部分と原理を対応させてみましょう。
| 選択肢 | 記述の要点 | 考え方 |
|---|---|---|
| ア | 論理的単位でのアクセス保護 | セグメント方式が得意とする特徴。ただしページングでもページ単位の保護は可能 |
| イ | プログラム間での記憶領域の共用 | セグメント方式の説明として扱われるが、ページングでも共有は実現できるため、決定的な違いではない |
| ウ | 実行時に記憶領域の大きさを動的変更 | セグメントは可変長。ただしページングでもページ数を増やすことで領域は拡張できる |
| エ | 主記憶の外部断片化が発生しない | 固定長ページを離れた枠へ置けるので、この比較では最も明確な長所 |
15. 知識を定着させる3つの問い
- 空きが3KiBと5KiBに分かれたメモリに、連続6KiBのセグメントを配置できますか。
- 4KiBページを使って9KiBを割り当てた場合、最後のページの余りは何KiBですか。
- ページングでは外部断片化を避けられるのに、なぜスラッシングは発生し得るのでしょうか。
答えは順に「置けない」「3KiB」「空き枠の管理方式と、必要なページがRAMに収まるかどうかは別問題だから」です。