清华大学《操作系统》(八):置换算法
功能:置換算法是指當(dāng)出現(xiàn)缺頁異常時,需要調(diào)入新頁面而內(nèi)存已滿時,置換算法選擇被置換的物理頁面。
設(shè)計(jì)目標(biāo):
- 盡可能減少頁面的調(diào)入調(diào)出次數(shù);
- 把未來不再訪問或短期內(nèi)不訪問的頁面調(diào)出。
頁面鎖定:
了解具體的置換算法之前,先了解一個概念,頁面鎖定。頁面鎖定是用來描述某些必須常駐內(nèi)存的邏輯頁面,比如操作系統(tǒng)的關(guān)鍵部分,再比如一些要求響應(yīng)速度的代碼和數(shù)據(jù)。頁面鎖定是通過頁表中的鎖定標(biāo)志位實(shí)現(xiàn)的。
分類:
最優(yōu)界面置換算法:?
- 基本思路:選擇內(nèi)存中等待時間最長(未來最長時間不訪問)的頁作為置換頁面。?
- 算法實(shí)現(xiàn):缺頁時,計(jì)算內(nèi)存中每個邏輯頁面的下一次訪問時間;選擇未來最長時間不訪問的頁面。
- 算法特征:
先進(jìn)先出算法( first-in first-out FIFO)
- 思路:選擇在內(nèi)存中駐留時間最長的頁面并淘汰之。OS維護(hù)著一個隊(duì)列鏈表,淘汰首位,添加末位。
- 實(shí)現(xiàn):維護(hù)一個記錄所有位于內(nèi)存中的邏輯頁面;鏈表元素按駐留內(nèi)存時間排序,鏈?zhǔn)鬃铋L,鏈尾最短;出現(xiàn)缺頁時,選擇鏈?zhǔn)醉撁孢M(jìn)行置環(huán),新頁面加到鏈尾。
- 特征:性能較差,調(diào)出的頁面可能是常用頁面(駐留時間長,本身就說明可能常用),有belady現(xiàn)象(給的物理頁幀越多反而缺頁越頻繁)。因此該算法很少單獨(dú)使用。
最近最久未使用算法(least recently used LRU)
- 思路:選擇最長時間沒有被引用的頁面進(jìn)行置換。是對最優(yōu)置換算法的近似,以過去推未來。根據(jù)程序的局部性原理,如果最近一段時間內(nèi)某些頁面被頻繁訪問,那么在將來還可能被頻繁訪問。反之,未被訪問的將來也不會被訪問。 程序應(yīng)具有較好的局部性。
- 實(shí)現(xiàn):缺頁時,計(jì)算內(nèi)存中每個邏輯頁面上一次訪問時間;選擇上一次使用到當(dāng)前時間最長的頁面
- 特征:最優(yōu)置換算法的一種近似,但仍然很復(fù)雜,很難實(shí)現(xiàn)。下面是LRU算法的兩種可能的實(shí)現(xiàn)算法:
時鐘置換算法(Clock):
時鐘置換算法是最近最久未使用算法的優(yōu)化。先進(jìn)先出是完全不考慮最近訪問情況,最近最久未使用算法是將所有頁面在整個運(yùn)行過程中的訪問情況都進(jìn)行考慮。而時鐘置換算法是這兩者的折中,即僅對頁面的訪問情況進(jìn)行大致統(tǒng)計(jì)。具體實(shí)現(xiàn)
- 思路:僅對頁面的訪問情況進(jìn)行大致統(tǒng)計(jì)
- 數(shù)據(jù)結(jié)構(gòu):在頁表項(xiàng)中增加訪問位,描述頁面在過去一段時間內(nèi)的訪問情況;各頁面組織成環(huán)形鏈表;指針指向最先調(diào)入的頁面;
- 算法實(shí)現(xiàn):頁面裝入內(nèi)存時,訪問位初始化為0;訪問頁面(讀/寫)時,訪問位置1;缺頁時,從指針當(dāng)前位置順序檢查環(huán)形鏈表【訪問位為0,則置環(huán)該頁;訪問位為1,則訪問位置0,并指針移動到下一個頁面,直到找到可置換得頁面】
- 特征:是FIFO和LRU的折中
?
時鐘置換算法實(shí)際還有一些改進(jìn)。比如減少修改頁的缺頁處理開銷。因?yàn)楸恍薷牡捻撊绻恢脫Q,需要先寫到外存,再將需要的頁寫入內(nèi)存,開銷至少乘2。因此為了減小修改過的頁被置換,可以遇到被修改過的頁指針就跳過。而在系統(tǒng)空閑時定期地將內(nèi)存寫入外存。實(shí)現(xiàn)通過在頁面中增加修改位,并在訪問時進(jìn)行相應(yīng)修改,缺頁掃描時跳過有修改的頁面。
改進(jìn)的Clock算法
- 思路:減少修改頁得缺頁處理開銷
- 算法:在頁面增加修改位,并在訪問時進(jìn)行相應(yīng)修改;缺頁時,修改頁面標(biāo)志位,以跳過有修改得頁面
最不常用置換算法(Least Frequently Used, LFU):
- 思路:選擇置換訪問次數(shù)最少的那個頁面?
- 實(shí)現(xiàn):對每個頁面設(shè)置訪問計(jì)數(shù)器,當(dāng)一個頁面被訪問時加1。置換數(shù)值最小的那個。?
- 特征:存在的問題就是統(tǒng)計(jì)開銷大,并且新拿進(jìn)來的頁面可能因?yàn)橛?jì)數(shù)較少馬上又被置換出去,對于后面這個問題的一個解決方法是已經(jīng)計(jì)的數(shù)定期地衰減
- 最不常用置換算法頁式最近最久未使用算法的優(yōu)化。可以看到LFU與LRU的區(qū)別。LRU關(guān)注多久未被訪問,時間越短越好,LFU關(guān)注訪問次數(shù),次數(shù)越多越好。
LFU與時鐘算法都是對LRU算法的一種簡化近似,開銷減小,同時精度下降。LFU是比較難實(shí)現(xiàn)的,因此在內(nèi)存管理中基本不會采用,但是在讀硬盤文件的時候?qū)r間要求不高的場景中還是可以使用的。
Belady現(xiàn)象
當(dāng)一個進(jìn)程頻繁出現(xiàn)缺頁異常時,應(yīng)該分配給進(jìn)程更多的物理頁面,分配完后按照常理,缺頁異常出現(xiàn)的頻率應(yīng)該降低。但是如果算法不好,很可能不會降低,我們把這種現(xiàn)象稱為Belady現(xiàn)象。
比如FIFO算法,因?yàn)橹脫Q出去的頁面不一定是進(jìn)程近期不會訪問的頁面,如下圖:
但是LRU算法是沒有Belady現(xiàn)象的。時鐘算法和改進(jìn)的時鐘算法也都是沒有Belady現(xiàn)象的。分配更多的頁面以為這更大的緩存,緩存越大命中率肯定升高。
綜合比較局部頁替換算法
LRU和FIFO的比較:LRU和FIFO本質(zhì)都是先進(jìn)先出,但LRU是頁面的最近訪問時間而不是進(jìn)入內(nèi)存的時間,有動態(tài)調(diào)整,符合棧算法的特性,空間越大缺頁越少。如果程序局部性,則LRU會很好。如果內(nèi)存中所有頁面都沒有被訪問過會退化為FIFO。
Clock 和enhanced clock也是類似于FIFO的算法,但用了硬件的BIT來模擬了訪問時間和順序,近似了LRU,綜合起來較好,但也會退化為FIFO。
都對程序的訪問次序有局部性的要求,不然都會退化。
LRU、FIFO和Clock的比較:開銷上,LRU開銷大,FIFO開銷小但BELADY,折中的是Clock算法,開銷較小。對內(nèi)存中還未被訪問的頁面,Clock效果等同LRU。Clock對曾經(jīng)被訪問過的則不能記住其準(zhǔn)確位置,而LRU算法可以。
全局置換算法:
局部置換算法沒有考慮進(jìn)程訪問的差異,有時候給一個進(jìn)程多分配一個物理頁面可以大幅度降低它的缺頁率。全局置換算法就是要為進(jìn)程分配可變數(shù)目的物理頁面。它需要解決以下幾個問題:
- 進(jìn)程在不同階段的內(nèi)存需求是變化的
- 分配各進(jìn)程的內(nèi)存也需要在不同階段有所變化。
- 全局置換算法需要確定分配給進(jìn)程的物理頁面數(shù)
首先我們需要知道CPU利用率與并發(fā)進(jìn)程數(shù)之間的關(guān)系。隨著并發(fā)進(jìn)程數(shù)從0增加,CPU的利用率也不斷增大;當(dāng)進(jìn)程數(shù)越來越多,內(nèi)存訪問的局部性特征越來越被破壞,內(nèi)存變的越來越緊張,利用率增長速度開始放緩,當(dāng)增加到某個臨界點(diǎn),CPU利用率開始下降。也就是CPU利用率與并發(fā)進(jìn)程數(shù)存在相互促進(jìn)和制約的關(guān)系。
工作集
一個進(jìn)程當(dāng)前使用的邏輯頁面集合,可以用一個二元函數(shù)W(t,Δ),t是當(dāng)前執(zhí)行時刻,Δ是工作集窗口(working-set window),一個定長的頁面訪問的時間窗口。t+Δ構(gòu)成了一個時間段,W(t,Δ)就是在當(dāng)前時刻t之前的Δ時間內(nèi)所有訪問頁面組成的集合,在隨t不斷更新。| W(t,Δ)|是工作集的大小即頁面數(shù)目。
工作集的變化:進(jìn)程開始后,隨著訪問新頁面逐步建立較穩(wěn)定的工作集,當(dāng)內(nèi)存訪問的局部性區(qū)域的位置大致穩(wěn)定時| W(t,Δ)|波動很小,在過渡階段,則會快速擴(kuò)張和收縮過渡到下一個穩(wěn)定值。有波峰,有波谷。
常駐集
定義:在當(dāng)前時刻,進(jìn)程實(shí)際駐留在內(nèi)存當(dāng)中的頁面集合。
工作集與常駐集的關(guān)系:工作集是固有性質(zhì),常駐集取決于系統(tǒng)分配給進(jìn)程的物理頁面數(shù)目和所采用的置換算法。
缺頁率與常駐集的關(guān)系:當(dāng)常駐集包含了工作集,也就是工作集都在內(nèi)存中,缺頁較少;工作集發(fā)生劇烈變動時,缺頁較多;當(dāng)常駐集大小達(dá)到某個數(shù)目后,再分配物理頁幀也不會有明顯下降的缺頁率——可以把多出來的物理頁幀分給其他程序了
工作集置換算法:
- 思路:換出不在工作集中的頁面
- 窗口大小:當(dāng)前時刻前τ個內(nèi)存訪問的頁引用是工作集,τ被稱為窗口大小
- 實(shí)現(xiàn)方法:訪存鏈表:維護(hù)窗口內(nèi)的訪存頁面鏈表;在訪存時,換出不在工作集的頁面;缺頁時,換入頁面,更新訪存鏈表。
工作集置換算法的思路是換出不在工作集中的頁面。局部置換算法是在缺頁異常發(fā)生時才決定置換哪個頁面,但是工作集置換算法不一定是在缺頁時才做這件事,而是在訪存時就進(jìn)行處理。工作集置換算法中有一個窗口大小?τ,當(dāng)前時刻前 τ?個內(nèi)存訪問的頁引用是工作集。
可以看到,缺頁處理很簡單,但是每次訪存都要進(jìn)行判斷,開銷還是很大的。這與LRU算法是類似的。
缺頁率置換算法(Page-Fault-Frequency, PFF)
缺頁率=缺頁次數(shù)/內(nèi)存訪問次數(shù) =1/缺頁的平均時間間隔
影響因素有:頁面置換算法,分配給進(jìn)程的物理頁面數(shù)目(越多越小),頁面本身的大小(頁面大則會小),編程方法(局部性好就會小)
缺頁率置換算法是依據(jù)缺頁率來決定哪些頁面放到內(nèi)存哪些被置換出去。其中我們能夠控制的是頁面置換算法。
正常情況下,隨著分配給進(jìn)程的物理頁面數(shù)增多,缺頁率會下降,缺頁率置換算法通過調(diào)節(jié)常駐集的大小,使每個進(jìn)程的缺頁率保持在一個合理的范圍內(nèi)。如果缺頁率過高,則增加物理頁面數(shù),如果缺頁率過低,則降低物理頁面數(shù)。
- 思路:動態(tài)調(diào)整常駐集的大小。性能較好,但增加了系統(tǒng)開銷?
- 具體機(jī)制:
對比缺頁率置換算法與工作集置換算法,缺頁率置換算法是在缺頁異常時進(jìn)行處理,工作集置換算法是在訪存時進(jìn)行處理,缺頁的出現(xiàn)頻率是遠(yuǎn)小于訪存的,開銷降下來了。
抖動
- 抖動:如果分配給一個進(jìn)程的物理頁面太少,常駐集遠(yuǎn)小于工作集,則缺頁率會很大,頻繁在內(nèi)外存之間替換頁面,使進(jìn)程的運(yùn)行慢,這種狀態(tài)成為”抖動”。
- 產(chǎn)生抖動的原因:隨著駐留內(nèi)存的進(jìn)程數(shù)目增加,分配給每個進(jìn)程的物理頁面數(shù)不斷減少,缺頁率上升。因此OS要選擇一個適當(dāng)?shù)倪M(jìn)程數(shù)目和進(jìn)程需要的幀數(shù),在并發(fā)水平和缺頁率中達(dá)到平衡。
負(fù)載控制
我們希望平均缺頁間隔時間(MTBF)大于等于缺頁異常處理時間(PFST)。因此如下圖右側(cè)虛線以左是CPU滿負(fù)荷工作也滿足平均缺頁間隔時間大于等于缺頁異常處理時間的區(qū)域。
總結(jié)
以上是生活随笔為你收集整理的清华大学《操作系统》(八):置换算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库-Redis
- 下一篇: 清华大学《操作系统》(二十三):I/O子