2020-11-22(操作系统——页面置换算法)
當內存中的頁面滿了之后,需要的數據又在磁盤虛擬內存中,可以使用頁面置換算法將需要的頁置換到物理內存中。下面先介紹幾種局部頁面置換算法,其針對一個進程而言的頁面置換。
一、局部頁面置換算法
1、最優頁面置換算法
功能:當缺頁中斷發生時,需要調入新的頁面而內存已滿時,選擇內存中哪個物理頁面被置換。
目標:盡可能地減少頁面的換進換出次數(即缺頁中斷的次數)。具體地說,將未來不再使用或者短期不再使用的頁面置換出去。
頁面鎖定(frame locking):用于描述必須常駐內存的操作系統的關鍵部分或時間關鍵的應用程序。即那些必不可少的數據。
基本思路:當一個缺頁中斷發生時,對于保存在內存中的每一個邏輯頁面,計算它的下一次訪問之前還需要等待多長時間,從等待時間中選取最長的那個頁面將其置換。
注意:該算法只是一種理想的情況,在實際時無法實現,因為操作系統是無法知道每個頁面需要等待的時間。但是該算法可以作為頁面置換算法的一個標桿,用以衡量其他頁面置換算法的性能。
下圖是一個頁面置換算法的簡單例子,假設物理內存中有4個頁幀,表的第二行為某個進程調用頁面的軌跡,開始的時候可以將abcd四個頁存放到物理內存中,第1,2,3,4次調用時都在這4個頁面范圍內,第5次調用頁面e,所以需要將物理內存中的abcd頁進行時間的排序,按照下次調用時的時間長度,發現d最久,所以將d和e進行置換。
2、 先進先出算法(first in first out)
基本思路:選擇在內存中駐留時間最長的頁面進行置換。系統維護一個鏈表,記錄在內存中的所有邏輯頁,鏈首的位置駐留時間最長,鏈尾的位置駐留時間最短,當發生缺頁中斷時將鏈首的頁面進行置換,將新加入的頁面添加到鏈尾。
特點:性能較差,調出的頁面可能是經常需要訪問的頁面,同時可能會發生Belady現象(后面介紹)。
下面是一個簡單的例子,如何實現該算法:假設物理內存中只能包含4個頁幀,開始時物理內存中預存abcd四個頁面,在1、2、3、4時刻時進程用到的頁面都在abcd的范圍內所以不會產生缺頁中斷。
當第5時刻時,需要e頁面,由于物理內存中不存在所以會產生缺頁中斷,需要進行頁面置換,根據FIFO算法的規則選擇駐留時間最長的頁面a與e進行置換
后面再b不會產生缺頁中斷,然后a產生缺頁中斷,將物理頁中的b置換,依次下去
3、最近最久未使用算法(Least Recently Used LRU)
基本思路:當發生缺頁中斷時,選擇最久未使用的頁面進行置換。
特點:它是對最優頁面置換算法的一個近似,依據程序的局部性原理(即在最近一小段時間內(最近的幾條指令),如果某些頁面被頻繁訪問,那么在將來的一小段時間內它們可能會再一次被頻繁訪問)。
下面再使用一個例子對該算法進行簡單說明:還是假設物理頁存在4個頁面,初始有abcd四個頁面。1234時刻訪問abcd都在物理內存中不會產生缺頁中斷。第5時刻e到來產生缺頁中斷,之前abcd四個頁中c距離現在時刻是最久未被使用的頁面所以將其置換,同理對后面的頁面進行置換。
從上可知,系統需要記錄每個頁面的使用時刻,同時在每次使用頁面時對這個時刻進行更新,這種方式的開銷是比較大的。可以使用如下兩種方式來進行實現:
①、使用鏈表。系統使用一個鏈表,鏈首保存剛剛使用的頁面,鏈尾保存最久使用的頁面,每次訪問內存時,將最新被訪問的頁移到鏈首,如果發生缺頁中斷,將鏈尾的節點與需要的頁面進行置換。
②、使用棧。當訪問某頁時,將該頁放入棧頂位置,同時查看棧中是否有相同的頁面,如果有將其拿出來。當需要置換的時候將棧底的頁面進行置換即可。
比如將上面的例子使用棧的方式進行說明:1234時刻依次將頁面放入棧中,第5時刻將棧底元素淘汰,然后將e放入棧頂,第6時刻b頁面訪問,將b提到棧頂位置。
4、時鐘頁面置換算法
基本思路:該算法基于在之前的虛擬內存章節說過的頁表項中的訪問位(access/used bit) ,當頁面被加載到內存中時,該位被置為0,當該頁面被訪問(讀/寫)時該位被置為1。然后將各個頁面組織成一個環形的鏈表,定義一個指針指向最先進駐內存的頁面,當發生缺頁中斷時先觀察指針指向的當前位置,如果訪問位為0就與需要的頁面進行置換,如果訪問位為1將該位置為0,然后指向指向鏈表下一個元素,進行同樣的操作直到找到目標位置,置換后將指針移動到下一個元素。訪問位通常由硬件置1或0,軟件也可以對其進行操作。
下面舉一個例子對其進行說明:初始內存中有abcd四個頁面,同時環形鏈表中的訪問位都為1,指針指向a頁面。第1234時刻都沒有發生缺頁中斷,第5時刻發生缺頁中斷,需要進行頁面置換,查看指針當前指向的頁面的訪問位是否為0,如果為0立即置換通知指針移動一位,如果不為0將其置為0然后移動指針。
所以當e進來時,指針從a>b>c>d,同時以此將訪問位置為0,然后又來到a發現其訪問位為0,將其置換。依次下去
該算法是通過訪問位來進行的,通過類似于時鐘的方式粗略的找到駐留時間最長的頁面進行置換。該種算法較LRU算法的開銷比較小,僅僅用一個bit位就能解決問題。
5、二次機會法
二次機會法有時也叫二次時鐘法。在頁表項中增加dirty bit位來增加一次掃描。dirty bit位是判斷程序是否進行了寫操作,如果進行了寫操作該位會被置為1,在進行頁面置換之前需要將數據更新到硬盤上從而保證數據的一致性,如果僅僅是進行了讀操作是不需要對數據進行更新的。
該算法結合used bit和dirty bit對需要置換的頁面進行查詢。該算法將優先的對不需要進行數據更新的頁面進行置換,所以提高了效率,因為io的讀寫開銷是比較大的。
該算法頁面置換的條件如下:
當used bit和dirty bit都為0時才進行置換,如果是其他情況需要對used bit和dirty bit進行修改然后移動指針,直到找到目標頁面。
下面對該算法的實現舉一個例子:初始內存中有abcd四個頁面,頁面右上角有w的字樣表明進程對該頁面進行了寫操作,需要將dirty bit位置1,如果發生頁面置換需要對數據進行更新才能進行頁面置換。初始環形鏈表中有abcd四個頁面,同時used bit=1 dirty bit=0,將1234時刻完成之后,ab頁面的dirty bit=1,第5時刻發生缺頁中斷,指針從a頁面開始查詢,根據上圖的規格進行置換與標志位設置,第一遍走完之后再走到c頁面時c的標志位為used bit=0 dirty bit=0所以將該頁面與e進行置換,后面的頁面置換與前面的一致。
6、最不常用法(Least Frequently Used LFU)
基本思路:最不常用法即將訪問次數最少的那個頁面進行置換。
實現:為給每個頁面添加一個計數器,使用一次該計數器就加1,然后對數字進行排序找到最小的即可。LRU是考察的最久未被使用,LFU考察的是使用頻次最少。
缺點:該算法有一個明顯的缺點,如果某個在進程開始時使用頻次非常多,然后后面就不使用了,會導致該頁面一直不會被置換。
7、LRU FIFO CLOCK算法的對比
LRU和FIFO算法本質上都是先進先出算法,只是LRU增加了時間上的概念,將最久未被使用的頁面進行置換,正因為如此LRU算法需要在每次內存訪問時修改頁面的先后順序。FIFO算法是根據頁面進入內存時間來進行的,如果進入內存中的頁面不會再被訪問,那么FIFO算法也就退化成了LRU算法。
比如物理內存允許3個頁幀,頁面的訪問順序為1 2 3 4 5 6 1 2 3…,此時LRU算法也就退化成了FIFO算法。正是因為程序具有局部性,所以使得FIFO算法和LRU算法具有一定的區別。
LRU算法的開銷是比較大的,FIFO算法開銷比較小,但是容易噪聲Belady現象(文章末尾介紹)。所以折中的辦法就是clock算法,在每次進行內存訪問時,不需要像LRU那樣維護鏈表,僅僅根據標志位來記錄,發生缺頁中斷時再查詢需要置換的頁面。
8、Belady現象
Belady現象是指在使用FIFO算法時,可能會出現分配物理頁面數增加時,缺頁發生的次數也增加。我們知道物理頁面增多時,我們可以將更多的頁面加載到內存中,出現缺頁中斷的次數也會相應減少,但是FIFO算法則不然。因為FIFO算法置換不會考慮進程對該頁面是否訪問得多或最近在訪問,所以才會造成上述原因。
下面看個例子:物理頁幀數為3,看到總共發生了9次缺頁中斷。
現在增加物理頁幀數為4,發生了10次缺頁中斷。
二、全局頁面置換算法
之前的局部頁面置換算法或多或少的存在一些問題,如下,使用FIFO算法將會發生多次缺頁中斷,但是如果我們動態的調整物理內存中的頁幀數就可以減少缺頁中斷的次數。同時局部頁面置換算法針對單個進程而言的,全局頁面置換算法是針對多個進程而言的置換算法。
局部頁面置換算法是在程序具有局部性的背景下提出的,如果程序不具有局部性那么將會使得幾種局部頁面置換算法都變為一種頁面置換算法,之間沒有任何區別。
我們通過工作集來對物理頁面進行定量表示。
1、工作集
工作集是指一個進程當前正在使用的邏輯頁面的集合。用一個二元函數表示W(t, △),其中t表示當前時刻,△表示工作集窗口,相當于一個時間段。W(t, △)表示在當前時刻t之前△時間段內的頁面集合。工作集的變化情況如下圖所示:其總會趨于一個穩定狀態,當局部性區域的位置發生變化時,其會擴張或者收縮但是都會最終趨于穩定。
2、常駐集
常駐集是指當前時刻,進程實際駐留在內存當中的頁面集合。工作集的范圍更廣,指進程需要的頁面集合,可能該頁面在虛擬內存中。當進程的工作集都在內存中時,進程將會順利的進行,不會造成太多的缺頁中斷,同時調整常駐集可以有效的改善缺頁發生的次數,但是當常駐集數量增加到一定數量后,再給它分配更多的物理頁面也不會使得缺頁率下降。
舉個例子:如下假設時間窗口△=4,t=-2時刻加入頁面e,t=-1時刻加入頁面d,t=0時刻加入頁面a。然后1時刻訪問c頁面,直接將該頁面加入到內存中。全局算法只會考慮時間窗口,沒有的加進來,窗口之外的淘汰。
c頁面進來時,內存中有e d a c四個頁面按時間排序,2時刻還是訪問c頁面,由于 時間窗=4,t=-2時刻的頁面被淘汰,即e頁面被淘汰,此時內存中有d a c,3時刻訪問d不變但是順序變為a c d因為d頁面是最新被訪問的,4時刻訪問b,根據時間窗的長度a頁面被淘汰,剩下c d b,依次下去即可。
3、缺頁率頁面置換算法
基本思想:常駐集可變。每個進程在剛開始運行的時候為其預分配一些頁面,然后在程序運行時動態的調整常駐集的大小。
缺頁率:缺頁次數/內存訪問次數。影響缺頁率的因素有:頁面置換算法、分配給進程的物理頁面數量、頁面本身大小、程序編寫方法。
如果缺頁率過高,可以通過增加工作集從而增加更多的物理頁面來降低缺頁率。如果缺頁率太低,可以通過減少工作集的方式來量缺頁率保持在一定范圍內。缺頁率太低也說明內存占用可能是有冗余的。
舉個例子:例如將窗口設置為2,如果兩個缺頁中斷發生的時間長度大于2,表名工作集太多了需要移除,如果小于2表名工作集需要增加。
例如上面的例子,在4時刻時,需要移除部分工作集,移除的部分是1-4時刻之外的頁面。以此對后面的進行操作。
4、抖動問題
如果常駐集小于工作集,會引起很多的缺頁中斷,內存與外存之間會頻繁的進行頁面置換操作。從而使得程序的運行變得緩慢,這種狀態稱為“抖動”。
產生抖動的原因為:隨著進程數量的增加,分配給每個進程的物理頁面數量會減少,從而導致缺頁率增加。所以os需要在進程數與進程的物理頁幀數之間做一個平衡。
抖動問題是可以通過本地頁面置換改善的。首先先提兩個關鍵詞:MTBF與PFST,MTBF是指平均頁缺失時間,表示內存中發生頁缺失的平均時間長度,PFST是指頁缺失時操作系統服務的時間(進行頁面置換等一系列操作的時間)。
下圖的橫軸表示進程的數量,縱軸表示cpu的利用率,進程數量與cpu的利用率的關系如紫色線所示,Nmax處達到最大。理想的狀態肯定就是Nmax處的狀態,但是由于抖動所以可能無法達到最理想的狀態,通過定義MTBF/PFST比值來確定最理想的狀態。
當MTBF/PFST=1時達到理想狀態,因為當比值>1時表明PFST時間太短存在IO過剩的問題,如果比值<1表明PFST>MTBF,即cpu會存在閑置的狀態。
總結
以上是生活随笔為你收集整理的2020-11-22(操作系统——页面置换算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-11-22(工作集与常驻集)
- 下一篇: 2020-11-23(Windows系统