記憶體管理筆記八 頁面置換演算法

2021-08-16 13:44:21 字數 3092 閱讀 8231

引言:在第七篇記憶體管理筆記,有介紹到分頁的記憶體管理。其克服了外部碎片、程式不能大於物理記憶體等缺點。本篇筆記將簡單介紹常見的頁面更換演算法思想。

一、頁面需更換的原因

在交換系統下,乙個程式作為乙個整體載入到記憶體。因此,在執行時,無需從磁碟上載入任何東西。而分頁系統下,乙個程式的所有頁面並不一定都在記憶體中,因此,在執行的過程中有可能發生頁面不在記憶體的情況。

如果訪問的頁面不在記憶體中,則系統將產生缺頁中斷。缺頁中斷服務將負責把磁碟上的資料載入到物理記憶體中來。如果物理記憶體還有空閒空間,那就直接使用空閒的頁面。但如果空閒頁面已滿,則需要挑選某個已經使用過的頁面進行替換。

二、頁面更換期待達到的目標

如果挑選的頁面是之後很快又要被訪問的頁面,那麼系統將很快再次產生缺頁中斷。因為磁碟的訪問速度遠遠低於記憶體的訪問速度,缺頁中斷的代價是非常巨大的。因此,挑選哪個頁面進行更換是有要求的

頁面更換時挑選頁面的目標是什麼呢?當然還降低隨後發生缺頁中斷的次數或者頻率。因此,我們選擇的頁面應當是隨後相當長時間內不會被訪問的頁面。

三、常見演算法的思想

3.1、隨機更換演算法

最不負責任的演算法是隨機更換演算法,在需要更換頁面的時候,產生乙個隨機頁面號,而替換與該頁面號對應的物理頁面號。這種演算法計算需要替換頁面號時速度很快,但是難以最小化隨後缺頁中斷次數。

3.2、先進先出演算法(fifo)

先進先出的實現機制是使用鍊錶將所有在記憶體的頁面按照進入時間的早晚,鏈結起來,然後每次置換鍊錶頭上的頁面就行了,新加進來的頁面則掛在鍊錶的末端。在下圖1中,如果下次需要尋找頁面來替換,a將成為替換頁面。

圖1、按照進入記憶體早晚構建的頁面鍊錶

fifo的優點是易於實現,但這個絕對公平的演算法容易降低效率。例如先載入進來的頁面是經常被訪問的頁面,這樣很可能將使用頻次高的頁面替換到磁碟上,導致很快發生缺頁中斷。

3.3、第二次機會演算法

由於fifo只考慮進入記憶體的時間,不關係乙個頁面被訪問的頻率,從而有可能造成替換掉乙個經常訪問的頁面而造成效率低下。那麼我們對fifo進行改進的方向就是考慮乙個頁面是否經常被訪問。

改進的手段就是在使用fifo更換乙個頁面時,需要看一下該頁面是否在最近被訪問過。若沒有訪問則替換,若被訪問過(通過檢視其訪問位的記憶體)則不替換,並且將該頁面掛到鍊錶末端,並將該頁面進入記憶體時間設定為當前時間,並將其訪問位清零,這樣,相當於給最近訪問過的頁面第二次機會

圖2、a獲得第二次機會,鏈**局變化

3.4、時鐘演算法

第二次機會演算法簡單、公平、易於實現。但是每次給予乙個頁面第二次機會時,將其轉移到鍊錶末端要耗費時間。另外每次訪問位要在頁面替換時進行掃瞄才可能清零,其時間局域性不好,訪問位為1的頁面可能是很久以前訪問的,其時間分辨粒度低。基於這些缺點,人們想出了時鐘演算法。

在時鐘演算法中,將頁面排成乙個始終的形狀(邏輯)。每次在更換頁面時,從時鐘指向的頁面開始檢查,如果當前頁面的訪問位為0,即從上次檢查到這次,該頁面沒有訪問過,將該頁面替換。如果當前頁面被訪問過,將其訪問位清0,並順時針移動至下乙個頁面,直到找到乙個訪問位為0的頁面。

圖3、時鐘演算法示意圖

