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