OS- -内存之页面置换算法
生活随笔
收集整理的這篇文章主要介紹了
OS- -内存之页面置换算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OS- -內存之頁面置換算法
文章目錄
- OS- -內存之頁面置換算法
- 一、內存之頁面置換算法
- 1.最優頁面置換算法
- 2.最近未使用頁面置換算法
- 3.先進先出頁面置換算法
- 4.第二次機會頁面置換算法
- 5.時鐘頁面置換算法
- 6.最近最少使用頁面置換算法(LRU)
- 7.用軟件模擬LRU
- 8.工作集頁面置換算法
- 9.工作集時鐘頁面置換算法
- 10.頁面置換算法小結
一、內存之頁面置換算法
- 當發生缺頁異常時,操作系統會選擇一個頁面進行換出從而為新進來的頁面騰出空間。
- 如果要換出的頁 面在內存中已經被修改,那么必須將其寫到磁盤中以使磁盤副本保持最新狀態。如果頁面沒有被修改 過,并且磁盤中的副本也已經是最新的,那么就不需要進行重寫。那么就直接使用調入的頁面覆蓋需 要移除的頁面就可以了。
- 當發生缺頁中斷時,雖然可以隨機的選擇一個頁面進行置換,但是如果每次都選擇一個不常用的頁面會 提升系統的性能。如果一個經常使用的頁面被換出,那么這個頁面在短時間內又可能被重復使用,那么 就可能會造成額外的性能開銷
在關于頁面的主題上有很多頁面置換算法(page replacement algorithms),這些已經從理論上和實踐上得到了證明。
- 需要指出的是,頁面置換問題在計算機的其他領域中也會出現。例如,多數計算機把最近使用過的32 字節或者64字節的存儲塊保存在一個或多個高速緩存中。當緩存滿的時候,一些塊就被選擇和移除。
- 這些塊的移除除了花費時間較短外,這個問題同頁面置換問題完全一樣。之所以花費時間較短,是因為 丟掉的高速緩存可以從內存中獲取,而內存沒有尋找磁道的時間也不存在旋轉延遲。
- 第二個例子是Web服務器。服務器會在內存中緩存一些經常使用到的Web頁面。然而,當緩存滿了并 且已經引用了新的頁面,那么必須決定退出哪個Web頁面。
- 在高速緩存中的Web頁面不會被修改。因 此磁盤中的Web頁面經常是最新的,同樣的考慮也適用在虛擬內存中。在虛擬系統中,內存中的頁面 可能會修改也可能不會修改。
下面我們就來探討一下有哪些頁面置換算法。
1.最優頁面置換算法
最優的頁面置換算法很容易描述但在實際情況下很難實現。
- 它的工作流程如下:
- 在缺頁中斷發生時,這 些頁面將在下一條指令(包含該指令的頁面)上被引用。其他頁面則可能要到10、100或者1000 條指令后才會被訪問。每個頁面都可以用在該頁首次被訪問前所要執行的指令數作為標記。
- 最優化的頁面算法表明應該標記最大的頁面。如果一個頁面在800萬條指令內不會被使用,另外一個頁 面在600萬條指令內不會被使用,則置換前一個頁面,從而把需要調入這個頁面而發生的缺頁中斷推 遲。
計算機也像人類一樣,會把不愿意做的事情盡可能的往后拖。
- 這個算法最大的問題時無法實現。當缺頁中斷發生時,操作系統無法知道各個頁面的下一次將在什么時 候被訪問。這種算法在實際過程中根本不會使用。
2.最近未使用頁面置換算法
- 為了能夠讓操作系統收集頁面使用信息,大部分使用虛擬地址的計算機都有兩個狀態位,R和M,來和 每個頁面進行關聯。
- 每當引用頁面(讀入或寫入)時都設置R,寫入(即修改)頁面時設置M,這些 位包含在每個頁表項中,就像下面所示:
- 因為每次訪問時都會更新這些位,因此由硬件來設置它們非常重要。一旦某個位被設置為1,就會一 直保持1直到操作系統下次來修改此位。
- 如果硬件沒有這些位,那么可以使用操作系統的缺頁中斷和時鐘中斷機制來進行模擬。
- 當啟動一個進 程時,將其所有的頁面都標記為不在內存;一旦訪問任何一個頁面就會引發一次缺頁中斷,此時操作 系統就可以設置R位(在它的內部表中),修改頁表項使其指向正確的頁面,并設置為READ ONLY 模式,然后重新啟動引起缺頁中斷的指令。
- 如果頁面隨后被修改,就會發生另一個缺頁異常。從而允許操作系統設置M位并把頁面的模式設置為READ/WRITE。
- 可以用R位和M位來構造一個簡單的頁面置換算法:當啟動一個進程時,操作系統將其所有頁面的兩 個位都設置為0。R位定期的被清零(在每個時鐘中斷)。用來將最近未引用的頁面和已引用的頁面分 開。
- 當出現缺頁中斷后,操作系統會檢查所有的頁面,并根據它們的R位和M位將當前值分為四類:
- ?第0類:沒有引用R,沒有修改M
- ?第1類:沒有引用R,已修改M
- ?第2類:引用R,沒有修改M
- ?第3類:已被訪問R,已被修改M
- 盡管看起來好像無法實現第一類頁面,但是當第三類頁面的R位被時鐘中斷清除時,它們就會發生。時鐘中斷不會清除M位,因為需要這個信息才能知道是否寫回磁盤中。清除R但不清除M會導致出現 一類頁面。
- NRU(Not Recently Used)算法從編號最小的非空類中隨機刪除一個頁面。
- 此算法隱含的思想是, 在一個時鐘內(約20ms)淘汰一個已修改但是沒有被訪問的頁面要比一個大量引用的未修改頁面好, NRU的主要優點是易于理解并且能夠有效的實現。
3.先進先出頁面置換算法
- 另一種開銷較小的方式是使用FIF0(First-In,First-Out)算法,這種類型的數據結構也適用在頁 面置換算法中。
- 由操作系統維護一個所有在當前內存中的頁面的鏈表,最早進入的放在表頭,最新進入 的頁面放在表尾。
- 在發生缺頁異常時,會把頭部的頁移除并且把新的頁添加到表尾。
- 還記得缺頁異常什么時候發生嗎?我們知道應用程序訪問內存會進行虛擬地址到物理地址的映 射,缺頁異常就發生在虛擬地址無法映射到物理地址的時候。因為實際的物理地址要比虛擬地址 小很多,所以缺頁經常會發生。
- 先進先出頁面可能是最簡單的頁面替換算法了。在這種算法中,操作系統會跟蹤鏈表中內存中的所有 頁。
下面我們舉個例子看一下
- ?初始化的時候,沒有任何頁面,所以第一次的時候會檢查頁面1是否位于鏈表中,沒有在鏈表中,那么就是MISS ,頁面1進入鏈表,鏈表的先進先出的方向如圖所示。
- ?類似的,第二次會先檢查頁面2是否位于鏈表中,沒有在鏈表中,那么頁面2進入鏈表,狀態為 MISS ,依次類推。
- ?我們來看第四次,此時的鏈表為12 3,第四次會檢查頁面2是否位于鏈表中,經過檢索后, 發現2在鏈表中,那么狀態就是HIT ,并不會再進行入隊和出隊操作,第五次也是一樣的。
- ?下面來看第六次,此時的鏈表還是12 3,因為之前沒有執行進入鏈表操作,頁面5會首先進 行檢查,發現鏈表中沒有頁面5,則執行頁面5的進入鏈表操作,頁面2執行出鏈表的操作,執 行完成后的鏈表順序為235。
4.第二次機會頁面置換算法
- 我們上面學到的FIFO鏈表頁面有個缺陷,那就是出鏈和入鏈并不會進行check檢查,這樣就會容 易把經常使用的頁面置換出去(無法顯示熱點數據)
- 為了避免這一問題,我們對該算法做一個簡單的修改:我們檢查最老頁 面的R位,如果是0,那么這個頁面就是最老的而且沒有被使用,那么這個頁面就會被立刻換出。
- 如果R位是1,那么就清除此位,此頁面會被放在鏈表的尾部,修改它的裝入時間就像剛放進來的一 樣。然后繼續搜索。
- 這種算法叫做 第二次機會(second chance)算法,就像下面這樣,我們看到頁面A到H保留在鏈表 中,并按到達內存的時間排序。
- a)按照先進先出的方法排列的頁面;
- b)在時刻20處發生缺頁異常中斷并且A的R位已經設置時的 頁面鏈表。
- 假設缺頁異常發生在時刻20處,這時最老的頁面是A ,它是在0時刻到達的。如果A的R位是03 那么它將被淘汰出內存,或者把它寫回磁盤(如果它已經被修改過),或者只是簡單的放棄(如果它是 未被修改過)。
- 另一方面,如果它的R位已經設置了,則將A放到鏈表的尾部并且重新設置裝入時間 為當前時刻(20處),然后清除R位。然后從B頁面開始繼續搜索合適的頁面。
- 尋找第二次機會的是在最近的時鐘間隔中未被訪問過的頁面。如果所有的頁面都被訪問過,該算法就會 被簡化為單純的FIFO算法。
- 具體來說,假設圖a中所有頁面都設置了 R位。操作系統將頁面依次 移到鏈表末尾,每次都在添加到末尾時清除R位。
- 最后,算法又會回到頁面A,此時的R位已經被清 除,那么頁面A就會被執行出鏈處理,因此算法能夠正常結束。
5.時鐘頁面置換算法
- 即使上面提到的第二次頁面置換算法也是一種比較合理的算法,但它經常要在鏈表中移動頁面,既降低 了效率,而且這種算法也不是必須的。
- 一種比較好的方式是把所有的頁面都保存在一個類似鐘面的環形 鏈表中,一個表針指向最老的頁面。
如下圖所示:
- 當缺頁錯誤出現時,算法首先檢查表針指向的頁面,如果它的R位是。就淘汰該頁面,并把新的頁面插入到這個位置,然后把表針向前移動一位;如果R位是1就清除R位并把表針前移一個位置。重復這個過程直到找到了一個R位為0的頁面位置。
了解這個算法的工作方式,就明白為什么它被稱為 時 鐘(clokc)算法了。
6.最近最少使用頁面置換算法(LRU)
- 最近最少使用頁面置換算法的一個解釋會是下面這樣:在前面幾條指令中頻繁使用的頁面和可能在后面 的幾條指令中被使用。
- 反過來說,已經很久沒有使用的頁面有可能在未來一段時間內仍不會被使用。這 個思想揭示了一個可以實現的算法:在缺頁中斷時,置換未使用時間最長的頁面。這個策略稱為 LRU(Least Recently Used),最近最少使用頁面置換算法。
- 雖然LRU在理論上是可以實現的,但是從長遠看來代價比較高。為了完全實現LRU,會在內存中維護 —個所有頁面的鏈表,最頻繁使用的貞位于表頭,最近最少使用的貞位于表尾。
- 困難的是在每次內存引 用時更新整個鏈表。在鏈表中找到一個頁面,刪除它,然后把它移動到表頭是一個非常耗時的操作,即 使使用硬件來實現也是一樣的費時。
- 然而,還有其他方法可以通過硬件實現LRU。讓我們首先考慮最簡單的方式。這個方法要求硬件有一個 64位的計數器,它在每條指令執行完成后自動加1,每個頁表必須有一個足夠容納這個計數器值的域。
- 在每次訪問內存后,將當前的值保存到被訪問頁面的頁表項中。一旦發生缺頁異常,操作系統就檢查所 有頁表項中計數器的值,找到值最小的一個頁面,這個頁面就是最少使用的頁面。
7.用軟件模擬LRU
- 盡管上面的LRU算法在原則上是可以實現的,但是很少有機器能夠擁有那些特殊的硬件。
- 上面是硬件 的實現方式,那么現在考慮要用軟件來實現LRU。一種可以實現的方案是NFU(Not Frequently Used,最不常用)算法。
- 它需要一個軟件計數器來和每個頁面關聯,初始化的時候是0。在每個時鐘中 斷時,操作系統會瀏覽內存中的所有頁,會將每個頁面的R位(0或1)加到它的計數器上。
- 這個計數 器大體上跟蹤了各個頁面訪問的頻繁程度。當缺頁異常出現時,則置換計數器值最小的頁面。
- NFU最主要的問題是它不會忘記任何東西,想一下是不是這樣?例如,在一個多次(掃描)的編譯器 中,在第一遍掃描中頻繁使用的頁面會在后續的掃描中也有較高的計數。
- 事實上,如果第一次掃描的執 行時間恰好是各次掃描中最長的,那么后續遍歷的頁面的統計次數總會比第一次頁面的統計次數小。 結果是操作系統將置換有用的頁面而不是不再使用的頁面。
- 幸運的是只需要對NFU做一個簡單的修改就可以讓它模擬LRU,這個修改有兩個步驟:
- ?首先,在R位被添加進來之前先把計數器右移一位;
- ?第二步,R位被添加到最左邊的位而不是最右邊的位。
修改以后的算法稱為老化Caging)算法,下圖解釋了老化算法是如何工作的:
- 我們假設在第一個時鐘周期內頁面0-5的R位依次是1, 0, 1, 0, 1, 1,(也就是頁面0是1,頁 面1是0,頁面2是1這樣類推)。
- 也就是說,在0個時鐘周期到1個時鐘周期之間,0, 2, 4, 5 都被引用了,從而把它們的R位設置為1,剩下的設置為0。
- 在相關的六個計數器被右移之后R位被 添加到 左側,就像上圖中的a。剩下的四列顯示了接下來的四個時鐘周期內的六個計數器變化。
- CPU正在以某個頻率前進,該頻率的周期稱為時鐘滴答或時鐘周期。
- 一個10OMhz的處理器每 秒將接收100,000,000個時鐘滴答。
- 當缺頁異常出現時,將置換(就是移除)計數器值最小的頁面。如果一個頁面在前面4個時鐘周期內 都沒有被訪問過,那么它的計數器應該會有四個連續的0,因此它的值肯定要比前面3個時鐘周期內 都沒有被訪問過的頁面的計數器小。
這個算法與LRU算法有兩個重要的區別:看一下上圖中的e ,第三列和第五列
- 它們在兩個時鐘周期內都沒有被訪問過,在此之前的時鐘周期內都引用了兩個頁面。
- 根據LRU算法, 如果需要置換的話,那么應該在這兩個頁面中選擇一個。那么問題來了,我萌應該選擇哪個?
- 現在的問 題是我們不知道時鐘周期1到時鐘周期2內它們中哪個頁面是后被訪問到的。因為在每個時鐘周期內 只記錄了一位,所以無法區分在一個時鐘周期內哪個頁面最早被引用,哪個頁面是最后被引用的。
- 因 此,我們能做的就是置換頁面3 ,因為頁面3在周期0-1內都沒有被訪問過,而頁面5卻被引用 過。
- LRU與老化之前的第2個區別是,在老化期間,計數器具有有限數量的位(這個例子中是8位),這 就限制了以往的訪問記錄。
- 如果兩個頁面的計數器都是0,那么我們可以隨便選擇一個進行置換。實際 上,有可能其中一個頁面的訪問次數實在9個時鐘周期以前,而另外一個頁面是在1000個時鐘周期之 前,但是我們卻無法看到這些。
- 在實際過程中,如果時鐘周期是20 ms, 8位一般是夠用的。所以我們 經常拿20 ms來舉例。
8.工作集頁面置換算法
- 在最單純的分頁系統中,剛啟動進程時,在內存中并沒有頁面。此時如果CPU嘗試匹配第一條指令,就會得到一個缺貞異常,使操作系統裝入含有第一條指令的頁面。
- 其他的錯誤比如全局變量和堆棧 引起的缺貞異常通常會緊接著發生。一段時間以后,進程需要的大部分頁面都在內存中了,此時進程開 始在較少的缺頁異常環境中運行。這個策略稱為請求調頁(demand paging),因為頁面是根據需要被 調入的,而不是預先調入的。
- 在一個大的地址空間中系統的讀所有的頁面,將會造成很多缺貞異常,因此會導致沒有足夠的內存來容 納這些頁面。
- 不過幸運的是,大部分進程不是這樣工作的,它們都會以局部性方式(locality of reference)來訪問,這意味著在執行的任何階段,程序只引用其中的一小部分。
- 一個進程當前正在使用的頁面的集合稱為它的 工作集(working set),如果整個工作集都在內存中, 那么進程在運行到下一運行階段(例如,編譯器的下一遍掃面)之前,不會產生很多缺貞中斷。
- 如果內 存太小從而無法容納整個工作集,那么進程的運行過程中會產生大量的缺頁中斷,會導致運行速度也會 變得緩慢。
- 因為通常只需要幾納秒就能執行一條指令,而通常需要十毫秒才能從磁盤上讀入一個頁面。 如果一個程序每10 ms只能執行一到兩條指令,那么它將需要很長時間才能運行完。如果只是執行幾條指令就會產生中斷,那么就稱作這個程序產生了顛簸(thrashing)。
- 在多道程序的系統中,通常會把進程移到磁盤上(即從內存中移走所有的頁面),這樣可以讓其他進程 有機會占用CPU。
- 有一個問題是,當進程想要再次把之前調回磁盤的頁面調回內存怎么辦?從技術的 角度上來講,并不需要做什么,此進程會一直產生缺頁中斷直到它的工作集 被調回內存。
- 然后,每次 裝入一個進程需要20、100甚至1000次缺頁中斷,速度顯然太慢了,并且由于CPU需要幾毫秒時間 處理一個缺頁中斷,因此由相當多的CPU時間也被浪費了。
- 因此,不少分頁系統中都會設法跟蹤進程的工作集,確保這些工作集在進程運行時被調入內存。這個方 法叫做工作集模式(working set model)
- 它被設計用來減少缺頁中斷的次數的。在進程運行前首 先裝入工作集頁面的這一個過程被稱為 預先調頁(prepaging),工作集是隨著時間來變化的。
- 根據研究表明,大多數程序并不是均勻的訪問地址空間的,而訪問往往是集中于一小部分頁面。一次內 存訪問可能會取出一條指令,也可能會取出數據,或者是存儲數據。
- 在任一時刻t,都存在一個集合, 它包含所喲歐最近k次內存訪問所訪問過的頁面。這個集合w(k,t)就是工作集。因為最近k=1次 訪問肯定會訪問最近k>1次訪問所訪問過的頁面,所以w(k,t)是k的單調遞減函數。
- 隨著k的增 大,w(k,t)是不會無限變大的,因為程序不可能訪問比所能容納頁面數量上限還多的頁面。
- 事實上大多數應用程序只會任意訪問一小部分頁面集合,但是這個集合會隨著時間而緩慢變化,所以為 什么一開始曲線會快速上升而k較大時上升緩慢。
- 為了實現工作集模型,操作系統必須跟蹤哪些頁面在 工作集中。一個進程從它開始執行到當前所實際使用的CPU時間總數通常稱作當前實際運行時間。
- 進程的工作集可以被稱為在過去的t秒實際運行時間中它所訪問過的頁面集合。
- 下面來簡單描述一下工作集的頁面置換算法,基本思路就是找出一個不在工作集中的頁面并淘汰它。
下 面是一部分機器頁表:
- 因為只有那些在內存中的頁面才可以作為候選者被淘汰,所以該算法忽略了那些不在內存中的頁面。
- 每 個表項至少包含兩條信息:上次使用該頁面的近似時間和R (訪問)位。空白的矩形表示該算法不需要其他字段,例如頁框數量、保護位、修改位。
- 算法的工作流程如下:
- 假設硬件要設置R和M位。同樣的,在每個時鐘周期內,一個周期性的時鐘中 斷會使軟件清除Referenced(引用)位。在每個缺貞異常,頁表會被掃描以找出一個合適的頁面把它 置換。
- 隨著每個頁表項的處理,都需要檢查R位。如果R位是1,那么就會將當前時間寫入頁表項的 上次使 用時間域,表示的意思就是缺貞異常發生時頁面正在被使用。因為頁面在當前時鐘周期內被訪問過,那 么它應該出現在工作集中而不是被刪除(假設t是橫跨了多個時鐘周期)。
- 如果R位是0,那么在當前的時鐘周期內這個頁面沒有被訪問過,應該作為被刪除的對象。為了查看 是否應該將其刪除,會計算其使用期限(當前虛擬時間-上次使用時間),來用這個時間和t進行對 比。如果使用期限大于t,那么這個頁面就不再工作集中,而使用新的頁面來替換它。然后繼續掃描更 新剩下的表項。
- 然而,如果R位是0但是使用期限小于等于t,那么此頁應該在工作集中。此時就會把頁面臨時保存起 來,但是會記生存時間最長(即上次使用時間的最小值)的頁面。
- 如果掃描完整個頁表卻沒有找到適合 被置換的頁面,也就意味著所有的頁面都在工作集中。在這種情況下,如果找到了一個或者多個R = 0 的頁面,就淘汰生存時間最長的頁面。
- 最壞的情況下是,在當前時鐘周期內,所有的頁面都被訪問過了(也就是都有R = 1),因此就隨機選擇一個頁面淘汰,如果有的話最好選一個未被訪問的頁面,也就 是干凈的頁面。
9.工作集時鐘頁面置換算法
- 當缺頁異常發生后,需要掃描整個頁表才能確定被淘汰的頁面,因此基本工作集算法還是比較浪費時間 的。
- 一個對基本工作集算法的提升是基于時鐘算法但是卻使用工作集的信息,這種算法稱為 WSClock(工作集時鐘)。由于它的實現簡單并且具有高性能,因此在實踐中被廣泛應用。
與時鐘算法一樣,所需的數據結構是一個以頁框為元素的循環列表,就像下面這樣:
- 工作集時鐘頁面置換算法的操作:a)和b)給出R = 1時所發生的情形;c)和d)給出R = 0的例子
- 最初的時候,該表是空的。當裝入第一個頁面后,把它加載到該表中。隨著更多的頁面的加入,它們形 成一個環形結構。每個表項包含來自基本工作集算法的上次使用時間,以及R位(已標明)和M位 (未標明)。
- 與時鐘算法一樣,在每個缺頁異常時,首先檢查指針指向的頁面。如果R位被是設置為1,該頁面在當 前時鐘周期內就被使用過,那么該頁面就不適合被淘汰。
- 然后把該頁面的R位置為0,指針指向下一個 頁面,并重復該算法。該事件序列化后的狀態參見圖b。
- 現在考慮指針指向的頁面R = 0時會發生什么,參見圖c,如果頁面的使用期限大于t并且頁面為被訪 問過,那么這個頁面就不會在工作集中,并且在磁盤上會有一個此頁面的副本。
- 申請重新調入一個新的 頁面,并把新的頁面放在其中,如圖d所示。另一方面,如果頁面被修改過,就不能重新申請頁面,因 為這個頁面在磁盤上沒有有效的副本。
- 為了避免由于調度寫磁盤操作引起的進程切換,指針繼續向前 走,算法繼續對下一個頁面進行操作。畢竟,有可能存在一個老的,沒有被修改過的頁面可以立即使 用。
- 原則上來說,所有的頁面都有可能因為磁盤I/O在某個時鐘周期內被調度。為了降低磁盤阻塞,需要 設置一個限制,即最大只允許寫回n個頁面。一旦達到該限制,就不允許調度新的寫操作。
- 那么就有個問題,指針會繞一圈回到原點的,如果回到原點,它的起始點會發生什么?這里有兩種情 況:
?👏至少調度了一次寫操作
?👏沒有調度過寫操作 - 在第一種情況中,指針僅僅是不停的移動,尋找一個未被修改過的頁面。由于已經調度了一個或者多個 寫操作,最終會有某個寫操作完成,它的頁面會被標記為未修改。
- 置換遇到的第一個未被修改過的頁 面,這個頁面不一定是第一個被調度寫操作的頁面,因為硬盤驅動程序為了優化性能可能會把寫操作重 排序。
- 對于第二種情況,所有的頁面都在工作集中,否則將至少調度了一個寫操作。由于缺乏額外的信息,最 簡單的方法就是置換一個未被修改的頁面來使用,掃描中需要記錄未被修改的頁面的位置,如果不存在 未被修改的頁面,就選定當前頁面并把它寫回磁盤。
10.頁面置換算法小結
我們到現在已經研究了各種頁面置換算法,現在我們來一個簡單的總結,算法的總結歸納如下:
- ?最優算法在當前頁面中置換最后要訪問的頁面。不幸的是,沒有辦法來判定哪個頁面是最后一個要訪問的,因此實際上該算法不能使用。然而,它可以作為衡量其他算法的標準。
- ?NRU算法根據R位和M位的狀態將頁面分為四類。從編號最小的類別中隨機選擇一個頁面。 NRU算法易于實現,但是性能不是很好。存在更好的算法。
- ?FIFO會跟蹤頁面加載進入內存中的順序,并把頁面放入一個鏈表中。有可能刪除存在時間最長 但是還在使用的頁面,因此這個算法也不是一個很好的選擇。
- ?第二次機會算法是對FIFO的一個修改,它會在刪除頁面之前檢查這個頁面是否仍在使用。如果 頁面正在使用,就會進行保留。這個改進大大提高了性能。
- ?時鐘算法是第二次機會算法的另外一種實現形式,時鐘算法和第二次算法的性能差不多,但是會 花費更少的時間來執行算法。
- ?LRU算法是一個非常優秀的算法,但是沒有特殊的硬件(TLB)很難實現。如果沒有硬件,就不能使用LRU算法。
- ? NFU算法是一種近似于LRU的算法,它的性能不是非常好。
- ?老化算法是一種更接近LRU算法的實現,并且可以更好的實現,因此是一個很好的選擇
- ?最后兩種算法都使用了工作集算法。工作集算法提供了合理的性能開銷,但是它的實現比較復雜。WSClock是另外一種變體,它不僅能夠提供良好的性能,而且可以高效地實現。
總之,最好的算法是老化算法和WSClock算法。他們分別是基于LRU和工作集算法。
他們都具有良好 的性能并且能夠被有效的實現。還存在其他一些好的算法,但實際上這兩個可能是最重要的
總結
以上是生活随笔為你收集整理的OS- -内存之页面置换算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OS- -内存之虚拟内存
- 下一篇: OS- -I/O之I/O设备