緩存淘汰算法系列(一)【轉】

轉自:https://www.cnblogs.com/junyuhuang/p/5805168.html

一、前言

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

 

二、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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章