緩存機制中,當發生頁衝突時,操作系統將會調用頁面置換演算法進行淘汰,而我們這篇文章中重點介紹隨機訪問情況下效率較高的兩種演算法。
LRU:Least Recently Used
NRU:Not Recently Used
LRU
LRU淘汰的是最早被使用的Cache,演算法可以分為兩種實現:
A.時間戳
硬體記錄最近一次訪問時間,每次淘汰遍歷求最早訪問的Cache。
B.鏈表
Algorithm 4th:著名的前移編碼策略,假設最近訪問過的元素很有可能再次訪問,因此可以用於緩存、數據壓縮等許多場景。
這裡將所有可能被淘汰的Cache用一張線性鏈表存儲,當查詢時,每次被查詢到的Cache節點將會被移除出鏈表並且插入表頭。如此一來,鏈表頭將會是最新被訪問的數據,而鏈表尾則會被淘汰。
這樣一來,淘汰最早訪問的Cache則非常方便,代價則是需要鏈表的結構是可修改的。
在硬體層,這兩種實現都具有巨大的開銷,因此難以用於實踐。
NRU
考慮到LRU實現困難,Clock 頁面置換演算法(NRU)應運而生。
記錄誰最早被使用很難,那麼換一種思路,把時間分成一個個週期,如果最近一個週期都沒有被使用,那就乾脆當做一直沒有被使用。
本質上這可以說是一種逆向思維:不一定要最早被使用的被淘汰,只要不是最近被使用的被淘汰就好了。而統計誰最近被使用則成本低廉,只需要在某個時間段清空訪問狀態,是否新被訪問就很容易判斷。