页面置换算法(二)
咳咳,書接上文,這篇講非常 難 重要的兩個算法LRU和工作集,以及它們的一些改進算法,希望我能給你們講清楚吧~
LRU
上文提過一點點,LRU和最優算法是剛好相對的,LRU就是Least Recently Used,最近最少使用,其實就是往回看,看前面哪個沒有被訪問過就替換哪個。比如2,4,3,2,3,6,假設頁框最多有三個,當6想要去替換時,此時要從2,4,3中替換掉一個,往回看2和3都被訪問過,于是就替換掉4。思路清楚了,接下來實現的算法。
實現方法1:
64位全局計數器C,每一頁也對應一個64位計數器
每條指令執行完后C自動加1,
在每次訪問內存后,將當前的C值保存到被訪問頁面的頁表項中。
需要置換時:找到值最小的一個頁面。
實現方法2:
有訪問位R和修改位M,初始0
定期讓所有的頁面R置0
置換的優先級: (0,0) (0,1) (1,0) (1,1)
隨機從優先級最小的非空類中選擇一頁置換
這里是不是非常像改進型時鐘算法,不同的是不需要找不到(0,1)之后把R置0,而是繼續按照優先級往下找,只需要定期把所有的R置0即可,這也是為什么會出現(0,1)的原因(沒有訪問卻有修改)
最不常用(NFU)
模擬LRU第一種實現方法,不需要過多硬件支持
? 一頁對應一個計數器,初值為0。
? 頁表項中有訪問位R
? 每次時鐘中斷時,計數器=計數器+R
? 需要置換時:選擇計數器值最小的一頁
注意:計數器不用放在頁表中
問題:之前經常使用的頁由于一直不換出去導致對應計數器的值一直增大
老化算法
? 在最不常用算法基礎上進行修改:
首先,在R位被加進之前先將計數器右移一位
其次,將R位加到計數器最左端的位而不是最右端的位
這是最接近最近最少使用算法(LRU)算法的一種。
總結