ページ置換アルゴリズムの計算ツール

仮想記憶で、物理メモリのページ枠がいっぱいのときにどのページを追い出すかを決めるページ置換アルゴリズムの動きを、参照ごとの表で示します。FIFO・LRU・OPT・Clockを切り替えて、ページフォルトの回数とヒット率を比べられます。試験でよく出る「ページフォルトは何回起きるか」という問題の答え合わせにも使えます。

参照列とページ枠

結果

ページフォルトの回数
–
ヒットの回数
–
ヒット率
–

赤はページフォルトで読み込んだ枠、緑はヒットした枠です。Clockでは、ページの右上に参照ビットを表示します。

枠の数ごとのページフォルトの回数

同じ参照列で、ページ枠を1〜8個にしたときのページフォルトの回数です。下線は今の枠の数です。

最初はすべての枠が空で、空きの枠があるうちは左の枠から使います(このときもページフォルトとして数えます)。OPTで、今後参照されないページが複数あるときや参照される時刻が同じときは、左の枠のページを追い出します。

ページフォルトとページ置換

仮想記憶では、プログラムのアドレス空間をページという一定の大きさに分け、必要なページだけを物理メモリのページ枠に読み込みます。参照したページがメモリにないとページフォルトが起き、OSがストレージからそのページを読み込みます。空いている枠がなければ、どれかのページを追い出して場所を空けなければなりません。どのページを追い出すかを決めるのがページ置換アルゴリズムです。ストレージからの読み込みはメモリへのアクセスより何桁も遅いので、ページフォルトの回数を減らすことが性能に直結します。

FIFO・LRU・OPTの違い

FIFOは、最も前に読み込んだページを追い出します。仕組みは簡単ですが、よく使うページでも古ければ追い出してしまいます。LRUは、最も長い間参照されていないページを追い出します。最近使ったページはまた使われやすいという局所性を利用するので、FIFOより成績がよいことが多い方式です。OPT(最適置換)は、今後最も長い間参照されないページを追い出す方式で、ページフォルトの回数が理論上最小になりますが、将来の参照を知る必要があるので実際には使えず、ほかの方式を評価する基準として使います。例の20回の参照列で枠を3つにすると、FIFOは15回、LRUは12回、OPTは9回のページフォルトになります。

ビレディの逆説

ふつうはページ枠を増やすとページフォルトは減りますが、FIFOでは逆に増える場合があります。これをビレディの逆説(Beladyの異常)といいます。参照列 1 2 3 4 1 2 5 1 2 3 4 5 では、FIFOで枠が3つなら9回、4つなら10回のページフォルトが起きます。LRUやOPTは、枠がn個のときにメモリにあるページが、枠がn+1個のときにも必ずメモリにある性質(スタックアルゴリズム)を持つので、この逆説は起きません。比較の表で、FIFOの行の数が増える箇所を確かめてみてください。

実際のOSで使われるClock

LRUを正確に実装するには、参照のたびに順番を更新する必要があり、ハードウェアの負担が大きくなります。そこで実際のOSでは、ページごとの参照ビット(ページにアクセスするとハードウェアが1にする)を使ってLRUに近づけるClock方式がよく使われます。ページ枠を円形に並べて針で指し、追い出すときは、針の指すページの参照ビットが1なら0に戻して次へ進み(二度目の機会を与える)、0のページを見つけたら追い出します。最近参照されたページは追い出されにくくなるので、少ない手間でLRUに近い成績が得られます。

OSの問題を解く

ページ置き換えでFIFO方式を使うと、物理メモリのページ数を増やしたのにページフォルトが増える場合がある。この現象を何と呼ぶか。

  1. Aスラッシング
  2. Bベラディの異常
  3. Cコピーオンライト
答えと解説を見る

正解:B. ベラディの異常

直感的には物理ページを増やせばページフォルトは減るはずですが、FIFO方式では、特定のアクセスの並びで、ページ数を3から4に増やすとフォルトがかえって増えることが知られています。これをベラディの異常といいます。LRUのように、ページ数を増やしても保持するページの集合が必ず前の集合を含む方式(スタックアルゴリズム)では起こりません。スラッシングはメモリ不足で置き換えが続く状態、コピーオンライトは書き込み時に複製する方式です。

