ページングとセグメンテーションは、コンピューターのストレージディスクにデータを保存し、そこから取り出すためのプロセスです。ページングは、ストレージ上の場所を追加のメモリとしてコンピューターの中央処理装置(CPU)に提示する、コンピューターメモリ管理機能です。この追加のメモリは仮想メモリと呼ばれます。セグメンテーションは、コンピューターのストレージ内に関連データ用の可変サイズのアドレス空間(セグメント)を作成する仮想的なプロセスです。
ページングはデータの各部分にストレージアドレスを割り当てる一方、セグメンテーションはストレージからのデータ取得を高速化します。限られたRAMだけに効率よく依存できるシステムはありません。そのため、コンピューターのメモリ管理ユニット(MMU)は、ハードディスクドライブ(HDD)やソリッドステートドライブ(SSD)などのストレージドライブを仮想メモリとして利用し、RAMを補います。コンピューターメモリの管理は、基本的でありながら重要なオペレーティングシステム機能です。このページングとセグメンテーションのガイドでは、それぞれの技術のメリットとデメリットを含め、両者の違いを詳しく説明します。
ページングとセグメンテーションの主な違い
ページングとセグメンテーションはいずれもコンピューターメモリの重要な構成要素ですが、メモリの割り当て方法が異なり、発生しやすいフラグメンテーションの問題も異なります。
| ページング | セグメンテーション | |
|---|---|---|
| サイズ | システムでは、ページとフレームに固定サイズのブロックが使われます。ページやフレームのサイズはコンピューターハードウェアによって決まります。 | セグメントのサイズは可変で、システムのユーザーが指定します。 |
| フラグメンテーション | 旧式のシステムでは、ページ全体をメモリに割り当てないことで内部フラグメンテーションが発生していました。最新のオペレーティングシステムでは、この問題は解消されています。 | セグメンテーションでは外部フラグメンテーションが発生します。 |
| テーブル | ページテーブルは、ページの場所と状態をMMUに伝えます。これはセグメンテーションテーブルより遅い処理ですが、TLBメモリキャッシュによって高速化されます。 | セグメンテーションテーブルにはセグメントIDと情報が含まれ、ページテーブルを直接検索するよりも高速です。 |
| 利用可能性 | CPU上およびMMUチップとして広く利用できます。 | Windowsサーバーでは後方互換性のためにサポートされる場合がありますが、Linuxのサポートは非常に限定的です。 |
ページングとは?
ページングが発生すると、ストレージ上の場所が仮想メモリとしてCPUに提示されます。ページングのプロセスでは、ページテーブルに各ページの定義が保存されます。アクティブなプロセスがデータを要求すると、MMUは対応するページを物理メモリ内のフレームに取り込み、処理を高速化します。ページングのプロセスには、次のような要素があります。
- ページ:ディスク上にある、仮想メモリの固定長で連続したブロック
- フレーム:RAM内にある固定長で連続したブロックで、サイズはページと同一です
- 物理メモリ:コンピューターのランダムアクセスメモリ(RAM)で、通常はコンピューターのマザーボードに接続されたDIMMカードに搭載されています。
- 仮想メモリ:仮想メモリは、RAMをエミュレートするために確保されたHDDまたはSSDの一部です。MMUはディスク上の仮想メモリをCPUに提供し、物理メモリの負荷を軽減します。
- 仮想アドレス:CPUはアクティブな各プロセスに仮想アドレスを生成します。MMUは仮想アドレスをRAM内の物理的な場所にマッピングし、そのアドレスをバスに渡します。仮想アドレス空間とは、CPUの管理下にある仮想アドレスの範囲です。
- 物理アドレス:物理アドレスはRAM内の場所です。物理アドレス空間は、CPUの仮想アドレスに対応するすべての物理アドレスの集合です。物理アドレス空間とは、MMUの管理下にある物理アドレスの範囲です。

