在程序執行過程中,若其所要訪問的頁面不在記憶體而需把它們調入記憶體,但記憶體中已無空閒空間時,為了保證該程序能正常執行,
系統必須從記憶體中調出一頁程式或資料到磁碟的對換區中。但應將哪個頁面調出,需根據一定的演算法來實現。
常見的頁面置換演算法有:
1. 最佳置換演算法(optimal)
從記憶體中移除永遠都不再需要的頁面或者說是未來最長時間內不再被訪問的頁面,如果這樣的頁面存在,則選擇最長時間不需要訪問的頁面。採用最佳置換演算法,可以保證較低的頁面更新頻率。從理論上講,由於無法預知哪乙個頁面是未來最長時間內不再被訪問的,因而該演算法無法實現,但是可用來衡量其他演算法。
2.先進先出頁面置換演算法(fifo)
該演算法總是淘汰最早進入記憶體的頁面,即選擇在記憶體中停留時間最久的頁面予以淘汰。
這個演算法的實現簡單,只需要將程序已調入記憶體中的頁面,按照先後順序連線成乙個佇列,設定乙個替換指標,總是指向最老的頁面。
但是該演算法與程序實際的規律並不相適應,因為在程序中,有些頁面經常被訪問,比如:含有全域性變數、常用函式、例程等的頁面,fifo不能保證這些頁面不會被淘汰。
3.最近最久未使用頁面置換演算法(lru)
在之前的fifo演算法中,依據的是各個頁面調入記憶體的時間,這並不能反映頁面的真實使用情況。
而lru(latest recently used)是根據頁面調入記憶體之後的使用情況。
由於無法**頁面未來的情況,所以只能利用「最近的過去」來作為**未來的方法,lru選擇的是最近最久未使用的頁面予以淘汰。
該演算法賦予每個頁面乙個訪問字段,用來記錄乙個頁面從上次被訪問以來所經歷的時間t,當需要淘汰乙個頁面的時候,選擇現有頁面中t的值最大的頁面進行淘汰。
lru是一種優秀的頁面置換演算法,但是需要硬體的支援,為了了解乙個程序在記憶體中各個頁面各有多少時間未被程序訪問,以及如何快速地知道哪乙個頁面是最近最久未使用的頁面,需要暫存器+棧來支援。
(1)暫存器
為了記錄某程序在記憶體中各頁的使用情況,需要為每個在記憶體中的頁面設定乙個移位暫存器,可表示為:r=r(n-1)r(n-2)...r2r1r0,當程序訪問某物理塊時,要將相應暫存器的r(n-1)位置成1。此時,定時訊號將每隔一定時間(例如100ms)將暫存器右移一位。如果我們把n位暫存器的數看做是乙個整數,那麼具有最小數值的暫存器所對應的頁面,就是最近最久未使用的頁面。當發生缺頁時,首先將它置換出去。
(2)棧
可以利用一種特殊的棧來儲存當前使用的各個頁面的頁面號,每當程序訪問某頁面的時候,便將該頁面的頁面號從棧中移除,將它壓入棧頂。因此,棧頂始終是最新被訪問頁面的編號,棧底則是最近最久未訪問頁面的頁面號,當需要置換頁面的時候,將棧底對應的頁面置換出來。
4.clock置換演算法
當採用簡單clock演算法時,只需為每頁設定一位訪問位,再將記憶體中的所有頁面都通過鏈結指標鏈結成乙個迴圈佇列。
當某頁被訪問時,其訪問位被置為1。置換演算法在選擇一頁淘汰時,只需檢查頁的訪問位,如果是0,就選擇將該頁換出;若為1,則重新將它置0,暫不換出,而給該頁第二次駐留記憶體的機會,再按照fifo演算法檢查下乙個頁面。當檢查到佇列中的最後乙個頁面時,若其訪問位仍為1,則再返回到隊首去檢查第乙個頁面。由於該演算法是迴圈地檢查各頁面的使用情況,故稱為clock演算法。因該演算法只有一位訪問位,只能用它表示該頁是否已經使用過,而置換時是將未使用過的頁面換出去,又稱為最近未用演算法nru(not recently used)。
頁面置換演算法
常用的頁面置換演算法有三種 先進先出演算法fifo first in first out 該演算法的基本思想是首先淘汰那些駐留在主存時間最長的頁面。最近最久未用演算法 lru 該演算法的基本思想是 如果某一頁被訪問了,那麼它很可能馬上又被訪問 反之,如果某一頁很久沒被訪問,那麼最近也不會再訪問。lr...
頁面置換演算法
include using namespace std int process 100 頁面佇列 int memory 3 塊數 int optqueue 100 opt演算法的佇列 int fifoqueue 100 fifo演算法佇列 int lruqueue 100 lru演算法佇列 int ...
頁面置換演算法
位址對映過程中,若在頁面中發現所要訪問的頁面不再記憶體中,則產生缺頁中斷。當發生缺頁中斷時作業系統必須在記憶體選擇乙個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換演算法。常見的置換演算法有 1 最佳置換演算法 opt 理想置換演算法 這是一種理想情況下的頁...