老化演算法(aging algorithm)
真正的 LRU 太昂貴,因為它得在每次記憶體存取時動到硬體。老化演算法是一個聰明的取巧,它只用硬體本來就維護的、每頁一個位元——參考位元——來近似 LRU。參考位元在一個頁被碰觸時設為 1,由作業系統重置。把它想成一段對近期活動逐漸淡去的記憶:每個頁帶著一小段歷史,隨著時間流逝那段歷史悄悄衰減,於是近期活躍的頁看起來「新鮮」,久未使用的頁則淡向被遺忘。
機制如下。作業系統給每個頁一個小型的位元暫存器,比如 8 個位元,全都從 0 開始。在固定的間隔(一次計時器滴答),它把每個頁的暫存器整個右移一位,並把該頁目前的參考位元滑進最左(高位)的位置;然後清掉參考位元以待下一個間隔。久而久之,在最近幾個間隔被碰過的頁會在高位累積出許多 1,得到一個較大的值;而閒置了許多間隔的頁會填滿 0,得到一個較小的值。要置換時,作業系統逐出暫存器值最小的頁——那就是最近活動最少的頁,也就是「最近最少使用」的老化近似。
為什麼重要:老化只用對廉價參考位元的週期性位移,就捕捉到 LRU 的精神,不需要逐次存取的硬體。它比單一參考位元更有資訊,因為它記得好幾個間隔的歷史,而不只是「自上次檢查以來碰過或沒碰過」。它誠實的限制:時間被滴答量化,所以在同一個間隔內它無法分辨存取的先後順序,而平手(暫存器值相等)必須用其他規則打破。它是近似,不是精確的 LRU——但是個良好又實用的近似。
使用 8 位元暫存器,一個在這個間隔與前一個間隔都被碰過的頁可能讀作 11000000(大),而一個過去數個間隔都閒置的頁讀作 00000010(小)。發生錯誤時作業系統逐出那個小的。每次滴答它就右移並滑入最新的參考位元。
每次滴答把歷史右移;最小的值就是最老化、最近最少使用的頁。
老化近似 LRU,卻無法為同一個計時器間隔內的存取排序,相等的暫存器值也需要一個打破平手的規則。它比單一參考位元更精確,但仍不是真正的 LRU。