Additional-Reference Bits Algorithm

Basic Concept

單一 bit 只能說「有用過 / 沒用過」,無法比較兩個都用過的頁面誰比較舊。所以改用一個 8-bit shift register 來記錄「最近 8 個時間段」的使用歷史——bit pattern 越大,代表越近期被用過,越不該被踢。

How it works?

  1. 每個 page 維護一個 8-bit register,初始為 00000000
  2. OS 的 timer interrupt 定期觸發(例如每 100ms 一次):
    • 把每個 page 的 reference bit shift 進 register 最高位(MSB)
    • register 右移一位,最舊的 bit 掉出去
    • 再把 reference bit 清成 0
  3. 換頁時:找 register 數值最小的 page 踢掉(數值越小 = 越久沒用)

具體範例:

Reference string:4. 7. 0. 1. 0. 1. 2. 1. [2. 7. 1. 2](框起來的是最近這段)

經過幾輪 shift 後,各 page 的 8-bit 歷史如下(最左位 = 最近一次的 reference bit):

Page8-bit Register十進位值
00110000096
111100000224
211000000192
3000000000
40010000032
5000000000
6000000000
710100000160

照數值由小到大排,得到近似的 LRU 順序(最該被踢的在前):

Approximated LRU:3, 5, 6, 4, 0, 7, 2, 1

關鍵限制 Additional-Reference-Bits 的解析度受限於 timer 觸發頻率:同一個時間段內用過的頁面,register 值會一樣,無法進一步排序。時間段切越細、歷史 bit 越多,就越接近 true LRU,但 overhead 也越高。