一、前言
緩存算法歷史已經很久了,但在樓主查詢相關資料時,發現知識零碎,且原理介紹的很不詳細,遂有了總結常用緩存算法文章的想法,以供廣大朋友們查閱。本文是緩存系列的第一篇,知識側重於初略的介紹,並未深入。
二、NRU(Not recently used)
1、算法思想
NRU算法的思想是保留最近使用過的對象。
2、工作原理
緩存維護兩個標記位,初始值為0。一個標記位R標識對象是否被使用過,另一個M用來標識對象是否被修改過。當一個對象在緩存中找到時,R置為1(referenced);當一個對象被修改時,M置為1(modified)。一個對象擁有的標記位有4種狀態:
3. referenced, modified
2. referenced, not modified
1. not referenced, modified
0. not referenced, not modified
當緩存已滿,但新的對象需要加入緩存時,從等級(上面狀態最左邊的數字代表等級)最低的對象中隨機淘汰一個。
同時,緩存還有一個周期性的時鍾,它在每個時間間隔會把所有對象的R標記為清零(這樣就知道該對象最近,也就是一個時間間隔,是否被使用),但M不會清零。所以上面not referenced, modified狀態看似不可能,但在經歷過一個時間間隔,R位被清零時將有可能發生。
注意,該算法認為,最近被使用過的對象,比最近被修改過的對象更重要。
三、FIFO(First-in, first-out)
1、算法思想
該算法是最簡單的緩存淘汰算法,其原理正如它名字一樣,最近使用過的對象放到緩存隊列的末尾,隊列頭部保存的是最早使用的對象。
四、Second-chance
1、算法思想
這是FIFO算法的改進版,相對於FIFO算法立刻淘汰對象,該算法會檢查待淘汰對象的引用標志位。如果對象被引用過,該對象引用位清零,重新插入隊列尾部,像新的對象一樣;如果該對象未被引用過,則將被淘汰。
2、工作原理
在FIFO算法的基礎上,
*為緩存中的所有對象增加一個“引用標志位”
*每次對象被使用時,設置標志位為1
*新對象加入緩存時,設置其標志位為0
*在淘汰對象時,查看它的標志位。如果為0,則淘汰該對象;如果為1,則設置其標志位為0,重新加入隊列末尾。
五、LRU(Least recently Used)
1、算法思想
LRU算法的核心思想是基於“如果數據最近被訪問過,它在未來也極有可能訪問過”。因此如果數據的變化趨勢符合這個思想,效果會比較好。
2、工作原理
(1)數據結構:鏈表,用於保存需要緩存的數據;HashMap,用來讀取緩存中的數據,保證時間復雜讀為O(1)
(2)實現:
當數據讀取時,有兩種情況:
a、數據在緩存中,則把該數據從新移到鏈表頭部
b、數據不在緩存中,則把數據插入到鏈表中。
如何插入:
a、如果鏈表不滿,則把數據插入鏈表頭部
b、如果鏈表滿了,則把尾部的數據刪除,同時把其插入鏈表頭部
六、參考文獻
The Second Chance Page Replacement Policy
The Not Recently Used Page Replacement Algorithm
Operating Systems Virtual Memory Paging