緩存置換算法

緩存置換算法

image

 

緩存置換算法

 

操做系統本質上是一個多級緩存系統,從cpu寄存器,cpu一級緩存,cpu二級緩存,cpu三級緩存,主內存,硬盤,從右到左訪問效率依次提高。如何在有限的資源內處理無限的數據?最理想的狀況是置換出將來短時間內不會被再次訪問的數據,可是咱們沒法預知將來,因此只能從數據在過去的訪問狀況中尋找規律進行置換。算法

 

LRU

 

LRU全稱是Least Recently Used,即最近最久未使用算法。其基於若是一個數據在最近一段時間沒有被訪問到,那麼在未來它被訪問的可能性也很小的思路,也就是說優先刪除掉在過去一段時間內沒有被訪問的數據。緩存

 

利用雙向鏈表記錄數據順序,hashmap查詢數據;操作系統

  • 插入/更新:首先判斷是否已經存在key。若是已經存在該key,則重置成當前的value而且將該key移動到鏈表的頭部;若是不存在則建立一個新節點,一樣將其該key移動到鏈表的頭部而且設置hashmap的映射。若是緩存滿了,則將以前最老的元素刪除。
  • 查詢:若是從緩存中獲取到對應的key,則返回對應的數據而且將該key移動到鏈表的頭部;
  • 刪除:因爲鏈表從頭至尾保持最新到最舊的順序,所以刪除鏈表尾部便可;

 

image

 

LFU

 

LFU全稱是Least Frequently Used,即最近最少使用算法。其基於若是一個數據在最近一段時間內使用次數不多,那麼在未來一段時間內被使用的可能性也很小的思路,也就是說刪除在過去一段時間內使用次數不多的數據;code

 

注意LFU和LRU算法的不一樣之處:LRU的淘汰規則是基於訪問時間,而LFU是基於訪問次數的。blog

 

一樣利用雙向鏈表記錄數據順序,hashmap查詢數據(存儲的節點還須要維護訪問次數)內存

  • 插入/更新:首先判斷是否已經存在key。若是已經存在該key,則重置成當前的value而且將訪問頻率+1,接着和鏈表中該節點的前置節點比較,是否須要調換位置;若是不存在則建立一個新節點,一樣將其該key加入到鏈表的尾部而且設置hashmap的映射。若是緩存滿了,則將以前最老的元素刪除。
  • 查詢:若是從緩存中獲取到對應的key,則返回對應的數據而且將訪問頻率+1,接着和鏈表中該節點的前置節點比較,是否須要調換位置;
  • 刪除:因爲鏈表從頭至尾保持最新到最舊的順序,所以刪除鏈表尾部便可;

 

image

 

FIFO

 

FIFO全稱是First in First out,即先進先出算法。其基於若是一個數據最早進入緩存中,則應該最先淘汰掉的思路,也就是說優先刪除掉最早保存到鏈表中的數據;資源

 

利用雙向鏈表記錄數據順序,hashmap查詢數據;hash

  • 插入/更新:首先判斷是否已經存在key。若是已經存在該key,則重置成當前的value;若是不存在則建立一個新節點,一樣將其該key移動到鏈表的尾部而且設置hashmap的映射。若是緩存滿了,則將以前最早進入緩存的元素刪除。
  • 查詢:若是從緩存中獲取到對應的key,則返回對應的數據,不會在鏈表中移動key的順序;
  • 刪除:因爲鏈表從頭至尾保持最舊到最新的順序,所以刪除鏈表頭部便可;

 

image

 

image

相關文章
相關標籤/搜索