ページを最初にまとめて読まず、実際に必要になった時点で読み込む方式。
デマンドページング(要求時ページング)とは、プログラム開始時に全ページを読み込まず、実際にアクセス(要求)された時点で初めてそのページを補助記憶から主記憶へ読み込む方式のことです。「demand(要求)」があってから運ぶ、という名前です。
身近な例で考えると、分厚い参考書のうち、今読むページだけをコピーして机に置くやり方に似ています。本全体(=補助記憶のページ)はそのまま棚に残し、実際に必要になったページだけを手元(=主記憶)に持ってくるイメージです。
上のツールで▶ボタンを押すと、起動直後は主記憶にページが無く、アクセスされたページだけが順次ロードされる様子を確認できます。
デマンドページングの動きは、ページフォールトを契機にした読み込みを繰り返すだけです。1ページ分の流れは次のとおりです。
・① 起動時:主記憶にはページをほぼ載せない
・② アクセス:プログラムがあるページを使おうとする
・③ ページフォールト:主記憶に無いので不在の割り込みが起きる
・④ ロード:そのページだけを補助記憶から読み込む
・⑤ 続行:読み込んだ後、処理を再開する
ここで大事なのは、一度も使われないページは最後まで読み込まれないという点です。上のツールでも、未使用のページは「空き」のまま残ります。
デマンドページングの利点は、「必要な分だけ運ぶ」ことから生まれる無駄のなさです。主な利点は次のとおりです。
・起動が速い:起動時に最初に使うページだけ読めばよいので、全部読み込むより速く動き出せる
・主記憶を節約できる:実際に使うページしか主記憶を占有しない
・無駄なロードを避ける:一度も使わないページは読み込まないので、ディスクの読み込みが減る
対照的な方式にプリページング(先読み)があります。これは「次に使いそうなページをまとめて先に読んでおく」やり方で、ページフォールトの回数を減らせる反面、予想が外れると使わないページまで読んでしまいます。デマンドページングは「使うと分かってから読む」点でこれと対照的です。
結論: デマンドページングを使うと、プログラム全体のサイズが主記憶(=物理的なメモリ)より大きくても動かせます。これを仮想記憶(バーチャルメモリ)と呼びます。
なぜそれが可能かというと、プログラムは「全ページを同時に使うわけではなく、そのとき実行している一部分だけを使う」からです。つまり次の流れです。
・主記憶には今使っているページだけを置く
・残りのページは補助記憶(SSDやHDDなど)に置いたまま
・別のページが必要になったら、古いページと入れ替えて読み込む
身近な例で言うと、小さな机(=主記憶)でも、必要な本を棚(=補助記憶)から入れ替えながら使えば、棚の本全部を読み終えられるのと同じです。机が小さくても本全体の情報にアクセスできるのは、一度に全部広げないからです。この仕組みのおかげで、OSは「メモリが実際より広い」かのようにプログラムに見せることができます。
ページフォールトが起きたとき、必ずページ置換(=主記憶上の古いページを追い出して新しいページを入れること)が起きるわけではありません。主記憶に空きフレームがあるかどうかで動きが変わります。
・空きフレームがある場合:そのままそのページを読み込んで枠に置けばよい
・枠が全部埋まっている場合:どれか1枚を追い出してから読み込む(これがページ置換)
どのページを追い出すかを決めるルールがページ置換アルゴリズム(=追い出すページの選び方のルール)です。代表例が次のページで学ぶLRU(最も長く使われていないページを追い出す)やFIFO(最初に読み込んだページから順に追い出す)です。追い出し方が下手だと、すぐまた同じページが必要になってフォールトが増え、処理が遅くなります。