CPUとコンピューターの物理メモリの間にページテーブルを置き、データにアドレスを割り当てることで、コンピューターのMMUは必要なときにいつでもそのデータを取得できるようにします。
ページングの仕組み
MMUはページテーブルを使って仮想アドレスを物理アドレスに変換します。各テーブルエントリには、ページの場所(RAM内か、仮想メモリとしてディスク上か)が示されます。テーブルには、アプリケーション用やセグメント用など、単一レベルまたは複数レベルのページテーブルを使用できます。
ただし、テーブルを常に検索するとMMUの処理速度が低下する可能性があります。これを補うため、Translation Lookaside Buffer(TLB)と呼ばれるメモリキャッシュに、仮想アドレスから物理アドレスへの最近の変換結果を保存し、迅速に取得できるようにします。多くのシステムには複数のTLBがあり、CPUとRAMの間や、複数レベルのページテーブル間など、異なる場所に配置される場合があります。
ページが大きいデータセットや小さいデータセットには、対応するサイズの異なるフレームを利用できます。一般的なサイズは4 KBから2 MBで、高性能サーバーではGBサイズのフレームも利用できます。
詳しくはオペレーティングシステムのメモリ管理をご覧ください。
ページングのメリット
ページングには、次のようなメリットがあります。
- プログラマーにとって、ページングは介入を必要としない透過的な機能です。
- ページングでは外部フラグメンテーションが発生せず、適切に更新されたオペレーティングシステムでは、内部フラグメンテーションの問題も発生しません。
- ページングのフレームは連続している必要がありません。
ページングのデメリット
旧式のシステムでは、ページングによって内部フラグメンテーションが発生します。かつては、隠れたフラグメンテーションと呼ばれる問題が、旧式のWindows環境で問題になっていました。この問題は内部フラグメンテーション、つまり隠れたフラグメンテーションでした。セグメンテーションで発生する深刻な外部フラグメンテーションとは異なり、すべてのフレームがページとまったく同じサイズでない場合に内部フラグメンテーションが発生します。これは最新のWindowsオペレーティングシステムでは問題になりませんが、旧式のシステムを使い続ける組織には影響します。
ページングはセグメンテーションよりメモリ検索に時間がかかります。ただし、TLBメモリキャッシュ、特にTLBを多数備えたシステムでは、この問題を軽減できます。
詳しくはディスクのフラグメンテーションと、それがストレージシステムにもたらす問題をご覧ください。
セグメンテーションとは?
セグメンテーションは、コンピューターシステム内にさまざまなサイズのアドレス空間(セグメント)を作成する仮想的なプロセスです。各セグメントは、プロセスオブジェクトに直接対応する異なる仮想アドレス空間です。セグメンテーションのプロセスには、CPU、セグメントの詳細を含むセグメントテーブル、物理メモリ、またはマザーボード上のコンピューターのRAMなど、さまざまな要素があります。

CPUと物理メモリの間にセグメントテーブルを置き、関連データをセグメントに割り当てることで、セグメンテーションはコンピューターの情報取得を高速化します。
セグメンテーションの仕組み
プロセスが実行されると、セグメンテーションは関連データをセグメントに割り当て、処理を高速化します。セグメンテーション機能は、セグメントの物理アドレスやサイズなどを含むセグメントテーブルを管理します。
各セグメントには、プロセスの主要な機能、データ構造、ユーティリティが格納されます。CPUは各プロセスとメモリブロックについて、セグメント識別情報とメモリの場所を含むセグメントマップテーブルを保持します。
CPUは実行中のプロセスに対して仮想アドレスを生成します。セグメンテーションは、CPUが生成した仮想アドレスを、固有の物理メモリの場所を指す物理アドレスに変換します。この変換は厳密な1対1対応ではなく、異なる仮想アドレスが同じ物理アドレスにマッピングされることもあります。
詳しくは物理アドレスと仮想アドレスをご覧ください。
セグメンテーションのメリット
セグメンテーションには、次のようなメリットがあります。
- セグメンテーションでは内部フラグメンテーションが発生しません
- セグメントテーブルはページテーブルに比べて使用するスペースが少なくて済みます
- セグメンテーションに必要な処理オーバーヘッドは、ページングより少なくて済みます。
- セグメンテーションでは、ディスク上の連続したアドレス空間よりも簡単にセグメントを再配置できます
- セグメントテーブルは使用するメモリが少なくて済みます
セグメンテーションのデメリット
セグメンテーションは高速で安全性の高いメモリ管理機能ですが、外部フラグメンテーションが克服困難な課題となりました。セグメンテーションでは外部フラグメンテーションが発生するため、最新のx86-64サーバーではレガシーアプリケーションとして扱われ、後方互換性のためにのみサポートされています。
外部フラグメンテーションは、使用できないメモリが割り当て済みのメモリブロックの外側に存在すると発生します。問題は、システムにプロセスの要求を満たすだけのメモリがあっても、利用可能なメモリが連続した場所にない場合があることです。時間が経つにつれてフラグメンテーションは悪化し、セグメンテーションの処理速度を大幅に低下させます。
Linuxは80×86マイクロプロセッサーでのみセグメンテーションをサポートしており、同じ一連のリニアアドレスを使うことでページングがメモリ管理を簡素化すると説明しています。セグメンテーションのサポートが限定的なため、Linuxを異なるアーキテクチャに移植するのは困難です。
結論:ページングとセグメンテーション
ページングとセグメンテーションはいずれも、コンピューターでストレージメモリを利用可能にするためのオペレーティングシステムの基本技術です。どちらもフラグメンテーションの影響を受けますが、ページングでは旧式のコンピューターで内部フラグメンテーションが発生し、セグメンテーションでは大規模な外部フラグメンテーションが発生します。これらのストレージ技術は、現在のストレージ速度と容量に対する要求が、多くのコンピューターシステムで処理できる範囲を上回っていることを示す方法のほんの2例にすぎません。