株式会社ジオデータ開発 ロゴ
株式会社ジオデータ開発GEO DATA DEVELOPMENT Inc.

OPERATING SYSTEMS / MEMORY MANAGEMENT

ページングとセグメンテーションを図解|外部断片化・内部断片化・仮想記憶

容量は空いているのに、どうして置けない? メモリを区切る単位の違いから、OSの設計思想を読み解きます。

1. 本棚の空きスペースから考える

高さが異なる本を「同じ本のまとまり」で収納すると、間に少しずつ隙間ができます。棚全体の空きが十分でも、厚い本をまとめて入れる幅が残らないことがあります。これが外部断片化を理解する入口です。

一方、すべての本を同じ大きさの箱に入れれば、箱を棚のどこに置いても構いません。「6箱必要」なら、連続した場所ではなく空いている6か所へ分けて置けます。この発想がページングです。ただし箱の中に少し空きができる欠点もあります。

2. なぜOSがメモリを区切るのか

プログラムには命令、データ、スタックなどさまざまな情報があります。実際のRAMは有限で、複数のプロセスが共有します。どのプログラムがどの場所を使うか管理し、ほかのプログラムの領域を勝手に触らせない仕組みが必要です。

そこで各プロセスには仮想アドレス空間を見せ、OSとハードウェアが実際の物理メモリの場所へ対応付けます。論理的なアドレスと物理的な位置を分離すると、プログラムはRAM上の配置を意識せず実行できます。

3. セグメンテーション:意味に沿って分ける

セグメンテーション(Segmentation、セグメンテーション)は、コード・データ・スタックなど論理的な意味を持つ可変長の領域に分ける方式です。古典的な単純セグメンテーションでは、各セグメントの開始位置(base)と長さ(limit)を管理します。

コード領域
機械語の命令
データ領域
変数・定数
スタック領域
関数呼出し

たとえばコードは「読み取り・実行可、書き込み不可」、データは「読み書き可」のように、意味に合わせた保護と共有を考えやすくなります。反面、可変長のセグメントを物理メモリに連続配置する設計では、空き領域が細切れになり得ます。

4. ページング:意味と無関係に固定長で分ける

ページング(Paging、ページング)は、仮想アドレス空間を固定長のページ(page)に分け、物理RAM側も同じ大きさのページ枠(page frame、フレーム)に分ける方式です。ページがRAMのどの枠に置かれるかは、ページテーブルで対応付けます。

同じサイズの枠であれば、データの一部分を物理メモリ上のどこに置いてもよいため、通常の固定長ページングでは外部断片化は発生しません。これが今回の中心となる長所です。

同じ「空き8マス」でも、置けるかどうかが違う
可変長のセグメント:連続6マスが必要
A
A
·
·
·
B
B
·
·
·
·
·

空きは3+5=8マス。しかし最大の連続空きは5マス。6マスのセグメントを置けない。

固定長のページ:2マス単位で分割
使用中
空き
使用中
空き
空き
空き

6マスのデータは2マスのページ×3個に分け、離れた3枠へ配置できる。

模式図です。各マスとページ枠の大きさは例示用で、実際のOSの物理メモリ配置を示すものではありません。

5. 外部断片化はなぜ起きるのか

連続領域しか使えない方式を考えます。メモリにA・B・Cが配置され、Bが終了すると、その場所だけ穴が開きます。別のプログラムが開始・終了を繰り返すと、空き容量が点在します。

例えば「空き3マス」と「空き5マス」が別々にあっても、必要なのが連続6マスなら割り当てられません。この状況では合計8マス空いている事実は助けになりません。外部断片化の改善には、領域を移動して空きをまとめるコンパクション(compaction、圧縮・詰め直し)などが考えられますが、移動コストや参照更新の負担があります。

6. 固定長でも内部断片化は残る

ページサイズが4KiBで、プログラムのあるデータが9KiB必要なら、ページは3個必要で合計12KiBを確保します。最後のページの3KiBは未使用になります。これが内部断片化です。

4KiB 使用
4KiB 使用
1KiB 使用 / 3KiB 余り

9KiBを保存するために12KiB分のページ枠を使った例。ページサイズを小さくすれば平均的な余りは減りやすいものの、管理するページ数やページテーブルが増えます。

7. アドレス変換はどう動く?

CPUが仮想アドレスを出すと、MMU(Memory Management Unit、メモリ・マネジメント・ユニット:メモリ管理ユニット)がページ番号とページ内の位置に分けます。ページテーブルを使ってページ番号を物理ページ枠番号へ変換し、ページ内の位置はそのまま使います。

仮想アドレスを物理アドレスへ変換する流れ
CPU
仮想ページ番号2
ページ内オフセット100
→
MMU
ページテーブルを参照
2 → 物理枠7
→
RAM
物理枠7 + 100
ページサイズ 4096B の例:物理アドレス = 7 × 4096 + 100 = 28772

