Least Recently Used (LRU) Page Replacement

Basic Concept

和 optimal page replacement 相反,LRU 踢掉「最久沒被用到」的頁面——基於 locality 假設,最近沒用的東西,近期也不太可能會用。

Implementation

1. Counter Implementation

每個 page table entry 裡存一個 counter,每次 page 被存取就把當前 clock 值寫進去。

  • 換頁時:掃描所有 entry,找 counter 最小(最久沒用)的踢掉
  • 缺點:每次換頁都要 search through table,O(n)

2. Stack Implementation

用一個 doubly linked list 維護所有在記憶體裡的 page:

  • Page 被存取:把它從目前位置移到 stack top(最近使用)
    • 需要改 6 個 pointer(doubly linked list 的 remove + insert)
  • Stack bottom 永遠是 LRU victim,換頁時直接取用 → no search needed
  • 缺點:每次 reference 都要更新 pointer,update 代價高
top  → [最近用的]
       [...]
       [...]
bottom → [最久沒用的] ← 換頁時踢這個

硬體支援問題 不管 Counter 還是 Stack,每次 memory reference 都要更新(clock 或 pointer),硬體負擔很重。真實系統很少完整實作 true LRU。


LRU-Approximation

既然 true LRU 太貴,大多數系統改用近似版本,透過 reference bit 來低成本地追蹤使用情況。

Reference bit 機制:

  • 硬體在 page 被 refer 時自動把 reference bit 設成 1
  • OS 定期把所有 reference bit 清成 0
  • 可以知道「某頁在上一個時間段內有沒有被用」,但不知道順序

變體一:Additional-Reference-Bits Algorithm

D-OS-Ch10eca-Additional-Reference-Bits_Algorithm

變體二:Second-Chance Algorithm(Clock Algorithm)

D-OS-Ch10ecb-Second-Chance_Algorithm

變體三:Enhanced Second-Chance Algorithm

D-OS-Ch10ecc-Enhanced_Second-Chance_Algorithm