訪問緩衝區的LRU與MRU演算法

2021-06-16 01:00:52 字數 1724 閱讀 2226

資料庫

訪問緩衝區的

lru與

mru演算法

1.cachehitandcachemiss

當使用者第一次向資料庫發出查詢資料的請求的時候,資料庫會先在緩衝區中查詢該資料,如果要訪問的資料恰好已經在緩衝區中(我們稱之為cachehit)那麼就直接用緩衝區中讀取該資料.

反之如果緩衝區中沒有使用者要查詢的資料那麼這種情況稱之為cachemiss,在這種情況下資料庫就會先從磁碟上讀取使用者要的資料放入緩衝區,使用者再從緩衝區讀取該資料.

很顯然從感覺上來說cachehit會比cachemiss時訪問速度快.

2.lru(最近最少使用

演算法)and

mru(最近最常使用

演算法)所謂的

lru(leastrecentlyused)

演算法的基本概念是:當記憶體的剩餘的可用空間不夠時,緩衝區盡可能的先保留使用者最常使用的資料,換句話說就是優先清除」較不常使用的資料」,並釋放其空間.之所以」較不常使用的資料」要用引號是因為這裡判斷所謂的較不常使用的標準是人為的、不嚴格的.所謂的

mru(mostrecentlyused)

演算法的意義正好和

lru演算法相反.

下面我們通過9icache中對

lru和

mru的使用來看一下兩者在緩衝區工作機制中的作用和區別:

在oracle9i中有

lrulist的概念:我們可以把

lrulist想象成是一連串的緩衝區集合,兩端分別是

lru端和

mru端,當資料庫從磁碟上讀取資料放入緩衝區時,系統必須先確定緩衝區中有freebuffers,這個時候oracle9i會掃瞄

lrulist,掃瞄的基本原則是:

1.    從

lru端到

mru端;

2.    當掃瞄到freebuffer或已掃瞄的緩衝區數目超過臨界值時,就會停止掃瞄動作;

如果在掃瞄過程順利的在

lrulist中找到了freebuffer,那麼oracle9i就把從磁碟讀出的資料寫到freebuffer中然後把freebuffer加到

lrulist的

mru端.

那如果掃瞄過程沒有在

lrulist中找到freebuffer怎麼辦?當然是從

lrulist的

lru端開始清除緩衝區,如此一來就可以騰出新的空間了.

下圖就是乙個例子:

使用者查詢資料a,初始的時候

lrulist中沒有資料a,於是oracle9i到磁碟讀取a,然後放到

lrulist的

mru端,使用者再從

lrulist中讀取資料a,同理對於b,c…當

lrulist滿了以後,如果使用者查詢n,此時n不在

lrulist中而且

lrulist中已經沒有freebuffer了,此時oracle9i就開始從

lru端淘汰a以騰出空間存放n.

圖1我們再來看另外一種情況:

在state3之後,恰好使用者持續的查詢a—這將會導致a一直被放置在靠近

mru端的緩衝區,結果將如圖statem』所示,你會發現圖2的statem』與圖1的statem緩衝區存放的資料完全一樣但是存放位置不一樣.此時

lrulist滿了,如果再放n的時候

lrulist`淘汰的是b,因為a的查詢率高於b,所以

lrulist讓a在緩衝區中呆上較長的時間而先淘汰掉」較不常用的」的b.

圖2

資料庫訪問緩衝區的LRU與MRU演算法

1.cache hit and cache miss 當使用者第一次向資料庫發出查詢資料的請求的時候,資料庫會先在緩衝區中查詢該資料,如果要訪問的資料恰好已經在緩衝區中 我們稱之為cache hit 那麼就直接用緩衝區中讀取該資料.反之如果緩衝區中沒有使用者要查詢的資料那麼這種情況稱之為cache ...

資料庫訪問緩衝區的LRU與MRU演算法

資料庫訪問緩衝區的lru與mru演算法 1.cache hit and cache miss 當使用者第一次向資料庫發出查詢資料的請求的時候,資料庫會先在緩衝區中查詢該資料,如果要訪問的資料恰好已經在緩衝區中 我們稱之為cache hit 那麼就直接用緩衝區中讀取該資料.反之如果緩衝區中沒有使用者要...

輸入緩衝區與輸出緩衝區

本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...