第二次機會演算法使用的資料結構是鍊錶,這裡使用的是索引(整數指標)。時鐘演算法不需要額外的空間,更大的好處是頁面訪問位會定期清零,使得時鐘演算法的時間分辨粒度較第二次演算法更高,從而獲得更好的頁面替換效果。

3.5、最優更換演算法

前面介紹的四種演算法,沒有將替換頁面與其訪問頻次掛鉤,我們這樣很難選出乙個在今後很長時間內不會訪問的頁面。因此,需要對頁面的個體特性進行考慮,對不同訪問頻次的頁面區分對待。

最理想的頁面替換演算法是選擇乙個再也不會被訪問的頁面進行替換,如果不存在這樣的頁面,那至少選擇乙個在隨後最長時間不會被訪問的頁面,保證隨後發生缺頁中斷的次數最小。

3.5、最近未使用(not recently used, nru)演算法

nru就是選擇乙個最近一段時間內,沒有訪問過的頁面進行替換,作出這種選擇是基於程式訪問的時空局域性。依據時空局域性,乙個最近沒有訪問過的頁面,在隨後的時間內也不太可能被訪問,而nru的實現就是利用頁面的訪問和修改位。在下圖四種型別中,依次選擇。

圖4、按照訪問位和修改位取值將頁面分為4類

對第二種狀態的解釋,為什麼訪問位為0,而修改位為1:因為作業系統會定期對訪問位清0,而修改位不會。

3.6、lru(least recently used, lru)演算法

簡單講,其是nru的改進,不僅僅考慮最近是否使用,而且考慮最近使用的頻率。

lru演算法的實現必須以某種方式記錄每個頁面被訪問的次數,簡單的辦法就是在頁表的記錄項裡面增加乙個計數域,乙個頁面被訪問一次,則這個計數器的值加1。當然還有很多方式實現,lru,這裡不作為重點。

3.7、工作集群演算法

考慮到lru演算法實現,其需要對每個頁面保持某種記錄,並在每次頁面訪問時或週期性對這些記錄更新,造成時間空間成本高。工作集概念**於程式訪問的時空局域性,在一段時間內,程式訪問的頁面將侷限在一組頁面集合上。

例如,最近k次訪問均發生在某m個頁面上,那麼m就是引數為k時的工作集。用w(k, t)表示時間t時k次訪問所涉及的頁面數量。顯然隨著k的增長,w(k, t)的值將隨之增長,在k增長至某個數值後,w(k, t)值增長將及其緩慢甚至接近停滯,並維持一段時間。

圖5、工作集與最近訪問次數的關係

因此我們的目標就是維持當前的工作集的頁面在物理記憶體裡面。其優點是實現簡單,空間成本低,且時間成本不大。其實現機制這裡不作為重點。

3 2 3頁面置換演算法

程序執行時,若其訪問的頁面不在記憶體而徐將其調入,但記憶體已無空閒時間時,就需要從記憶體中調出一頁程式或資料,送入磁碟的對換區。而選擇調入頁面的演算法就稱為頁面置換演算法。好的頁面置換演算法應有較低的頁面更換頻率,也就是說,應將以後不會再訪問或者較長時間不會再訪問的頁面先調出。1.最佳置換演算法 o...

5 頁面置換演算法

目錄全域性頁面置換演算法 功能 當缺頁中斷發生,需要調入新的頁面而記憶體已滿時,選擇記憶體當中哪個物理頁面被置換 目標 盡可能減少頁面換入換出次數 即缺頁中斷次數 具體來說,把未來不再使用或短期內較少使用的頁面換出,通常只能在區域性性原理指導下依據過往統計資料 頁面鎖定 frame locking ...

記憶體頁面置換演算法

一丶 1.部分概念 記憶體抖動 每次頁面置換都要耗費很多時間 置換演算法呼叫選擇被置換的頁面 髒頁判定,寫會被置換的頁面 io中斷,寫入記憶體,磁碟尋道,讀寫速度相比cpu速度,其效率極低 多次頻繁的頁面置換,會使等待時間增長,cpu使用率降低,且多次讀寫,占用匯流排,也不利於其他程式執行,緩解記憶...