ページングとは

ページング機構は、メモリー管理方式の一種で、多くのCPUに採用されていて80系のCPUでは80386から採用されました。ページング機構は、オペレーティングシステムに密接に関係しており、仮想記憶、デマンドページング、コピーオンライトと言った機能を行うために不可欠な機能と言えるでしょう。

セグメント方式とページング方式

メモリー管理のもう一つの方式として、セグメント方式があります。セグメント方式では、物理メモリを任意の大きさに区切り管理する方法です。これとは異なり、ページング方式は物理メモリーを任意の固定サイズに区切り管理する方法です。

セグメント方式とセグメント方式の違い
セグメント方式とセグメント方式の違い

物理ページと論理ページ

ページング方式では、物理ページをタスク(プロセス)単位の論理ページとして割り当てることができます。論理ページは、タスク(プロセス)毎に独立して設定することができ、設定したページはどのタスクからも0番地から始まるアドレスを占有しているように使うことが出来ます。また、割り当てる物理ページは連続している必要はなく、不連続な物理メモリーを連続した論理メモリーとしてアクセスする事が出来ます。

論理ページ
論理ページ

論理ページとして割り当てた場合、他のタスク(プロセス)のメモリをアクセスすることが出来ないので、タスク(プロセス)が暴走した時も、他のタスク(プロセス)のメモリに影響を与えることが無くなります。

デマンドページング

デマンドページング [demand paging] とは、物理ページと論理ページの割り当てを、すぐには行わずに論理ページにアクセスが発生した時に物理ページの割当てを行う方式で、これを行うことにより物理メモリーの使用効率を効果的に行えます。

例えば、ヘルプだけを表示する為にコマンド実行した場合、全てのプログラムをメモリーに読込んでも実行されるコードは極僅かな範囲でしかありません。これではメモリとディスクからに読出しにかかる時間の無駄な消費です。デマンドページングでメモリを割当てを行った場合、実行する部分のページだけが物理メモリから割当てられる事になりますから、効率的にメモリを使用する事が出来ます。

デマンドページングの例
デマンドページングの例

ページフォルト

デマンドページングは、アクセスが発生した時に物理ページの割当てを行うと言うことでしたが、これを行う為には「割当てを行っていないメモリにアクセスが発生した」事が検出、出来ないといけません。この検出を行うため、多くのCPUはページフォルトを通知する手段を何らかの形で持っています。

例えば、i386系のCPUでは、割当てを行っていないメモリにアクセスが発生した場合、ページフォルト例外と言う割込みが発生します。OSはこの割込みをトリガーに、ページの割当て処理を行うことになります。

仮想記憶

デマンドページングの機能とディスク等の補助記憶装置を組み合わせる事により、実メモリ以上のメモリ空間を作ることが出来ます。これを仮想記憶と言います。

仮想記憶は次のような手順で実現することができます。

  1. タスク(プロセス)が多く実行されると、物理ページが不足する。
  2. 物理ページが不足して、タスクへの論理ページが割当てられ無い場合、比較的使われていない物理ページ(これをPage Cとします)を補助記憶装置に待避する(ページアウト)。
  3. そして、待避し未使用になった物理ページ(page 1)を要求があったページに割当てる。
  4. もし、Page Cが必要になった場合、Pgae Aをページアウトし、未使用な状態になった所でPage Cのデータを補助記憶装置から読み戻します(ページイン)
仮想記憶の仕組み
仮想記憶の仕組み

ページアウトするページの選択方法

仮想記憶の実装はOSに依存するため、ページアウトの方法もOSにより異なりますが、「あまり使われない・将来使われる可能性が低いページ」を予測しページアウトするのが理想的です。これらを予測するアルゴリズムが幾つか存在します。

FIFO(Fast In Fast Out)
古く確保された順にページアウトする。実装は簡潔ですが、古く確保されたからと言ってアクセス頻度が低いとは限らず、すぐページインする可能性がある。
LRU(Least Recently Used)
アクセスされない時間が最も多いページをページアウトする。アルゴリズムが複雑になる。
NRU(Not-Recently Used)
ある時間、アクセスされないページをページアウトする。比較的実装が簡単
Last modified: Fri May 09 17:47:42 2008 JST