功能:當缺頁中斷發生,需要調入新的頁面而內存已滿時,選擇內存當中哪個物理頁面被置換。
目標:盡可能地減少頁面的換進換出次數(即缺頁中斷的次數)。具體來說,把未來不再使用的或短期內較少使用的頁面換出,通常只能在局部性原理指導下依據過去的統計數據來進行預測
頁面鎖定(frame locking):用於描述必須常駐內存的操作系統的關鍵部分或時間關鍵的應用進程。實現的方法是:在頁表中添加鎖定標志位(lock bit)
記錄一個進程對頁訪問的一個軌跡
1.最優頁面置換算法:
基本思路-->當一個缺頁中斷發生時,對於保存在內存當中的每一個邏輯頁面,計算在它的下一次訪問之前,還需等待多長時間,從中選擇等待時間最長的那個,作為被置換的頁面。
這只是一種理想情況,在實際系統中是無法實現的,因為操作系統無從知道每一個頁面要等待多長時間以后才會再次被訪問。可用作其他算法的性能評價的依據(在一個模擬器上運行某個程序,並記錄每一次的頁面訪問情況,在第二遍運行時即可使用最優算法)。
置換的頁面是在將來最長時間不需要的頁面
2.先進先出算法:First-In First-Out,FIFO
基本思路-->選擇在內存中駐留時間最長的頁面並淘汰之。具體來說,系統維護着一個鏈表,記錄了所有位於內存當中的邏輯頁面。從鏈表的排列順序來看,鏈首頁面的駐留時間最長,鏈尾頁面的駐留時間最短。當發生一個缺頁中斷時,把鏈首頁面淘汰出局,並把新的頁面添加到鏈表的末尾。
性能較差,調出的頁面有可能是經常要訪問的頁面,並且有Belady現象。FIFO算法很少單獨使用。
Belady:給的物理頁幀越多反而可能出現更多的頁缺失
3.最近最久未使用算法:Least Recently Used, LRU
基本思路-->當一個缺頁中斷發生時,選擇最久未使用的那個頁面,並淘汰之。它是對最優頁面置換算法的一個近似,其依據是程序的局部性原理,即在最近一小段時間(最近幾條指令)內,如果某些頁面被頻繁地訪問,那么在將來的一小段時間內,它們還可能會再一次被頻繁地訪問。反過來說,如果在過去某些頁面長時間未被訪問,那么在將來它們還可能會長時間地得不到訪問。
LRU算法需要記錄各個頁面使用時間的先后順序,開銷比較大。兩種可能的實現方法是:
系統維護一個頁面鏈表,最近剛剛使用過的頁面作為首節點,最久未使用的頁面作為尾節點。每一次訪問內存時,找到相應的頁面,把它從鏈表中摘下來,再移動到鏈表之首。每次當缺頁中斷發生時,淘汰鏈表末尾的頁面。
設置一個活動頁面棧,當訪問某頁時,將此頁號壓入棧頂,然后,考察棧內是否有與此頁面相同的頁號,若有則抽出。當需要淘汰一個頁面時,總是選擇棧底的頁面,它就是最久未使用的。
4.時鍾頁面置換算法:Clock頁面置換算法,LRU的近似,對FIFO的一種改進
基本思路-->需要用到頁表項當中的訪問位,當一個頁面被裝入內存時,把該位初始化為0。然后如果這個頁面被訪問(讀/寫),則把該位置為1;把各個頁面組織成環形鏈表(類似鍾表面),把指針指向最老的頁面(最先進來);當發生一個缺頁中斷時,考察指針所指向的最老頁面,若它的訪問位為0,立即淘汰;若訪問位為1,則把該位置為0,然后指針往下移動一格。如此下去,直到找到被淘汰的頁面,然后把指針移動到它的下一格。
access bit;硬件完成;操作系統,定期置0
維持一個環形頁面鏈表保存在內存中:用一個時鍾(或者使用/引用)位來標記一個頁面是否經常被訪問;當一個頁面被引用的時候,這個位被設置(為1)
時鍾頭掃遍頁面尋找一個帶有used bit=0:替換在一個周轉內沒有被引用過的頁面。

5.二次機會法:優先換出只讀頁,使得被寫入的頁換出機會減少

6.最不常用算法:Least Frequently Used,LFU
基本思路-->當一個缺頁中斷發生時,選擇訪問次數最少的那個頁面,並淘汰之
對每個頁面設置一個訪問計數器,每當一個頁面被訪問時,該頁面的訪問計數器加1。在發生缺頁中斷時,淘汰計數值最小的那個頁面
LRU和LFU的區別:LRU考察的是多久未訪問,時間越短越好;而LFU考察的是訪問的次數或頻度,訪問次數越多越好。
問題:一個頁面在進程開始時使用得很多,但以后就不使用了,實現也費時費力。
解決方法:定期把次數寄存器右移一位。
局部頁面置換算法:針對一個進程


