由於LRU(最近最少使用)算法的兩種實現方案都比較麻煩並且開銷很大,因此提出了用軟件來模擬LRU算法的NFU(不常常使用)算法,可是NFU算法存在一些問題,好比在一個屢次掃描編譯器中,在第一遍掃描中被頻繁用到的頁,在程序進入第二遍掃描時計數器值可能仍然很高。實際上,若是第一次掃描的執行時間剛好是各次掃描中最長的,含有之後各次掃描代碼的頁的計數器可能老是比含有第一次掃描代碼的頁小,其結果是操做系統將刪除掉有用的頁而不是再也不使用的頁。算法
因此爲了使NFU算法可以更好的模擬LRU算法,須要對其進行修改,修改分兩部分:第一是計數器在R位被加進來以前右移一位;第二是R位加到計數器的最左端而不是最右端。這就是老化算法。spa
這樣修改之後的老化算法的結果是顯而易見的,由於每次都對計數器進行移位,這就至關於每次都「清除」掉上一次的計數值,可是這個值並不是被徹底去掉而是保存在後面的位中,而後經過對高位添加R位來決定須要淘汰的頁面,這樣就保證了須要淘汰頁面時計數器值最小的葉面確定是最近最少訪問到的頁面。操作系統
|
時鐘週期0 ci |
時鐘週期1 編譯器 |
時鐘週期2 編譯 |
時鐘週期3 table |
時鐘週期4 軟件 |
頁面0 程序 |
10000000 im |
11000000 |
11100000 |
11110000 |
01111000 |
頁面1 |
00000000 |
10000000 |
11000000 |
01100000 |
10110000 |
頁面2 |
10000000 |
01000000 |
00100000 |
00010000 |
10001000 |
頁面3 |
00000000 |
00000000 |
10000000 |
01000000 |
00100000 |
頁面4 |
10000000 |
11000000 |
01100000 |
10110000 |
01011000 |
頁面5 |
10000000 |
01000000 |
10100000 |
01010000 |
00101000 |
用軟件模擬LRU的老化算法6個頁面在5個時鐘週期內的計數器狀況
從上表能夠看出,在未開始以前全部計數器的值都爲0,每過一個時鐘週期首先將計數器右移一位,而後將新的R位添加到計數器最左端,發生淘汰時淘汰計數器值最小的頁面。
在第5個時鐘週期出現了選擇的問題,頁面3和5都連續兩個週期沒有被訪問了,而在兩個週期以前的一個週期中他們都被訪問過。根據LRU,若是有一個頁面必須被淘汰掉,咱們應該在這兩個頁面中選一個。然而如今的問題是咱們不知道在時鐘週期1到時鐘週期2期間這兩個頁中的哪個後被訪問到,在每一個時鐘週期中只記錄一位使咱們沒法區分一個週期內較早和較晚的訪問,咱們所能做的只是淘汰掉頁3,由於頁5在再往前的週期中也被訪問過而頁3沒有。
老化算法存在的另一個問題是計數器始終都只有有限位,如上表所示只有8位計數器,這就意味着開始的訪問數據會被沖掉,若是兩個頁面的計數值恰巧同樣的話,惟一的辦法就是從兩個頁面中隨機淘汰掉一個。