【作業系統】虛擬儲存器--頁面置換演算法
頁面置換演算法是用來選擇換出頁面的演算法。
頁面置換演算法的優劣直接影響到系統的效率,若選擇不合適,可能會出現抖動(Thrashing)現象。
抖動:剛被淘汰出記憶體的頁面,過後不久又要訪問它,需要再次將其調入,而該頁調入記憶體後不久又再次被淘汰出記憶體,然後又要訪問它,如此反覆,使得系統把大部分時間用在了頁面的調進換出上,這種現象稱為抖動。
最佳置換演算法 OPT
最佳置換演算法 OPT
選擇永遠不再需要的頁面或最長時間以後才需要訪問的頁面予以淘汰。
最佳置換演算法是一種理想化的演算法,效能最好,實際上這種演算法無法實現,因為頁面訪問的未來順序很難精確預測,但可用該演算法評價其它演算法的優劣。
例:假定系統為某程序分配了3個物理塊,程序執行時的頁面走向為 1,2,3,4,1,2,5,1,2,3,4,5,開始時 3 個物理塊均為空,計算採用最佳置換演算法時的缺頁率?
簡單解釋一下:
由於開始物理塊為空,所以最開始,1 2 3,都缺,當要將4調入時,由於3個物理塊已滿,所以需要換出,換出規則是選擇永遠不再需要的頁面或最長時間以後才需要訪問的頁面予以淘汰 而1 2 將要用到,所以將3換出,一次類推。
先進先出置換演算法 FIFO
先進先出置換演算法 FIFO
選擇先進入記憶體的頁面予以淘汰。
例:假定系統為某程序分配了3 個物理塊,程序執行時的頁面走向為 1,2,3,4,1,2,5,1,2,3,4,5,開始時 3 個物理塊均為空,計算採用先進先出置換演算法時的缺頁率?
簡單解釋一下:
由於開始物理塊為空,所以最開始,1 2 3,都缺,當要將4調入時,由於3個物理塊已滿,所以需要換出,換出規則是選擇先進入記憶體的頁面予以淘汰 而1為最先調入的,所以將1換出,一次類推。
例:假定系統為某程序分配了4 個物理塊,程序執行時的頁面走向為 1,2,3,4,1,2,5,1,2,3,4,5,開始時 4 個物理塊均為空,計算採用先進先出置換演算法時的缺頁率?
例:假定系統為某程序分配了5 個物理塊,程序執行時的頁面走向為 1,2,3,4,1,2,5,1,2,3,4,5,開始時 5 個物理塊均為空,計算採用先進先出置換演算法時的缺頁率?
先進先出置換演算法的出發點是最早調入記憶體的頁面,其不再被訪問的可能性會大一些。
被置換的頁可能含有一個初始化程式段,用過後再也不會用到;但也可能含有一組全域性變數,初始化時被調入記憶體,在整個程式執行過程中都將會用到。
FIFO 演算法易於理解與程式設計,但它的效率不高。
Belady 異常現象
先進先出演算法存在一種異常現象,即在某些情況下會出現分配給程序的物理塊數增多,缺頁次數有時增加,有時減少的奇怪現象,這種現象稱為 Belady 異常現象(Belady’s Anomaly) 。
例題
溫馨提示:以下為動圖,注意觀察
最近最久未使用演算法(LRU)
最近最久未使用演算法 LRU
選擇最近一段時間最長時間沒有被訪問過的頁面予以淘汰。
演算法的出發點:如果某個頁面被訪問了,則它可能馬上還要訪問。如果很長時間未被訪問,則它在最近一段時間也不會被訪問。
該演算法的效能接近於最佳演算法,但實現起來較困難。因為要找出最近最久未使用的頁面,必須為每一頁設定相關記錄項,用於記錄頁面的訪問情況,並且每訪問一次頁面都須更新該資訊。這將使系統的開銷加大,所以在實際系統中往往使用該演算法的近似演算法。
例:假定系統為某程序分配了3 個物理塊,程序執行時的頁面走向為 1,2,3,4,1,2,5,1,2,3,4,5,開始時 3 個物理塊均為空,計算採用最近最久未使用演算法時的缺頁率?
簡單解釋一下:
由於開始物理塊為空,所以最開始,1 2 3,都缺,當要將4調入時,由於3個物理塊已滿,所以需要選擇換出,換出規則是選擇最近一段時間最長時間沒有被訪問過的頁面予以淘汰 而2 3剛剛訪問過,所以將1換出,一次類推。
最近最久未使用演算法的硬體支援
LRU 置換演算法雖然是一種比較好的演算法,但實現開銷很大,必須有硬體的支援。
1.暫存器
為了記錄某個程序在記憶體中各頁的使用情況,為每個在記憶體中的頁面配置一個移位暫存器,可表示為
每當程序訪問某頁面時,將該頁面對應暫存器的最高位(R n−1 ) 置 1,系統定期 (如 100ms) 將暫存器右移一位並將最高位補 0,如果把 n 位暫存器的數看作是一個整數,於是暫存器數值最小的頁面是最久未使用的頁面。
2.棧
利用一特殊的棧儲存當前使用的頁號,每當程序訪問某頁面時,把被訪問頁面移到棧頂,於是棧底的頁面就是最久未使用的頁面。
最近最少使用置換演算法(LFU)
最近最少使用置換演算法 LFU
選擇在最近時期使用最少的頁面為淘汰頁。
LFU 置換演算法為在記憶體中的每個頁面設定一個移位暫存器來記錄該頁面被訪問的頻率。
LRU 與 LFU 的區別
LRU 是最近最久未使用頁面置換演算法 (Least Recently Used),也就是首先淘汰最長時間未被使用的頁面。
LFU 是最近最少使用置換演算法 (Least Frequently Used),也就是淘汰一定時期內被訪問次數最少的頁。
例如,程序分配了 3 個物理塊,若所需頁面走向為2 1 2 1 2 3 4(請求頁面 4 時會發生缺頁中斷)
按 LRU 演算法, 應換頁面 1(1 頁面最近最久未被使用) 。
但按 LFU 演算法應換頁面 3(頁面 3 最近最少使用,最近只使用了一次) 。
LRU 是看時間長短,而 LFU 是看使用頻率。
Clock 置換演算法
Clock 置換演算法是 LRU 和 FIFO 的折衷(LRU 的近似演算法,減少硬體消耗) 。也稱為最近未使用演算法 (NotRecently Used,NRU)
該演算法為每頁設定一個訪問位,並將記憶體中的所有頁連結成一個迴圈佇列。當某頁被訪問時,其訪問位被置 1。
置換演算法在選擇一頁淘汰時,只需檢查頁的訪問位。如果是 0,就選擇該頁換出;若為 1,則重新將它置 0,暫不換出,而給該頁第二次駐留記憶體的機會,再按照FIFO 演算法檢查下一個頁面(迴圈,不是回到隊首) 。
當檢查到佇列中的最後一個頁面時,若其訪問位仍為1,則再返回到隊首去檢查第一個頁面。
假如某個頁被頻繁訪問,那麼它就不會被置換出去
5位置有點繞,那就解釋一下嘍:
當調入5時,2,3,1訪問位都為1,就按順序,將2置0,3置0,1置0,然後再重頭開始,2訪問位,此時為0,則淘汰,將5調入,並將訪問位置1。
改進型 Clock 置換演算法
改進型 Clock 置換演算法:除須考慮頁面的使用情況外,還增加一個因素,即置換代價,這樣選擇頁面換出時,既要是未使用過的頁面,又要是未被修改過的頁面。
由訪問位 A 和修改位 M 可以組合成下面四種類型的頁面:
- 從指標所指示的當前位置開始掃描迴圈佇列,尋找 A=0且 M=0 的第一類頁面,將所遇到的第一個頁面作為所選中的淘汰頁。在第一次掃描期間不改變訪問位 A。
- 如果第一步失敗,開始第二輪掃描,尋找 A=0 且 M=1的第二類頁面,將所遇到的第一個這類頁面作為淘汰頁。在第二輪掃描期間,將所有掃描過的頁面的訪問位都置 0。
- 如果第二步也失敗,則將指標返回到開始的位置,並將所有的訪問位復 0。然後重複第一步,如果仍失敗,必要時再重複第二步。
雙指標 Clock 置換演算法
雙指標 Clock 置換演算法:定時淘汰頁面。前指標清除訪問位,後指標淘汰頁面。
影響頁面換入換出效率的若干因素
- 頁面置換演算法。
- 回寫磁碟的頻率。已經被修改過的頁面,換出時應當回寫磁碟。如果建立一個已修改換出頁面連結串列,可以暫不回寫。當達到一定數目後,再將它們一起寫入磁碟,這樣能大大減少 I/O 操作的次數。
- 讀入記憶體的頻率。已修改換出頁面連結串列上的頁面在回寫前,如果需要被再次訪問,就不需要從外存調入,直接從連結串列中獲取。
頁面緩衝演算法 PBA
頁面緩衝演算法:用 FIFO 演算法選擇被置換頁,選擇換出的頁面不是立即換出,而是放入兩個連結串列之一,如果頁面未被修改,就將其歸入到空閒頁面連結串列的末尾,否則將其歸入已修改頁面連結串列末尾。
這些空閒頁面和已修改頁面會在記憶體中停留一段時間。如果這些頁面被再次訪問,只需將其從相應連結串列中移出,就可以返回程序,從而減少一次 I/O 開銷。
需調入新頁,則將新頁讀入到空閒頁面連結串列的第一個頁面中,然後將其從該連結串列中移出。
當已修改的頁面達到一定數目後,再將它們一起寫入磁碟。這樣能大大減少 I/O 操作的次數。
頁面置換演算法的比較
訪問記憶體的有效時間 EAT
被訪問頁面在記憶體,且對應的頁表項在快表中。設訪問快表的時間為 λ,訪問記憶體的時間為 t。
被訪問頁面在記憶體,但對應的頁表項不在快表中。這種情況不缺頁,但需兩次訪問記憶體。一次讀頁表,並更新快表,一次讀資料。
更新快表 λ 與讀資料t可並行。
被訪問頁面不在記憶體。缺頁。設缺頁中斷處理時間為 ϵ。
上面的幾種討論沒有考慮快表的命中率和缺頁率等因素。
如果考慮快表的命中率 a和缺頁率 f
如果不考慮快表,僅考慮缺頁率 f,即令上式中 λ = 0
和 a = 0,