実際にはTLB(Translation Lookaside Buffer、トランスレーション・ルックアサイド・バッファ)というアドレス変換のキャッシュを利用して、毎回ページテーブルを辿る負荷を減らします。ページがRAMにない場合はページフォールトが起こり、必要に応じてページを読み込みます。

8. 方式を比較する

観点単純セグメンテーションページング
分割単位コード・データなど意味を持つ可変長領域意味と無関係な固定長ページ
物理配置古典的な単純方式では各領域に連続した空きを要求ページごとに離れた枠へ配置可能
断片化外部断片化が起こり得る通常、外部断片化なし。内部断片化はあり得る
保護と共有セグメント単位で論理的に扱いやすいページ単位でアクセス権や共有を設定可能
大きさの変更論理領域は可変長。ただし配置し直しが必要なこともページの大きさは固定でも、ページ数を増減して領域の規模を変えられる

9. ラボ:実際に配置してみる

メモリ容量とページサイズ、配置するデータの大きさを変えてください。可変長では連続した領域が必要で、固定長ではページ単位に分割できる違いが分かります。厳密な「穴」の発生は上の図に示し、ラボは再配置した際の各方式の配置効率を扱います。

メモリ配置シミュレーター

容量を1マス=1単位として、A〜Eの領域を先頭から配置します。チェックを外すとその領域を解放した状態にし、残った領域を先頭から再配置する教育用モデルです。実OSのアロケータを完全に再現するものではありません。

物理メモリ(左からアドレス順)
A
A
A
B
B
B
B
B
C
C
D
D
D
D
E
E
E
E
E
E
·
·
·
·

セグメントは、まとまった連続領域が必要。

要求データ
20単位
空き
4単位
最大の連続空き
4単位
内部断片化
0単位

全領域を配置できました。可変長の領域を途中で解放すると穴が残り、外部断片化の原因になります。

領域要求サイズ割当余り
A30, 1, 20
B53, 4, 5, 6, 70
C28, 90
D410, 11, 12, 130
E614, 15, 16, 17, 18, 190

10. メモリ共有とアクセス保護

セグメンテーションはコード領域・データ領域のような意味のある境界を表現しやすいのが特徴です。しかし現代のページングでも、ページテーブルの権限ビットを使って読み取り・書き込み・実行の制限を与えられます。また、異なるプロセスの仮想ページを同じ物理ページ枠へ対応付けることで、共有ライブラリや共有メモリを実現できます。

したがって「論理的な保護や共有に向く」という伝統的なセグメンテーションの特徴と、「ページングでは不可能」という断定は区別する必要があります。

11. 領域の拡張はページングでも可能

動的にメモリを増やすプログラムは珍しくありません。ページングでは1ページのサイズは固定でも、ページテーブルに新しいページを追加すれば利用可能な領域全体のサイズは増やせます。セグメンテーションの可変長という特徴は、区画のサイズ自体が論理単位で異なる、という意味です。

12. 関連技術:ページフォールトとスラッシング

固定長ページで外部断片化を避けられても、RAMが不足すれば問題は残ります。必要なページがRAMになければページフォールトが起こり、ディスクなどから読み込みます。入替えが多発して処理能力が落ちる現象をスラッシング(Thrashing、スラッシング)と呼びます。

ページングの長所は「断片化をなくしてどんな状況でも速くすること」ではなく、「離れた固定長の物理ページ枠を柔軟に利用できること」です。

13. ほかの方式と共存することもある

アーキテクチャによっては、セグメントによる論理的な区分とページングを組み合わせるページ化セグメンテーションがあります。現代の汎用OSでも、プロセスのアドレス空間をコード・ヒープ・スタックといった論理的領域として管理しながら、最終的な物理メモリ配置にはページングを利用することがあります。名前だけで「完全に二者択一」と思わないことが重要です。

14. 設問で原理を確認する

今回の設問は「仮想記憶方式において、セグメンテーション方式と比較した場合のページング方式の長所」です。選択肢の重要部分と原理を対応させてみましょう。

選択肢記述の要点考え方
ア論理的単位でのアクセス保護セグメント方式が得意とする特徴。ただしページングでもページ単位の保護は可能
イプログラム間での記憶領域の共用セグメント方式の説明として扱われるが、ページングでも共有は実現できるため、決定的な違いではない
ウ実行時に記憶領域の大きさを動的変更セグメントは可変長。ただしページングでもページ数を増やすことで領域は拡張できる
エ主記憶の外部断片化が発生しない固定長ページを離れた枠へ置けるので、この比較では最も明確な長所

15. 知識を定着させる3つの問い

  1. 空きが3KiBと5KiBに分かれたメモリに、連続6KiBのセグメントを配置できますか。
  2. 4KiBページを使って9KiBを割り当てた場合、最後のページの余りは何KiBですか。
  3. ページングでは外部断片化を避けられるのに、なぜスラッシングは発生し得るのでしょうか。

答えは順に「置けない」「3KiB」「空き枠の管理方式と、必要なページがRAMに収まるかどうかは別問題だから」です。