緩存淘汰算法系列(一)


一、前言

  緩存算法歷史已經很久了,但在樓主查詢相關資料時,發現知識零碎,且原理介紹的很不詳細,遂有了總結常用緩存算法文章的想法,以供廣大朋友們查閱。本文是緩存系列的第一篇,知識側重於初略的介紹,並未深入。

 

二、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、如果鏈表滿了,則把尾部的數據刪除,同時把其插入鏈表頭部

 

六、參考文獻

  Page replacement algorithm

  The Second Chance Page Replacement Policy

  The Not Recently Used Page Replacement Algorithm

  Operating Systems Virtual Memory Paging

    Page Replacement Algorithms

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM