仮想メモリ — 机が足りなければ床に下ろす
机の上に置ける書類は4冊まで。でも仕事で使う資料は8冊ある――そんなとき人は、いま使わない資料を床(や棚)に下ろして、必要になったら机に戻します。OSがやっている仮想メモリも、まったく同じ片付けです。机が物理メモリ(RAM)、床がスワップ領域(ディスク)にあたります。
プログラムから見えるアドレスは仮想アドレスで、実際にRAMのどこにあるかは知りません。その対応表がページテーブルです。下の図1で仮想ページをクリックして「アクセス」してみてください。机に載っていれば一瞬、載っていなければページフォルトが起きて、古い1枚を床に下ろしてから読み込みます。
ページフォルトは「エラー」ではない
触ろうとしたページがRAMにない状態をページフォルトと呼びます。名前は物騒ですが異常ではなく、OSに「持ってきて」と頼む正規の合図です。CPUはページテーブルのvalidビットが0なのを見て処理を中断し、OSがディスクから該当ページをフレームへ読み込み、対応表を書き換えてから、何事もなかったように続きを実行します。プログラムは中断に気づきません。
ただしディスクはRAMより桁違いに遅い。だからフレームが満杯のときにどのページを追い出すか(ページ置換)が効いてきます。図1では「いちばん長く使っていないものを追い出す」LRU方式で動かしています。ここで選択を誤り、追い出した直後にまたそのページを触る――が延々と続くと、実処理よりスワップ入れ替えに時間を使うスラッシングに陥ります。メモリ不足のサーバーが「CPUは暇なのに異常に遅い」状態になるのは、たいていこれです。
- ページ / フレーム
- 仮想メモリを固定長(よく4KB)に区切った単位がページ。RAM側の受け皿がフレーム。
- ページテーブル
- 仮想ページ→物理フレームの対応表。プロセスごとに持つ。valid=0ならRAMにない。
- ページフォルト
- アクセスしたページがRAMにないこと。OSがディスクから読み込んで処理を再開する。
- スワップ
- RAMに載りきらないページをディスクへ退避すること。広いが非常に遅い。
- スラッシング
- スワップの出し入ればかりが起き、処理がほとんど進まなくなる状態。
まとめ
仮想メモリは「アドレスの見え方」と「実際の置き場所」を切り離す仕組みです。プログラムは連続した仮想アドレスを使い、ページテーブルがそれを実際のフレームへ翻訳する。RAMが足りなければ、使っていないページをスワップへ下ろして枠を空ける――だから物理メモリより大きなプログラムも動きます。代償はページフォルト時のディスクアクセスで、これが多発するとスラッシングになる。「速いRAMを、賢い片付けで広く見せている」と捉えるのがいちばん近い理解です。