這三個置換演算法,或者說緩衝調度演算法,其實來源於作業系統。作業系統的頁置換演算法。
FIFO:即 First In, First Out 先進先出演算法。
LRU: Least recently used,最近最少使用演算法。即是將最近最少使用的對象踢出記憶體。
OPT: Optimal,最優替換,也就是上帝模式。它是考慮當前記憶體中的對象,以及將來要放進記憶體的對象,然後,將在最遠的將來才被訪問的頁面踢出記憶體。所以,這個演算法在轉換時,需要把將來即將放進記憶體的對象考慮進去,才能找到要踢出記憶體的對象。
看下面的詳細例子,瞭解演算法的具體策略。
考慮下述頁面走向:
1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6
當記憶體塊數量分別為3時,試問FIFO、LRU、OPT這三種置換演算法的缺頁次數各是多少?
答:缺頁定義為所有記憶體塊最初都是空的,所以第一次用到的頁面都產生一次缺頁。
當記憶體塊數量為3時:
發生缺頁中斷的次數為16。
在FIFO演算法中,先進入記憶體的頁面被先換出。當頁6要調入時,記憶體的狀態為4、1、5,考查頁6之前調入的頁面,分別為5、1、2、4,可見4為最先進入記憶體的,本次應換出,然後把頁6調入記憶體。
發生缺頁中斷的次數為15。
在LRU演算法中,最近最少使用的頁面被先換出。當頁6要調入時,記憶體的狀態為5、2、1,考查頁6之前調入的頁面,分別為5、1、2,可見2為最近一段時間內使用最少的,本次應換出,然後把頁6調入記憶體。
發生缺頁中斷的次數為11。 在 OPT 演算法中,在最遠的將來才被訪問的頁面被先換出。當頁 6 要調入時,記憶體的狀態為 1 、 2 、 5 ,考查頁 6 後面要調入的頁面,分別為 2 、 1 、 2 、 … ,可見 5 為最近一段時間內使用最少的,本次應換出,然後把頁 6 調入記憶體。
via: http://yinzhezq.blog.163.com/blog/static/1648628902010112961039187/
另外:
還有演算法:
LFU: Least Frequently Used,最不經常使用演算法。 它是根據在一段時間裡頁面被使用的次數選擇出最少使用的頁 。注意它與LRU的區別。
另外,OPT演算法通常是用來評價其他替換演算法的好壞的標準。本身無法實現。
via: http://wenda.tianya.cn/question/7885ae7b7cc29697
一些參考資料:
在Java中, 基於LinkedHashMap實現LRU緩衝調度演算法原理及應用 。搜下,有一堆文章:
如: http://www.cnblogs.com/-OYK/archive/2012/12/04/2801799.html
基於LRU改進的演算法也有很多:如:
http://www.cnblogs.com/cyjb/archive/2012/11/16/LruCache.html
緩衝的命中率
另一方面,當你自己去著手寫一個緩衝演算法,或者去使用一個的時候,或者去評價比較的時候,
我們要關注的就是緩衝的命中率問題。
如果你自己寫一個的話,那麼最好是類比一些資料,測試一下大概的命中率能有多大,再與其他演算法的命中率進行比較。
轉載:http://chen.junchang.blog.163.com/blog/static/6