操作系统——页面置换算法
一、頁面置換算法簡介
操作系統將內存按照頁的進行管理,在需要的時候才把進程相應的部分調入內存。當產生缺頁中斷時,需要選擇一個頁面寫入。如果要換出的頁面在內存中被修改過,變成了“臟”頁面,那就需要先寫會到磁盤。頁面置換算法,就是要選出最合適的一個頁面,使得置換的效率最高。頁面置換算法有很多,簡單介紹幾個。
二、n種算法介紹
2.1 Optimal算法(最優算法)
首先介紹最優算法,它需要知道以后要被用到的頁,然后將不會被用到的頁換出內存;如果所有頁都會被用到,就把需要使用時間離現在最長的頁換出,以盡量使不好的情況晚發生。這種方法能使系統獲得最佳性能,但是,它是不可能實現的…因為當前無法獲知以后哪些頁要被用到。不過最優算法還是能夠作為其他算法優秀程度的衡量。
例:假定系統為某進程分配了三個物理塊,并考慮有以下的頁面號引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
進程運行時,先將 7,0,1 三個頁面裝入內存。以后,當進程要訪問頁面 2 時,將會產生缺頁中斷。此時 OS 根據最佳置換算法,將選擇頁面 7 予以淘汰。這是因為頁面 0 將作為第 5 個被訪問的頁面,頁面 1 是第 14 個被訪問的頁面,而頁面 7 則要在第 18 次頁面訪問時才需調入。下次訪問頁面 0 時,因它已在內存而不必產生缺頁中斷。當進程訪問頁面 3時,又將引起頁面 1 被淘汰;因為,它在現有的 1,2,0 三個頁面中,將是以后最晚才被訪問的。圖 4-26 示出了采用最佳置換算法時的置換圖。由圖可看出,采用最佳置換算法發生了 6 次頁面置換。
2.2 FIFO(First-In First-Out,先進先出)算法
FIFO算法的思想很簡單,就是置換出當前已經待在內存里時間最長的那個頁。FIFO算法的運行速度很快,不需要考慮其他的因素,需要的開銷很少。但是正是由于沒有考慮頁面的重要性的問題,FIFO算法很容易將重要的頁換出內存。
例:同上。當進程第一次訪問頁面 2 時,將把第 7 頁換出,因為它是最先被調入內存的;在第一次訪問頁面 3 時,又將把第 0 頁換出, 因為它在現有的 2, 0, 1 三個頁面中是最老的頁。 由圖 4-27 可以看出,利用 FIFO 算法時進行了 12 次頁面置換,比最佳置換算法正好多一倍。
2.3 Second Chance(第二次機會)算法
為了避免FIFO算法將重要的頁換出內存,Second Chance算法提供了一些改進。Second Chance算法在將頁面換出內存前檢查其使用位(使用位前文有介紹),如果其使用位為1,證明此頁最近有被使用,猜測它還可能被使用,于是不把它置換出內存,但是把其使用位置為0,隨后檢查下一個頁面,直到發現某頁的使用位為0,將此頁置換出內存。
2.4 Clock算法(時鐘輪轉法)
為了節約Second Chance算法一個接著一個檢查使用位的開銷,時鐘輪轉法又提出了改進。時鐘輪轉法將所有的頁組成一個圓,圓心的指針指向下一個要被置換的頁面,置換前同樣檢查使用位,如果使用位為1,同樣將其使用位置為0,隨后將順指針旋轉,檢查下一個頁面,直到發現某頁的使用位為0,將此頁置換出內存。很容易理解此算法為什么叫“時鐘”輪轉法。
圖示:
此時2號頁是下一個要被置換出內存的頁,置換時如果發現其使用位為1,則將使用位置0后順時針旋轉指針檢查1號頁。
2.5 LRU(Least Recent Used, 最近最少使用)算法
為獲得對最優算法的模擬,提出了LRU算法。由于當前時間之后需要用到哪些頁無法提前獲知,于是記錄當前時間之前頁面的使用情況,認為之前使用過的頁面以后還會被用到。在置換時,將最近使用最少的頁面換出內存。此種方法的開銷比較大。
例:同上。當進程第一次對頁面 2 進行訪問時,由于頁面 7 是最近最久未被訪問的,故將它置換出去。當進程第一次對頁面 3進行訪問時,第 1 頁成為最近最久未使用的頁,將它換出。由圖可以看出,前 5 個時間的圖像與最佳置換算法時的相同,但這并非是必然的結果。因為,最佳置換算法是從“向后看”的觀點出發的,即它是依據以后各頁的使用情況;而 LRU 算法則“向前看”的,即根據各頁以前的使用情況來判斷,而頁面過去和未來的走向之間并無必然的聯系。
2.6 Linux使用的頁面置換算法
Linux區分四種不同的頁面:不可回收的、可交換的、可同步的、可丟棄的。
不可回收的:保留的和鎖定在內存中的頁面,以及內核態棧等。
可交換的:必須在回收之前寫回到交換區或者分頁磁盤分區。
可同步的:若為臟頁面,必須要先寫回。
可丟棄的:可以被立即回收的頁面。
Linux并沒有像我們之前單純討論算法時那樣,在缺頁中斷產生的時候才進行頁面回收。Linux有一個守護進程kswapd,比較每個內存區域的高低水位來檢測是否有足夠的空閑頁面來使用。每次運行時,僅有一個確定數量的頁面被回收。這個閾值是受限的,以控制I/O壓力。
每次執行回收,先回收容易的,再處理難的。回收的頁面會加入到空閑鏈表中。
算法是一種改進地LRU算法,維護兩組標記:活動/非活動和是否被引用。第一輪掃描清除引用位,如果第二輪運行確定被引用,就提升到一個不太可能回收的狀態,否則將該頁面移動到一個更可能被回收的狀態。
處于非活動列表的頁面,自從上次檢查未被引用過,因而是移除的最佳選擇。被引用但不活躍的頁面同樣會被考慮回收,是因為一些頁面是守護進程訪問的,可能很長時間不再使用。
另外,內存管理還有一個守護進程pdflush,會定期醒來,寫回臟頁面;或者可用內存下降到一定水平后被內核喚醒。
2.7 NRU(Not Recent Used, 最近未使用)算法
前面提到修改位和使用位,NRU算法利用這兩個標志位將所有頁幀分為4組:
第0組:修改位和使用位都為0;
第1組:修改位為0,使用位為1;
第2組:修改位為1,使用位為0;
第3組:修改位和使用位都為1。
NRU算法從組數最小的一組中隨機選擇一個頁面將其移出內存。可能有人會發現第2組這種情況根本不會出現,如果一個頁幀被修改,其修改位會被置1,同時它也被使用了,其使用位也會被置1;即不會出現被修改但是沒有被使用的情況。真實情況是,頁幀的使用位會被定時清零,這樣第3組經過一次清零就會變成第2組。這也符合“最近”未使用,即很久以前被使用的頁幀被清零了,不在統計范圍內,只要“最近”沒有被使用,就很有可能被移出。
NRU算法不是最好的,但是它使用起來開銷很小,用較小的代價就得到了不錯的效果,不失為一種不錯的算法。
三、代碼實現
//TODO總結
以上是生活随笔為你收集整理的操作系统——页面置换算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 血项高是什么意思
- 下一篇: java信息管理系统总结_java实现科