まず、新しい概念として仮想アドレススペースを説明する必要があります。仮想アドレススペースはアプリケーションに対して使用できるアドレススペースの最大量です。仮想アドレススペースはシステムのアーキテクチャやオペレーティングシステムにより異なります。アドレスする目的のために使用できるビット数を定義するのがアーキテクチャですから、仮想アドレススペースはアーキテクチャによって決まります。また、オペレーティングシステムが実装された方法によりアーキテクチャで課される制限にさらに制限が加えられることがあるため、仮想アドレススペースはオペレーティングシステムによっても左右されます。
仮想アドレススペースの"仮想"とは、アプリケーションに対して使用できる独自にアドレス可能なメモリの場所の合計のことですが、物理的なメモリの量ではありません、またシステムにインストールされているものでもなく、アプリケーション専用でもありません。
先の仮定でのアプリケーションの場合、仮想アドレススペースは 15000 バイトです。
仮想メモリを実装するには、コンピュータシステムに特殊なメモリ管理ハードウェアが必要となります。このハードウェアは MMU (Memory Management Unit)と呼ばれています。MMU がないと、CPU が RAM にアクセスしたときに実際の RAM の場所が変更されません — メモリアドレス 123 は常に RAM 内の物理的に同じ場所になります。
ただし、MMU があればメモリアドレスは各メモリアクセスの前に変換ステップを行います。つまり、メモリアドレス 123 はあるときは物理的なアドレスの 82043 にダイレクトされ、あるときは 20468 にダイレクトされる可能性があると言うことです。これが行なわれると、何億というメモリバイトの仮想メモリから物理メモリへの各トラッキングのオーバーヘッドがあまりに多すぎてしまいます。かわりに、MMU は RAM をページ毎に分割します — MMU が処理する固定サイズのメモリの連続セクションが 1 つのエンティティになります。
これらのページとそのアドレス変換の追跡は混同を招く不必要で余計な手順のように見えますが、仮想メモリを実装するためには非常に重要なことになります。その理由として次の点を考えてみてください。
先の 15000 バイトの仮想アドレスを持つアプリケーションを例にして、そのアプリケーションの最初の命令がアドレス 12374 に保存されているデータにアクセスすると仮定します。ただし、コンピュータには物理 RAM が 12288 バイトしかないとします。CPU がアドレス 12374 にアクセスしようとするとどうなるでしょうか。
ページフォルトと呼ばれる現象が起ります。
ページフォルトは、プログラムがアドレススペースにはあるがシステムの RAM には現在ないデータ(またはコード)にアクセスしようとすると起きるイベントの連続です。オペレーティングシステムは何らかの方法でアクセスされたデータメモリを常駐にして、プログラムがページフォルトは起らなかったかのように動作を続行できるようにすることでページフォルトを処理する必要があります。
先のアプリケーションの場合、CPU がまず MMU に対して目的のアドレスを示します。しかし、MMU はこのアドレスに対する変換先がありません。従って、CPU 割り込みをしてページフォルトハンドラと呼ばれるソフトウェアが実行されるようにします。ページフォルトハンドラはこのページフォルトを解決するために行うべきことを判別します。
目的のページがディスクのどこに常駐しているかを検索してそれを読み込みます(これは通常ページフォルトがコードのページである場合)
目的のページがすでに RAM にあるか判別し(ただし、現在のプロセスに割り当てられていない)、MMU がそれをポイントするよう再設定します。
ゼロしか含んでいない特殊なページをポイントし、プロセスが特殊なページに書き込みしようとする場合のみこのプロセスに新しいページを割り当てます(copy on writeページと呼ばれ、ゼロに初期化されたデータを含むページによく使用されます)
どこか別の場所から目的のページを取得します(これについては後ほど詳しく説明します)
最初の 3 動作は比較的単純ですが、最後の動作はもう少し説明する必要があります。
現在、特定のプロセス専用の物理的なメモリページ群はそのプロセスのワーキングセットと呼ばれます。ワーキングセット内のページ数はシステム全体で総体的に利用できるページにより増減することができます。
ワーキングセットはプロセスがページフォルトを起こすにつれて増加していきます。また、空きページが少なくなるほど減少していきます。完全にメモリがなくなってしまわないよう、ページをプロセスのワーキングセットから削除して、後で使用できるように空きページにする必要があります。オペレーティングシステムは次ぎのようにしてプロセスのワーキングセットを少なくします。
変更されたページを大容量ストレージデバイス上の専用エリアに書き込む(一般的にはスワッピングまたはページングと呼ばれる)
変更されていないページを空白としてマークする(このページは変更していないのでディスクに書き込む必要はない)
すべてのプロセスに適切なワーキングセットを確定するためには、オペレーティングシステムがすべてのページの使用情報を追跡していなければなりません。このように、オペレーティングシステムは活発に使用されている(また、メモリ常駐でなければならない)ページとそうではない(つまり、メモリから削除できる)ページを判別します。ほとんどの場合、ある種のごく最近使用されたアルゴリズムはプロセスのワーキングセットから削除できるページを判別します。
スワッピング(変更されたページをシステムの swap スペースに書き込む)は正常なシステム動作の一部ですが、スワップ動作が多すぎる場合があります。過剰なスワップについて注意しなければならないのは、次のような状態が簡単にそして繰り返して起る可能性があるからです。
1つのプロセスからの複数ページがスワップされる
プロセスが実行可能となり、スワップされたページにアクセスしようとする
そのページがページフォルトされてメモリに戻される(他のプロセスのページをスワップアウトさせてしまう場合が多い)
暫くしてから、そのページが再びスワップされる
この連続イベントが広がると、スラッシングと呼ばれ、現在の負荷に 十分な RAM がないことを示しています。こうした状況で生成される CPU と I/O 負荷はシステムの実際の動作で課される負荷を急激に上回ってしまうため、スラッシングはシステムのパフォーマンスを極度に低下させてしまいます。極端な場合では、システムが実際に有用な動作をしなくなり、リソースすべてをメモリからのページの出し入れに費してしまうことがあります。