分頁置換與輾轉現象

第二次機會演算法(second-chance algorithm)

純 FIFO 即使你剛用過也照樣逐出最老的頁——顯然太苛刻。第二次機會演算法用一份寬容來軟化 FIFO:在丟掉一個老頁之前,先檢查它最近有沒有被用過,若有,就讓它再跑一圈才能被逐出。它是會停下來問「你最近有沒有用處?」並原諒有用處之頁的 FIFO。

常見的實作是時鐘演算法。想像所有頁框排成一個圓,有一根指針像時鐘一樣繞著掃。需要犧牲頁時,指針檢查它指著的頁。若該頁的參考位元是 0,表示自上次檢查以來沒被碰過——逐出它並讓指針前進。若參考位元是 1,表示該頁最近被用過,我們就不逐出它;改成把它的參考位元清為 0(用掉它的第二次機會)並讓指針前進到下一個頁。指針持續掃動,把 1 清成 0,直到找到一個位元本來就是 0 的頁,那就成為犧牲頁。一個不斷被參考的頁,位元會不斷被重設為 1 而存活;一個真正閒置的頁則會在下一輪掃描中被找到。

為什麼重要:時鐘只用單一參考位元和一根移動的指針,就給出近似 LRU 的良好結果——便宜到真實作業系統會使用它的變體。增強型第二次機會演算法更進一步,也讀取髒位元,把頁分成四類:從(未參考、未修改)——最好、最便宜的犧牲者——一路到(已參考、已修改)——最差——並偏好逐出乾淨且未參考的頁,以避免寫回。誠實的提醒:它只是近似 LRU;在每個位元都是 1 的最壞情況下,指針會掃完一整圈把所有位元清掉,然後表現得就像純 FIFO。

時鐘指針指著一個參考位元為 1 的頁。作業系統不逐出它,而是把位元清為 0 再往前走。它指向下一個頁,那個頁的位元已經是 0——那就是犧牲頁。第一個頁因為最近被用過而贏得了第二次機會。

參考位元為 1 換得一次緩刑(被清為 0);第一個被找到為 0 的頁就被逐出。

若每個頁的參考位元都是 1,時鐘會掃完一整圈把它們清掉,然後退化成純 FIFO。增強型版本還會用髒位元來偏好乾淨的犧牲者,省去一次寫回。

又称
clock algorithmCLOCK時鐘演算法二次機會法