物理メモリより大きなアドレス空間を、補助記憶を併用して見せかける仕組み。
仮想記憶とは、物理メモリ(主記憶)より大きなアドレス空間を、補助記憶(=ハードディスクやSSD)を併用してプログラムに見せかける仕組みのことです。実際の主記憶が小さくても、大きなメモリがあるかのように振る舞えます。
身近な例で考えると、机と引き出しの関係に似ています。机(主記憶)は狭いので、いま使う書類だけを広げ、当面使わない書類は引き出し(補助記憶)にしまいます。必要になったら引き出しから出して机に置きます。こうすれば狭い机でも大量の書類を扱えます。
上のツールで▶ボタンを押すと、プログラムが仮想アドレスを使い、変換を経て物理メモリや補助記憶へたどり着く流れを確認できます。
プログラムが使う仮想アドレスは、そのままでは物理メモリにアクセスできません。間に変換のしくみが入ります。
・ページテーブル:仮想ページと物理フレーム(=メモリ上の枠)の対応を記録した表。
・MMU(メモリ管理ユニット):この変換を高速に行う専用のハードウェア。
参照したいページが物理メモリ上にあれば、変換した物理アドレスへすぐアクセスできます。これをヒットと呼びます。逆にまだ補助記憶にしかない場合はページフォールト(=ページ不在の例外)が起き、OSが補助記憶から物理メモリへページを読み込んでから処理を続けます。上のツールのSTEP3〜5で、この2パターンを確認できます。
仮想記憶には主に次の利点があります。
・物理メモリより大きなプログラムを実行できる:使う部分だけ主記憶に置けばよいため、メモリ容量の制約を超えられます。
・各プロセスに独立した空間を与え保護できる:プロセス(=実行中のプログラム)ごとに専用の仮想空間を持つので、他のプロセスのメモリを誤って壊しません。
・メモリの断片化を緩和:ページ単位で物理上のどこへでも置けるため、空きを連続させる必要がありません。
これらの利点のおかげで、現代のパソコンやスマートフォンのOS(基本ソフト)はほぼすべて仮想記憶を採用しています。複数のアプリを同時に安全に動かせるのは、この仕組みのおかげと考えると分かりやすいです。上のツールの最終ステップで、小さな物理メモリで大きな空間を実現する様子を確認できます。
なぜ物理メモリ(主記憶)より大きなプログラムを動かせるのか。答えは「プログラムの全ページを一度にメモリへ置かなくてよい」からです。
仮想記憶では、プログラムをページ(=一定サイズのかたまり)に細かく分けて管理します。
・今使っているページだけを物理メモリ(主記憶)に置く
・しばらく使わないページは補助記憶(ディスク)に退避させておく
・アクセスが来たページがメモリにない場合はページフォールトが起き、OSがディスクからメモリへ読み込む
この「必要なものだけ手元に置く」という考え方をデマンドページング(=要求があったときにページを読み込む方式)と呼びます。机の上に今使う書類だけ広げ、残りは棚にしまっておく状態に似ています。棚(ディスク)は机(メモリ)より大きいので、机が狭くても大量の書類(プログラム)を扱えるのです。
なぜアドレス変換が必要なのか。プロセス(=実行中のプログラム)がそれぞれ「0番地から始まる自分だけのメモリ空間」を持てるようにするためです。
変換がない場合、プロセスAが0番地に書き込んだデータをプロセスBが上書きしてしまう可能性があります。仮想記憶では、各プロセスに独立した仮想アドレス空間(=仮想の番地体系)を与えます。
・プロセスAの「仮想0番地」は物理メモリの場所Xへ
・プロセスBの「仮想0番地」は物理メモリの場所Yへ(別の場所)
この変換を担うのがページテーブル+MMU(メモリ管理ユニット=変換専用のハードウェア)です。MMUはプログラムが仮想アドレスを使うたびに瞬時に物理アドレスへ変換します。この仕組みのおかげで、複数のプログラムが互いに干渉せず、同時に安全に動けるのです。