仮想記憶
そのページがスワップ領域にあるなら、そのルーチンは「ページスワップ」と呼ばれる処理を実行して必要なページの内容を物理メモリに読み込む。
ページスワップ操作には一連の段階がある。まず、メモリ上のページを選択する。例えば、最近アクセスされておらず、なるべくならスワップ領域を含む何らかのディスクから読み込まれたままで変更されていないページを選択する(詳細はページ置換アルゴリズムを参照)。そのページが変更されている場合、その内容をスワップ領域に書き出す。次に必要とされている、例外発生時に参照しようとしていた仮想アドレスに対応するページの情報を読み込む。ページの読み込みが完了したら、その物理メモリの内容更新に応じて仮想アドレスから物理アドレスへの変換テーブルを更新する。ページスワップが完了すると、例外処理を完了し、元のプログラムの実行が例外発生箇所から再開されて何事もなかったかのように処理が続行される。
仮想ページに何も割り当てられていないために使用不可となっている可能性もある。そのような場合、未使用、あるいはスワップアウトして未使用にした物理ページを割り当て、OSによってはその内容をゼロクリアする。ページテーブルはそれに対応して更新され、上述の場合と同様にプログラムが再開される。
これを多重仮想記憶と呼ぶ。MMUは現に実行中のプロセスの仮想空間のみを認識する。コンテキストスイッチでプロセスを切り替える際、MMUに対して仮想アドレス空間の切り替えも指示する必要があるが、その方式はアーキテクチャによって様々である。
同じプログラムを実行するプロセスが複数存在する場合、多重仮想記憶ではそれぞれが同じ仮想アドレスに実行ファイルをマッピングしていながら、それぞれ独立した仮想空間を使用する。このため、実行ファイルを配置する仮想アドレスはどのプロセスでも同じにすることができ、実行ファイル自体に配置すべきアドレスを格納しておくようになっているのが一般的である。また、それぞれのプロセスが実行ファイルのテキストセグメントをマッピングするのに使う物理メモリは共有することができる。他にも mmap() でファイルをマッピングする場合や共有メモリ機能でプロセス間の通信を行う場合、マッピングされる物理メモリが共有される。
なお、アーキテクチャによっては、多重仮想記憶がオーバーラップしていると捉えず、全仮想空間がフラットに並んだ巨大な仮想空間を想定することもある。この場合、仮想空間識別番号が巨大な仮想空間のアドレスの一部と考えられる。もっとも、これは単にモデル化の手法が違うだけで実装に大きな違いがあるわけではない。実際、各ユーザープロセスが自分の仮想空間識別番号以外の仮想空間にアクセスすることはできない。