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

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

直接 角度 順序 覆蓋 都是 target mar 有一個 頭結點

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

內容不多,就不做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
選擇最久未使用的那個頁面淘汰掉。
是對最優置換算法的近似,以過去推未來。根據程序的局部性原理,如果最近一段時間內某些頁面被頻繁訪問,那麽在將來還可能被頻繁訪問。反之,未被訪問的將來也不會被訪問。
程序應具有較好的局部性。
技術分享圖片


需要記錄各個頁面使用時間的先後順序,開銷大。
兩種可能的實現方法:
系統維護一個頁面鏈表,最近剛使用的頁面最為首節點,最久未使用的頁面作為尾節點,每次訪問內存動態更新頭結點。缺頁中斷時,淘汰末位的頁面。
活動頁面堆棧:訪問某頁時,將此頁號入棧,並去除棧內的重復頁。淘汰棧底的頁面。(棧是先進後出,只有棧頂開口,怎麽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 進程掛起 用戶線程 內核線程 輕量級進程 僵屍隊列

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