操作系統筆記(六)頁面置換算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次機會法


前篇在此: 
操作系統筆記(五) 虛擬內存,覆蓋和交換技術 
操作系統 筆記(三)計算機體系結構,地址空間、連續內存分配(四)非連續內存分配:分段,分頁

內容不多,就不做index了。

功能:當缺頁中斷發生時,需要調入新的頁面而內存已滿時,需要選擇哪個物理頁面被置換? 
目標:盡可能減少缺頁中斷(頁面的換入換出)次數。在局部性原理下根據過去的數據統計預測。 
頁面鎖定(frame locking):用於描述必須常駐內存的操作系統的關鍵部分,或時間關鍵的應用進程(time-critical)。需要在頁表中添加鎖定標志位(lock bit)

比較不同的頁面置換算法: 
設置一個實驗環境,記錄一個進程對頁訪問的軌跡。 
虛擬地址跟蹤(3,0) (1,9) (4,1)…… 
偏移可忽略,只用頁號生成頁面軌跡3,1,4 …… 
模擬一個頁面置換的行為並且記錄產生缺頁的數量,越少越好 

(1) 最優界面置換算法: 
選擇內存中等待時間最長的頁作為置換頁面。 
只能是理想情況,OS不知道啊。 
可以作為最佳的標准,在第二遍運行時利用第一次的訪問軌跡使用最優算法。其他算法應盡量逼近。 
這里寫圖片描述


(2) 先進先出算法 first-in first-out FIFO 
選擇在內存中駐留時間最長的頁面並淘汰之。OS維護着一個隊列鏈表,淘汰首位,添加末位。 
性能較差,調出的頁面可能是常用頁面(駐留時間長,本身就說明可能常用),有belady現象(給的物理頁幀越多反而缺頁越頻繁)。 
FIFO belady現象:分配的物理頁數增加,缺頁率反而提高,原因是FIFO忽視了進程訪問的動態特征。多次訪問的不要走。尤其是最壞情況發生時,易高缺頁率。 
Belady 是個人名,不要想多了。。。 
很少單獨使用

這里寫圖片描述 

(3)  最近最久未使用算法least recently used LRU 
選擇最久未使用的那個頁面淘汰掉。 
是對最優置換算法的近似,以過去推未來。根據程序的局部性原理,如果最近一段時間內某些頁面被頻繁訪問,那么在將來還可能被頻繁訪問。反之,未被訪問的將來也不會被訪問。 
程序應具有較好的局部性。 
LRU算法示意圖


需要記錄各個頁面使用時間的先后順序,開銷大。 
兩種可能的實現方法: 
系統維護一個頁面鏈表,最近剛使用的頁面最為首節點,最久未使用的頁面作為尾節點,每次訪問內存動態更新頭結點。缺頁中斷時,淘汰末位的頁面。 
活動頁面堆棧:訪問某頁時,將此頁號入棧,並去除棧內的重復頁。淘汰棧底的頁面。(棧是先進后出,只有棧頂開口,怎么push棧底?)

動態更新(插,刪,內部調整)堆棧和鏈表要開銷,注意平衡—不是最有效

(4)  時鍾頁面置換算法 clock ——LRU的近似,FIFO的改進 
用到頁表項的訪問位(access bit),當一個頁面被裝入內存時,把該位初始化為0,被訪問(讀/寫)時,硬件把它置為1. 而OS會定期清0。(1—最近被訪問,0—-未訪問) 
把各個頁面組成環形鏈表類似一個clock,指針指向最老的頁面。 
當發生一個缺頁中斷時,考察指針所指的最老頁面,訪問位是0則淘汰,如果是1則置為0,然后指針向下移動一格。如此下去直到淘汰某頁。 
在內存中維持一個環形頁面鏈表,更新並刪除used bit=0的頁面 
這里寫圖片描述替換的應該是PAGE=1,把需要的新頁面放到物理幀號為5的位置

(5)二次機會法 
區分讀和寫,enhanced clock algorithm 
讀和寫都是訪問,dirty bit是寫位,如果寫,為1,否則是0。同時使用臟位和使用位。 
修改clock算法,使它允許臟頁總是在一次時鍾頭掃描時保留下來,以減少寫回硬盤的操作(僅讀的頁可以直接釋放) 
需要替換的頁,其訪問位和臟位都是0,如果都是 1,則有兩次機會才被淘汰。從而讓更多使用頻率的頁有更多的機會留在內存中。 
較為接近LRU算法,盡量保存dirty page,更好地減少了訪問外存

這里寫圖片描述 

(6)最不常用算法(least frequently used)LFU 
選擇置換訪問次數最少的那個頁面 
對每個頁面設置訪問計數器,每當一個頁面被訪問時,++。淘汰數值最小的那個。 
硬盤計數器空間開銷,排序查找時間開銷;

LRU/LFU區別:LRU考察的是多久未訪問,時間越短越值得留在內存,LFU是訪問次數/頻度,次數越多越好。 
反例:一個頁面在進程開始時使用的很多,但以后就不使用了。此時LFU就不適用了。 
把時間也考慮進去,在一段時間內考察LFU。比如,定期把次數寄存器右移一位。

