LRU演算法 快取淘汰演算法

2021-08-02 00:05:42 字數 2167 閱讀 4605

lru(least recently used,最近最少使用)演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是「如果資料最近被訪問過,那麼將來被訪問的機率也很高」,反過來說「如果資料最近這段時間一直都沒有訪問,那麼將來被訪問的概率也會很低」,兩種理解是一樣的;常用於頁面置換演算法,是為虛擬頁式儲存管理服務的。

達到這樣一種情形的演算法是最理想的:每次調換出的頁面是所有記憶體頁面中最遲將被使用的;這可以最大限度的推遲頁面調換,這種演算法,被稱為理想頁面置換演算法。可惜的是,這種演算法是無法實現的。

為了儘量減少與理想演算法的差距,產生了各種精妙的演算法,最近最少使用頁面置換演算法便是其中乙個。lru 演算法的提出,是基於這樣乙個事實:在前面幾條指令中使用頻繁的頁面很可能在後面的幾條指令中頻繁使用。反過來說,已經很久沒有使用的頁面很可能在未來較長的一段時間內不會被用到 。這個,就是著名的區域性性原理——比記憶體速度還要快的cache,也是基於同樣的原理執行的。因此,我們只需要在每次調換時,找到最近最少使用的那個頁面調出記憶體。

注意:作業系統分頁處理使用的分頁排程演算法是lru演算法的近似實現:clock演算法

很明顯, 按照fifo演算法, 雖然乙個頁面被頻繁訪問, 它還是很有可能被置換出去。

演算法實現:

public

class

lrupageframe

}private

int capacity;//容量

private

int currentsize;

private node first;

private node last;

public

lrupageframe( int capacity )

/*** 獲得快取中的物件

*@param pagenum

*/public

void

access( int pagenum ) else

addnewnodetohead(node);} }

private node find( int data )

node = node.next;

}return

null;

}/**

* 移動到煉表頭,表示這個節點是最新使用過的

*@param node

*/private

void

moveexistingnodetohead( node node ) else

if( node == last ) else

node.prev = null;

node.next = first;

first.prev = node;

first = node;

}/**

* 刪除鍊錶尾部節點 表示 刪除最少使用的快取物件

*/private

void

removelast()

private

void

addnewnodetohead( node node ) else

this.currentsize ++;

}private

boolean

isempty()

public string tostring()

}return buffer.tostring();}}

測試用例:

public

class

lrupageframetest

}

只有三個物理頁面 邏輯頁面的訪問次序是:

快取淘汰演算法 LRU演算法

lru least recently used,最近最少使用 演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是 如果資料最近被訪問過,那麼將來被訪問的機率也更高 最常見的實現是使用乙個鍊錶儲存快取資料,詳細演算法實現如下 新資料插入到鍊錶頭部 每當快取命中 即快取資料被訪問 則將資料移到鍊錶...

快取淘汰演算法 LRU演算法

乙個用hash表作為底層結構的資料庫,當然少不了快取淘汰演算法。lru least recently used,最近最少使用 演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是 如果資料最近被訪問過,那麼將來被訪問的機率也更高 新資料插入到鍊錶頭部 每當快取命中 即快取資料被訪問 則將資料移到...

快取淘汰演算法 LRU

1.lru 1.1.原理 lru least recently used,最近最少使用 演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是 如果資料最近被訪問過,那麼將來被訪問的機率也更高 1.2.實現 最常見的實現是使用乙個鍊錶儲存快取資料,詳細演算法實現如下 1.新資料插入到鍊錶頭部 2....