ページ置換:FIFO・LRU・最適置換

メモリにはいくつかのフレームがあり、それぞれにページをひとつ格納できます。プログラムは参照列の順にページを要求します。そのページがすでにフレーム内にあればヒット、なければフォールトです。フレームがすべて埋まっているときは、どれかのページを取り除く必要があります。FIFOは読み込んでから最も時間がたったページ、LRUは最後に使ってから最も時間がたったページ、OPTは次に使う時点が最も遠いページを選びます。

インタラクティブシミュレーションを読み込んでいます...

レッスン

理論 — ページ置換:FIFO・LRU・最適置換

メモリを等しい大きさのフレームに分け、プログラムのデータも同じ大きさのページに分けます。どのページも、どのフレームにでも格納できます。プログラムが参照するページを順に並べたものが参照列です。メモリにないページを参照すると、ページフォールトが起きて、そのページを読み込みます。空きフレームがなければ、置換方式に従って取り除くページを選びます。ある参照列で、FフレームよりF + 1フレームのほうがフォールト数が多くなる現象を、ベラディの異常といいます。

各記号の意味

F
フレーム数
n
循環参照に含まれるページ数(例題)
r
循環参照の繰り返し回数
前提
要求時ページングを仮定します。ページは要求されたときだけ読み込み、最初のメモリは空です。そのため、各ページの初回参照は、どの方式でもフォールトになります。この教材のOPTでは、今後使わないページが複数ある場合、ページ番号が最も小さいものを取り除きます。各参照の対象はひとつのページです。読み出しと書き込みは区別せず、ページを取り除くためのコストも考えません。LRUを厳密に実現するには、すべてのメモリアクセスの時点を記録する必要があります。記録の負担が大きいため、実際のカーネルでは各ページの参照ビットなどを使って近似します。代表的な方法がクロックアルゴリズムです。

フレームをひとつ増やすと、フォールトもひとつ増える 🖖

FIFO、3フレームを押し、次にFIFO、4フレームを押してみましょう。参照列は1 2 3 4 1 2 5 1 2 3 4 5。メモリを増やすと、フォールトが9回から10回に増えます。両方を、ページ5が現れるステップ7まで進めてください。3フレームの場合、ページ1と2はいったん取り除かれてから読み込まれたため、最も新しいページです。FIFOはページ4を取り除きます。4フレームの場合、ページ1と2はずっとメモリに残っていました。最も古く読み込まれたページ1が取り除かれ、その次のステップでまた要求されます。この現象をベラディ、ネルソン、シェドラーが報告したのは1969年です。起こるのはまれです。長さが12未満の参照列を、ページの種類数を問わずすべてFIFOで調べたところ、この現象は起きませんでした。長さがちょうど12の参照列は4,213,597通りあります。ページの名前だけが違う参照列は同じものとして数えています。そのうち、この現象が起きるのは8通り。どれも1 2 3 4 1 2 5 1で始まり、3フレームから4フレームに増やすとフォールトが1回増えます。5ページだけを使うものは、この参照列だけです。

LRUとOPTでは、メモリを増やしてもフォールトは増えない 🖖

LRU、4フレームを押してみましょう。同じ参照列でフォールトは8回。3フレームでは10回でした。LRUは、Fフレームなら直近に使ったF個のページを保持し、F + 1フレームなら、それらに加えてもうひとつ保持します。そのため、どのステップでも、小さいメモリのページはすべて大きいメモリにも含まれています。3フレームでヒットする参照は、4フレームでもヒットします。FIFOが保持するのは、直近に読み込まれたページです。フレーム数が違えば、読み込みの履歴も変わります。ステップ7の後、3フレームに入っているのは1、2、5ですが、4フレームでは2、3、4、5です。OPTにも、LRUと同じ包含関係があります。この性質を持つ方式をスタックアルゴリズムと呼びます。結果の下の表には、フレーム数ごとのフォールト数が並んでいます。スタックアルゴリズムでは、フレーム数を増やす方向に読んでも値は増えません。FIFOでは増えることがあり、そのセルに印が付きます。

フレーム数よりページ数がひとつ多い循環参照では、LRUが毎回フォールトする 🖖

循環参照、LRUを押してみましょう。5ページを順番に3周読み、4フレームで処理します。15回の参照すべてでフォールトが起きます。最後に使ってから最も時間がたったページが、いつも次に要求されるからです。FIFOでも結果はまったく同じです。循環参照、OPTを押すと、フォールトは7回に減ります。OPTは次に使う時点が最も遠いページを取り除きます。ステップ5と9で選ぶのは、直前に参照したページです。こうした選択ができるのは、あらかじめ参照列を最後まで読んでいるからです。実際のオペレーティングシステムには、先の参照はわかりません。OPTは、この参照列で達成できる最小のフォールト数を示し、ほかの方式を評価する基準になります。フレームを5個にすると、どの方式でもフォールトは5回。各ページを最初に読むときだけです。

全プロセスの詳細解説

  1. LRUがすべての参照でフォールトする場合 5 ステップ

    循環参照、OPTを押して、7回のフォールトがどのステップで起きるか確かめてください。次に、100ページを占める配列を1,000回繰り返し走査して合計を求めるプログラムを考えます。フレームは99個です。LRUとOPTでは、それぞれ何回フォールトするでしょう。フレームを100個にすると、何回になるでしょうか。

    この問題をツールで開く

    1. 画面の例では、最初の5回の参照でフォールトが起きます。4回で空のフレームが埋まり、5回目でページ置換が必要になります。その後のフォールトはステップ9と13。4回の参照ごとに起きるので、合計は5 + 2 = 7回です。

    2. n個のページを循環参照し、フレームがn − 1個あるとき、メモリにないページは常にひとつです。フォールトが起きた時点で、次の参照が最も遠いのは直前に参照したページ。再び参照されるのはn − 1回後です。ただし、最後の周回では、もう参照されないページをOPTが選ぶこともあります。このページを取り除いても、次のn − 2回で参照するページはすべてメモリに残っています。したがって、次のフォールトはn − 1回後に起きます。

    3. 99フレームのLRUでページpのフォールトが起きたとき、メモリにはそれ以外のすべてのページがあります。最後に使ってから最も時間がたったのはp + 1、つまり次に参照するページです。よって100 × 1,000 = 100,000回の参照すべてでフォールトが起きます。画面の例で15回すべてがフォールトしたのと同じです。FIFOも同じページを取り除きます。

    4. OPTでは、最初の99回の参照でフレームが埋まります。100回目からは99回の参照ごとにフォールトが起き、参照回数でいうと100、199、298、…回目です。この部分のフォールト数は1 + ⌊(100,000 − 100) / 99⌋ = 1 + 1,009 = 1,010回。合計は99 + 1,010 = 1,109回です。一般式n + ⌊n(r − 1)/(n − 1)⌋に、n = 100、r = 1,000を代入した値になります。

    5. フレームを100個にすると、配列全体がメモリに収まります。どの方式でもフォールトは100回。各ページの初回参照でだけ起き、最初の周回が終われば、それ以降は起きません。

    解答

    LRUは100,000回、OPTは1,109回。フレームをひとつ増やすと、どちらも100回です。フレーム数よりページ数がひとつ多い循環参照は、LRUにとって最悪の条件です。そのひとつを追加するだけで、LRUのフォールト数に1,000倍の差が生まれます。

学習の道すじ

データ構造が得意なこと

参考文献 (1)