容量2ラインのフルアソシアティブ方式でLRU置き換えのキャッシュが最初は空のとき、ブロックをA、B、A、C、B、Aの順に参照すると、ミスは何回起こるか。

  1. A4回
  2. B5回
  3. C6回
答えと解説を見る

正解:B. 5回

順に追うと、A(ミス、[A])、B(ミス、[A,B])、A(ヒット、Aが最近)、C(ミス、最も古いBを追い出し[A,C])、B(ミス、最も古いAを追い出し[C,B])、A(ミス、最も古いCを追い出し[B,A])となり、ミスは5回です。4回とするのは、Cを入れるときにAを追い出したと誤った場合などの数え方で、LRUではヒットしたAが新しくなっている点が大切です。6回は3回目のAのヒットを見落とした数です。

最も長い間使われていないものを追い出すLRUに対して、今後最も長い間使われないものを追い出す方式(最適置き換え、OPT)についての説明として正しいものはどれか。

  1. A実際のキャッシュで広く使われている、最も一般的な置き換え方式である
  2. B実現できないが、他の方式のミス数の下限を示す基準になる
  3. Cどんなアクセスの並びでもLRUとまったく同じミス数になる
答えと解説を見る

正解:B. 実現できないが、他の方式のミス数の下限を示す基準になる

最適置き換え(ベラディのOPT)は、将来のアクセスの順番が分かっているとして、次に使われるのが最も先のデータを追い出す方式で、ミス数が理論上最小になります。しかし実際のハードウェアは未来のアクセスを知ることができないため実現できず、記録したアクセスの並びに当てはめて、LRUなどの方式がどれだけ最適に近いかを評価するのに使います。LRUとは追い出すデータが違うので、ミス数は一般に異なります。

ページフォルトが起こる場合として正しいものはどれか。

  1. Aキャッシュにデータがなく、主記憶から読み込んだとき
  2. Bアクセスしたページが、物理メモリに割り当てられていないとき
  3. CTLBに変換結果があり、すぐに物理アドレスが分かったとき
答えと解説を見る

正解:B. アクセスしたページが、物理メモリに割り当てられていないとき

ページフォルトは、アクセスしたページのページテーブルの項目が無効、つまり物理メモリに割り当てられていない(ディスクに追い出されている、まだ読み込んでいないなど)ときや、読み出し専用のページに書き込むような許されないアクセスをしたときに起こる例外です。OSがページを用意して命令をやり直します。キャッシュミスはハードウェアだけで処理され、例外にはなりません。TLBにあればすぐ変換できるので、フォルトは起きません。

よくある質問

最初に空の枠へ読み込むときもページフォルトに数えますか?

このツールでは数えます。最初の読み込み(初期参照によるフォルト)も、ページがメモリにないので本来はページフォルトです。試験の問題で「最初の読み込みは含めない」などの条件があるときは、その分を差し引いてください。

LRUとOPTの違いは何ですか?

LRUは過去を見て、最も長く使われていないページを追い出します。OPTは未来を見て、今後最も長く使われないページを追い出します。OPTは最小のページフォルトになりますが、将来の参照が分からないと実装できません。

キャッシュの置き換えにも使えますか?

はい。フルアソシアティブ方式のキャッシュで、ラインを枠、ブロックをページとみなせば、同じ計算でミスの回数を求められます。セットアソシアティブ方式では、セットごとに別々に計算します。

試験ではどのように問われますか?

基本情報技術者試験や応用情報技術者試験では、参照列とページ枠の数が与えられ、FIFOやLRUでページフォルトが何回起きるか、最後にどのページが残るかを答える問題がよく出ます。表の「フォルト」の行の×の数が答えになります。

関連する用語

ページフォルト LRU(Least Recently Used) 仮想記憶 デマンドページング スラッシング

関連する計算ツール

半導体・電子回路・情報の計算ツール →