ページングの種類
コンピュータのメモリ管理において、ページングは重要な技術の一つです。ページングは、仮想メモリ空間を「ページ」と呼ばれる固定長のブロックに分割し、物理メモリ(主記憶装置)も同サイズの「ページフレーム」に分割して管理する仕組みです。
このしくみには「ページング方式」と「セグメント方式」という2種類の方式があり、ページング方式は、移動するメモリ自体の大きさが固定されていて、セグメント方式は可変であるという違いがあります。
ページング方式の種類
ページング方式には、大きく分けて以下の3つの種類があります。
種類 | 説明 |
---|---|
1段ページング方式 | ページテーブルが1つしかないシンプルな方式。アドレス変換が高速だが、大きな仮想メモリ空間を扱うにはページテーブルが巨大になる。 |
2段ページング方式 | ページテーブルを複数階層にすることで、1つのページテーブルが巨大になることを防ぐ方式。アドレス変換に時間がかかる。 |
逆ページテーブル方式 | 物理メモリ上の各ページフレームに対応するエントリのみを持つページテーブルを使用する方式。メモリ使用量が少なくなるが、ページテーブルの検索に時間がかかる。 |
各ページング方式のコード例
1段ページング方式
// ページテーブルの例(仮想ページ番号をインデックスとする配列)
int pageTable[NUM_PAGES];
// アドレス変換
int physicalAddress = pageTable[virtualAddress / PAGE_SIZE];
2段ページング方式
// ページテーブルの例(2次元配列)
int pageTable[NUM_PAGE_DIRECTORY_ENTRIES][NUM_PAGE_TABLE_ENTRIES];
// アドレス変換
int pageDirectoryIndex = virtualAddress / (PAGE_DIRECTORY_SIZE * PAGE_SIZE);
int pageTableIndex = (virtualAddress % (PAGE_DIRECTORY_SIZE * PAGE_SIZE)) / PAGE_SIZE;
int physicalAddress = pageTable[pageDirectoryIndex][pageTableIndex];
逆ページテーブル方式
// ページテーブルのエントリの構造体
struct PageTableEntry {
int virtualPageNumber;
// その他の情報
};
// ページテーブルの例(配列)
PageTableEntry pageTable[NUM_FRAMES];
// アドレス変換
// 線形探索などを使用して、物理ページ番号に対応するエントリを検索
参考文献
- Wikipedia - ページング
- オペレーティングシステム 第3版
ページングに関するQ&A
Q1. ページングのメリットは?
A1. ページングのメリットは、物理メモリよりも大きな仮想メモリ空間を提供できること、プログラムを物理メモリ上に連続して配置する必要がないためメモリ使用効率が向上すること、メモリ保護機能が実現しやすいことなどがあります。
Q2. ページフォールトとは?
A2. ページフォールトは、CPUがアクセスしようとした仮想ページが物理メモリ上に存在しない場合に発生する例外処理です。ページフォールトが発生すると、OSが二次記憶装置から必要なページを読み込みます。
Q3. ページング方式の選び方は?
A3. ページング方式の選び方は、システムの要件や制約によって異なります。例えば、メモリ空間が大きく、アドレス変換のオーバーヘッドを最小限に抑えたい場合は、多段ページング方式が適しています。逆に、メモリ使用量を最小限に抑えたい場合は、逆ページテーブル方式が適しています。
その他の参考記事:bootstrap5 ページネーション