學習高階資料庫技術課的時候,老師提到了資料庫中的buffer manager(快取管理器),現在找出來重新整理溫習下,今天要討論的資料庫快取管理器塊替換的總體結構如下圖所示:
當應用程式需要從磁碟上得到一個塊時,它會呼叫緩衝管理器,那麼現在就分兩種情況:
1.1、如果這個塊已經在buffer中,緩衝管理器就會返回該塊在主存中的地址給應用程式
1.2、如果這個塊不在buffer中,那麼buffer manager就會做以下幾件事情:
1)在buffer中為該塊分配空間,那麼它是如何做到的呢?首先,如果需要的話,替換一些塊以讓出空間給新的塊,被替換的塊如果已經被修改過,那麼就需要把它重新寫回到磁碟上。
2)把需要的塊從磁碟上讀到buffer中,然後返回該塊在主存中的地址。
第二部分
在上面的述說中我們瞭解到,當buffer的空間不足時,會選擇一個塊換出,這裡就牽涉到了替換strategy,記得老師在課上給我們講解了幾種比較流行的替換strategy,自己整理了一下:
2.1、LRU演算法(Least Recently Used 近期最少使用演算法)
這個應該非常熟悉,不光是在資料庫中用到,我覺得我們最早接觸到這個應該是在作業系統中,這裡就不多說了,給個example就很明白了。
假設現在的訪問序列:1,4,8,1,5,2,3,2,4
得到如下圖所示的替換過程:
但是LRU演算法在一些特定的情況下,效能就不會很好,比如:
- 1)檔案共享:馬上被用到的資料被一次訪問的資料擠出,LRU堆疊保留了一次性訪問的資料直到堆疊滿的時候才會被替換出;
- 2)環訪問:假設現在LRU stack的大小為k,而現在的訪問序列是:1,…,k,k+1,那麼順序訪問k+1之後,就會一直miss(之前的元素已被替換出堆疊);
- 3)不同頻率的訪問(混合工作負載)
頻繁訪問的資料會被不頻繁訪問的資料所替換
2.2、Clock: An approximation of LRU(一種與LRU近似的方法)
該演算法的思想是把所有的塊形成一個環(通過mod運算實現),環中的每一塊都帶一個引用位(reference_bit),也稱為第二次機會位,當可用塊為0時,此時就需要選擇一塊換出,在選擇塊換出時,如果當前塊的reference_bit為1時,則修改成0,該塊繼續留在環中,如果當前塊的reference_bit為0,則選擇該塊換出,如下圖所示:
2.3、LIRS Policy
2.3.1、LIRS演算法(Low Inter-Reference Recency Set Recency):表示某一塊最近一次被訪問與當前的間隔,可以理解為該塊最近一次被訪問之後,接下來訪問了多少個其它塊(Recency可以用這個其它塊數表示)。
Reuse Distance(IRR):Buffer中某一塊被連續訪問時,它們之間的其它塊數(在計算的時候,不算重複的塊)。可以用下圖進行說明:
2.3.2、LIRS的基本思想
- 1)該演算法認為IRR值高的塊不會被頻繁訪問,所以把這些塊選作將要被替換的塊;
- 2)Recency被用作第二次引用;
- 3)把IRR值低的塊保留在Buffer Cache中。
LIRS對比上面兩種演算法有其明顯的改進,首先,它根據多種資訊資源來合理地改變每個塊的狀態;其次,它的實現成本低。
2.3.3、LIRS的資料結構
LIRS的整個資料結構如下圖所示:
我們從上圖中可以看出,該演算法有兩個block set:LIR block set和HIR block set,同時整個物理快取也由兩部分組成,並且也可以知道,屬於IRR值低的塊集合中的塊全部儲存在物理快取中,而屬於IRR值高的塊集合中的塊只有一部分位於物理快取中。
2.3.4 LIRS的塊替換操作
下面我們結合具體的例子來了解使用LIRS演算法之後,是如何進行塊替換的,假設現在有5個塊,分別是A,B,C,D,E,且當前在time 9這個位置,此時塊訪問序列以及每個塊的Recency和IRR值如下圖所示:
由上圖可知,塊A最近一次被訪問是在time 8,所以它的R(Recency)為1;另外塊A在time 6 和time 8被連續兩次訪問到,在這兩個時刻之間,只有塊D被訪問到,所以塊A的IRR為1。塊B,C,D,E的R值和IRR值的計算方法和塊A一樣,如果某一塊最近只有一次被訪問到,那麼它的IRR值為無窮大,比如塊C和E。假設現在的物理快取的空間劃分如下圖所示:
也就是,在該物理快取中只能存放兩個IRR值低的塊,一個IRR值高的塊,我們最後進行歸類得到如下圖所示:
那麼接下來,如果在time 10訪問塊D,該如何進行替換,從上面得知,塊D屬於IRR值高的塊集合,而此時屬於IRR值高的塊集合中只有塊E駐留在物理快取中,那麼此時就需要把塊E替換出去,把塊D存入物理快取中,整個過程如下圖所示:
在塊D進入物理快取之後,我們接下來要做一些更新操作,看看塊D應該屬於哪個集合,因為在D進入物理快取之後,各個塊的R值和IRR值已經發生變化,更新完各個塊的R值和IRR值之後,我們把塊D的IRR值和IRR值低的塊集合中的塊的R值進行比較,如果塊D的IRR值比IRR值低的塊集合中的某塊的R值小,則把該塊換入到IRR值高的塊集合中,而塊D進入IRR值低的塊集合中,過程圖如下圖所示:
塊D在time 10被訪問之後,最後的結果如下圖所示: