LIRS緩存替換算法



LIRS (Low Inter-reference Recency Set)是一個頁替換算法,相比於LRU(Least Recently Used)和很多其他的替換算法,LIRS具有較高的性能。這是通過使用兩次訪問同一頁之間的距離(本距離指中間被訪問了多少非重複塊)作爲一種尺度去動態地將訪問頁排序,從而去做一個替換的選擇。這個算法由宋江和張曉東實現。

量化局部性

所有的頁替換算法的工作都依賴於現存局部性原理,各種替換算法的主要不同在於如何量化局部性。LIRS使用同一個頁兩次被訪問的距離,也即是頁的連續兩次訪問之間,有多少非重複的頁被訪問去量化局部性。特別地,LIRS使用最後一次和倒數第二次訪問該頁來實現這一目的。如果一個頁首次被訪問,則其reuse distance是無窮大,與此同時,LIRS算法還使用一個頁的新近訪問時間去量化這種局部性。(新近訪問時間:從該頁最近一次訪問的時刻到此時,訪問過的其他非重複頁的數量)。爲了將最新的訪問歷史信息考慮進去,LIRS算法的實現使用再訪問間隔和頁的新近訪問時間的較大值去度量這種局部性,使用RD-R表示(Reuse Distance—Recency)。

再訪問間隔和新近訪問時間的概念如下圖所示:

其中:

T1爲該頁的倒數第二次訪問時刻

T2爲該頁的上一次訪問時刻

T3爲此時時刻


選擇替換頁

LIRS管理緩存頁和非緩存頁的元數據信息,結合下圖,可以描述其替換操作:


1、緩存塊被分爲LIR和HIR兩部分。LIR部分用於存儲最經常被訪問的一些頁面(LIR頁面),HIR部分用於存儲HIR頁面

2、LIR部分存儲了緩存的大部分頁面,所有的LIR頁面都是常駐緩存的

3、所有最近被訪問的頁面被放置於棧S,所有的常駐HIR頁面被放 置於棧Q(有可以實現爲隊列Q)

4、當棧S中的一個頁面被訪問時,其就會被移至棧S的頂部,同時要確保棧S的尾部是一個LIR塊,(這就會進行“棧剪枝”操作)在圖(a)的情況下,頁面B被訪問,就會得到圖(b)

5、當棧S中的的一個HIR頁面被訪問時,該HIR頁面就會轉變爲LIR頁面,相應的棧S底部的LIR頁面會轉變爲HIR頁面,並移至棧Q的頂部,在圖(a)的情況下,頁面E被訪問,就會得到圖(c)

6、當棧S和棧Q中的頁面都不命中時,就得考慮常駐頁面的替換, 首先被替換出去的是處於棧Q底部的常駐HIR頁面。在圖(a)的情況下,頁面D被訪問,就會得到圖(d);在圖(a)的情況下,頁面C被訪問,就會得到圖(e)


我們在LIRS棧S上定義一種操作,“棧剪枝”,即移除棧底的所有的HIR塊直到遇到一個LIR塊。

這個操作有兩個目的:

1、確保棧底的一定是個LIR塊

2、當棧底的LIR塊被移除後,它上面的HIR塊一直到下一個LIR塊是沒有機會變爲LIR塊的,因爲他們的recency要大於LIR塊最大的recency。

棧S中保存了三種塊,棧Q中保存了所有的駐留在cache中的HIR塊。但是沒有表示不在cache中又不在S中的HIR塊。

(總結)對於以上保存、沒保存的所有塊,存在三種訪問情況:

1、訪問一個LIR塊X:這次訪問一定命中,簡單的將這個塊移動棧頂,如果這個LIR塊以前是在棧底,那麼就需要一次“棧剪枝”操作。

2、訪問一個駐留在cache中的HIR塊X:這次訪問也會命中,然後將它移動到棧頂。然後分兩種情況:如果X原本在S中,需要將他的狀態改爲LIR,還需要將其從Q移除。棧底的LIR塊狀態改爲HIR,加入Q的棧頂,最後執行一次“棧剪枝”;如果X不在棧S中,保持它的HIR狀態,在Q中把它移動到棧頂(注意Q中是有這個塊的)。

3、訪問一個非駐留cache中的HIR塊X:這次會發生不命中,我們需要將Q棧底的HIR塊從cache中替換掉,改變其狀態爲非駐留態。然後將X讀入cache中剛分配的空閒塊,並將X移動到S棧頂。下面分兩種情況:如果X在棧S中,改變其狀態爲LIR,移動棧底LIR塊到Q的尾部並更改狀態爲HIR,最後執行“棧剪枝”;如果X不在S中,保持它的狀態爲HIR然後把它加入到Q的棧頂。

發佈了16 篇原創文章 · 獲贊 15 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章