綜合比較局部頁替換算法 
都是 針對一個程序 站在算法角度本身考慮

LRU和FIFO本質都是先進先出,但LRU是頁面的最近訪問時間而不是進入內存的時間,有動態調整,符合棧算法的特性,空間越大缺頁越少。如果程序局部性,則LRU會很好。如果內存中所有頁面都沒有被訪問過會退化為FIFO。 
Clock 和enhanced clock也是類似於FIFO的算法,但用了硬件的BIT來模擬了訪問時間和順序,近似了LRU,綜合起來較好,但也會退化為FIFO。 
都對程序的訪問次序有局部性的要求,不然都會退化。 
開銷上,LRU開銷大,FIFO開銷小但BELADY,折中的是clock算法,開銷較小,對內存中還未被訪問的頁面,效果等同LRU。對曾經被訪問過的則不能記住其准確位置。

全局置換算法 
局部頁替換算法的問題、工作集模型 
分配的物理頁幀的數目對置換算法的效果有很大的影響。 
程序的運行具有階段性,是動態變化的過程,開頭結尾較多,中間較少,都分配固定的物理頁幀則失去了靈活性。

工作集模型: 
如果局部性原理不成立,那各種算法都沒啥區別,比如是單調遞增,那不管哪種都會缺頁中斷。 
利用工作集模型來表征局部性。 
工作集(working set):一個進程當前使用的邏輯頁面集合 
可以用一個二元函數W(t,Δ),t是當前執行時刻,Δ是工作集窗口 working-set window,一個定長的頁面訪問的時間窗口。t+Δ構成了一個時間段,W(t,Δ)就是在當前時刻t之前的Δ時間內所有訪問頁面組成的集合,在隨t不斷更新。| W(t,Δ)|是工作集的大小即頁面數目。 
進程開始后,隨着訪問新頁面逐步建立較穩定的工作集,當內存訪問的局部性區域的位置大致穩定時| W(t,Δ)|波動很小,在過渡階段,則會快速擴張和收縮過渡到下一個穩定值。有波峰,有波谷。

常駐集:在當前時刻,進程實際駐留在內存當中的頁面集合。 
工作集是固有性質,常駐集取決於系統分配給進程的物理頁面數目和所采用的置換算法。如果一個進程的常駐集與工作集盡量重疊,則不會造成太多缺頁中斷。當常駐集大小達到某個數目后,再分配物理頁幀也不會有明顯下降的缺頁率——可以把多出來的物理頁幀分給其他程序了。

2個全局算法: 
工作集缺頁置換算法: 
追蹤之前的(Δ)個引用。 
老的頁會隨着時間不斷的換出,不管是否有缺頁中斷。確保物理頁幀始終有空余的,給其他程序提供內存,讓系統的缺頁率降低。 
缺頁率頁面置換算法 
剛才的窗口是固定的。 
可變分配策略:常駐集大小可變 
可采用全局頁面置換的方式,當發生一個缺頁中斷時,被置換的頁面可以在其他進程中,各個並發進程競爭地使用物理頁面。依據是缺頁率。多的說明需要內存。缺頁率算法(PFF, page fault frequency)動態調整常駐集的大小。性能較好,但增加了系統開銷 
缺頁率=缺頁次數/內存訪問次數 
=1/缺頁的平均時間間隔 
影響因素有頁面置換算法,分配給進程的物理頁面數目(越多越小),頁面本身的大小(頁面大則會小),編程方法(局部性好就會小)

若缺頁率高則增加工作集(Δ)來分配更多物理頁面,若過低則減少工作集來減少其物理頁面。使缺頁率保持在一個合理的范圍內。各個程序之間保持一個平衡。

具體機制:根據缺頁的時間間隔來判斷 動態更新 
保持追蹤缺頁概率,記錄上次缺頁到這次的時間間隔 
t(current) -t(last),與T比較(自定義一個合理的間隔),若大於T,則缺頁率小,可增加工作集,否則增加缺失頁到工作集中。

抖動問題(thrashing): 
如果分配給一個進程的物理頁面太少,常駐集遠小於工作集,則缺頁率會很大,頻繁在內外存之間替換頁面,使進程的運行慢,這種狀態成為”抖動”。 
隨着駐留內存的進程數目增加,分配給每個進程的物理頁面數不斷減少,缺頁率上升。因此OS要選擇一個適當的進程數目和進程需要的幀數,在並發水平和缺頁率中達到平衡。 
抖動問題可能被本地的頁面置換改善。加載控制(better criteria for load control: adjust MPL so that): 
這里寫圖片描述 
mean time between page faults(MTBF)= PFST page fault service time 
∑▒WSt=內存的大小

程序開的多,OS忙於換進換出的I/O操作,用於運行程序的cpu少了。找到交匯點,此時可以並發執行的程序個數和cpu利用率都較好,總體達到平衡。另一方面,如果僅有一個程序,但它很大,也會導致抖動。

下篇在此:

操作系統清華向勇陳渝版筆記(七) 進程與線程 PCB TCB 進程掛起 用戶線程 內核線程 輕量級進程 僵屍隊列


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM