分頁置換與輾轉現象
先進先出置換(FIFO page replacement)
先進先出置換是最簡單可能的規則,而麵包店排隊這件事早就教過你了:先到先服務,也最先離開。在記憶體中坐得最久的那個頁,就是我們接下來要逐出的,不論它現在還有多有用。想像一條由頁排成的隊伍,最老的在最前面;當你必須騰出空間時,就移走最前面的頁,把新來的加到最後面。
它的實作幾乎什麼都不需要:作業系統把常駐的頁依到達時間排成一個先進先出佇列。發生分頁錯誤又沒有空閒頁框時,它移走佇列頭部的頁(最老的),載入新頁,再把新頁放到尾端。不必追蹤使用情形、不必在每次存取時更新時間戳——只要一個佇列。這份便宜是 FIFO 唯一真正的優點。
它之所以重要,主要是作為一個警告。FIFO 不管一個頁被用得多兇,所以它可能只因為某個頁來得早,就高高興興地逐出一個程式不斷參考的頁——典型例子就是一個長壽的迴圈,或一個最先載入的全域變數。更糟的是,FIFO 不是堆疊演算法,所以它會遭遇貝雷迪異常:給它更多頁框反而可能造成更多錯誤,這非常違反直覺。基於這些理由,真實系統不使用純 FIFO;它們使用像第二次機會這種 LRU 近似法,而第二次機會本身就是在 FIFO 上加裝的一個小修正。
頁框 = 3,參考字串 7, 0, 1, 2, 0, 3。載入 7, 0, 1(3 次錯誤,頁框現為 [7,0,1])。參考 2:逐出 7(最老),頁框 [0,1,2]。參考 0:命中。參考 3:逐出 0(此時最老),頁框 [1,2,3]。FIFO 把 0 丟掉了,儘管 0 剛剛才被用過。
FIFO 只憑年齡逐出,所以一個剛用過的頁也可能成為犧牲者。
FIFO 的致命缺陷在於到達順序和未來的有用程度毫無關係;它也是貝雷迪異常的教科書範例,因為它不是堆疊演算法。建造便宜,依賴它則很糟。
又称
另见