日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OS- -内存之页面置换算法

發(fā)布時(shí)間:2024/4/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OS- -内存之页面置换算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OS- -內(nèi)存之頁(yè)面置換算法

文章目錄

  • OS- -內(nèi)存之頁(yè)面置換算法
    • 一、內(nèi)存之頁(yè)面置換算法
      • 1.最優(yōu)頁(yè)面置換算法
      • 2.最近未使用頁(yè)面置換算法
      • 3.先進(jìn)先出頁(yè)面置換算法
      • 4.第二次機(jī)會(huì)頁(yè)面置換算法
      • 5.時(shí)鐘頁(yè)面置換算法
      • 6.最近最少使用頁(yè)面置換算法(LRU)
      • 7.用軟件模擬LRU
      • 8.工作集頁(yè)面置換算法
      • 9.工作集時(shí)鐘頁(yè)面置換算法
      • 10.頁(yè)面置換算法小結(jié)

一、內(nèi)存之頁(yè)面置換算法

  • 當(dāng)發(fā)生缺頁(yè)異常時(shí),操作系統(tǒng)會(huì)選擇一個(gè)頁(yè)面進(jìn)行換出從而為新進(jìn)來(lái)的頁(yè)面騰出空間。
  • 如果要換出的頁(yè) 面在內(nèi)存中已經(jīng)被修改,那么必須將其寫(xiě)到磁盤(pán)中以使磁盤(pán)副本保持最新?tīng)顟B(tài)。如果頁(yè)面沒(méi)有被修改 過(guò),并且磁盤(pán)中的副本也已經(jīng)是最新的,那么就不需要進(jìn)行重寫(xiě)。那么就直接使用調(diào)入的頁(yè)面覆蓋需 要移除的頁(yè)面就可以了
  • 當(dāng)發(fā)生缺頁(yè)中斷時(shí),雖然可以隨機(jī)的選擇一個(gè)頁(yè)面進(jìn)行置換,但是如果每次都選擇一個(gè)不常用的頁(yè)面會(huì) 提升系統(tǒng)的性能。如果一個(gè)經(jīng)常使用的頁(yè)面被換出,那么這個(gè)頁(yè)面在短時(shí)間內(nèi)又可能被重復(fù)使用,那么 就可能會(huì)造成額外的性能開(kāi)銷(xiāo)

在關(guān)于頁(yè)面的主題上有很多頁(yè)面置換算法(page replacement algorithms),這些已經(jīng)從理論上和實(shí)踐上得到了證明。

  • 需要指出的是,頁(yè)面置換問(wèn)題在計(jì)算機(jī)的其他領(lǐng)域中也會(huì)出現(xiàn)。例如,多數(shù)計(jì)算機(jī)把最近使用過(guò)的32 字節(jié)或者64字節(jié)的存儲(chǔ)塊保存在一個(gè)或多個(gè)高速緩存中。當(dāng)緩存滿的時(shí)候,一些塊就被選擇和移除。
  • 這些塊的移除除了花費(fèi)時(shí)間較短外,這個(gè)問(wèn)題同頁(yè)面置換問(wèn)題完全一樣。之所以花費(fèi)時(shí)間較短,是因?yàn)?丟掉的高速緩存可以從內(nèi)存中獲取,而內(nèi)存沒(méi)有尋找磁道的時(shí)間也不存在旋轉(zhuǎn)延遲。
  • 第二個(gè)例子是Web服務(wù)器。服務(wù)器會(huì)在內(nèi)存中緩存一些經(jīng)常使用到的Web頁(yè)面。然而,當(dāng)緩存滿了并 且已經(jīng)引用了新的頁(yè)面,那么必須決定退出哪個(gè)Web頁(yè)面。
  • 在高速緩存中的Web頁(yè)面不會(huì)被修改。因 此磁盤(pán)中的Web頁(yè)面經(jīng)常是最新的,同樣的考慮也適用在虛擬內(nèi)存中。在虛擬系統(tǒng)中,內(nèi)存中的頁(yè)面 可能會(huì)修改也可能不會(huì)修改。

下面我們就來(lái)探討一下有哪些頁(yè)面置換算法。

1.最優(yōu)頁(yè)面置換算法

最優(yōu)的頁(yè)面置換算法很容易描述但在實(shí)際情況下很難實(shí)現(xiàn)。

  • 它的工作流程如下:
  • 在缺頁(yè)中斷發(fā)生時(shí),這 些頁(yè)面將在下一條指令(包含該指令的頁(yè)面)上被引用。其他頁(yè)面則可能要到10、100或者1000 條指令后才會(huì)被訪問(wèn)。每個(gè)頁(yè)面都可以用在該頁(yè)首次被訪問(wèn)前所要執(zhí)行的指令數(shù)作為標(biāo)記。
  • 最優(yōu)化的頁(yè)面算法表明應(yīng)該標(biāo)記最大的頁(yè)面。如果一個(gè)頁(yè)面在800萬(wàn)條指令內(nèi)不會(huì)被使用,另外一個(gè)頁(yè) 面在600萬(wàn)條指令內(nèi)不會(huì)被使用,則置換前一個(gè)頁(yè)面,從而把需要調(diào)入這個(gè)頁(yè)面而發(fā)生的缺頁(yè)中斷推 遲。

計(jì)算機(jī)也像人類(lèi)一樣,會(huì)把不愿意做的事情盡可能的往后拖。

  • 這個(gè)算法最大的問(wèn)題時(shí)無(wú)法實(shí)現(xiàn)。當(dāng)缺頁(yè)中斷發(fā)生時(shí),操作系統(tǒng)無(wú)法知道各個(gè)頁(yè)面的下一次將在什么時(shí) 候被訪問(wèn)。這種算法在實(shí)際過(guò)程中根本不會(huì)使用。

2.最近未使用頁(yè)面置換算法

  • 為了能夠讓操作系統(tǒng)收集頁(yè)面使用信息,大部分使用虛擬地址的計(jì)算機(jī)都有兩個(gè)狀態(tài)位,R和M,來(lái)和 每個(gè)頁(yè)面進(jìn)行關(guān)聯(lián)。
  • 每當(dāng)引用頁(yè)面(讀入或?qū)懭?#xff09;時(shí)都設(shè)置R,寫(xiě)入(即修改)頁(yè)面時(shí)設(shè)置M,這些 位包含在每個(gè)頁(yè)表項(xiàng)中,就像下面所示:
  • 因?yàn)槊看卧L問(wèn)時(shí)都會(huì)更新這些位,因此由硬件來(lái)設(shè)置它們非常重要。一旦某個(gè)位被設(shè)置為1,就會(huì)一 直保持1直到操作系統(tǒng)下次來(lái)修改此位。
  • 如果硬件沒(méi)有這些位,那么可以使用操作系統(tǒng)的缺頁(yè)中斷和時(shí)鐘中斷機(jī)制來(lái)進(jìn)行模擬。
  • 當(dāng)啟動(dòng)一個(gè)進(jìn) 程時(shí),將其所有的頁(yè)面都標(biāo)記為不在內(nèi)存;一旦訪問(wèn)任何一個(gè)頁(yè)面就會(huì)引發(fā)一次缺頁(yè)中斷,此時(shí)操作 系統(tǒng)就可以設(shè)置R位(在它的內(nèi)部表中),修改頁(yè)表項(xiàng)使其指向正確的頁(yè)面,并設(shè)置為READ ONLY 模式,然后重新啟動(dòng)引起缺頁(yè)中斷的指令。
  • 如果頁(yè)面隨后被修改,就會(huì)發(fā)生另一個(gè)缺頁(yè)異常。從而允許操作系統(tǒng)設(shè)置M位并把頁(yè)面的模式設(shè)置為READ/WRITE。
  • 可以用R位和M位來(lái)構(gòu)造一個(gè)簡(jiǎn)單的頁(yè)面置換算法:當(dāng)啟動(dòng)一個(gè)進(jìn)程時(shí),操作系統(tǒng)將其所有頁(yè)面的兩 個(gè)位都設(shè)置為0。R位定期的被清零(在每個(gè)時(shí)鐘中斷)。用來(lái)將最近未引用的頁(yè)面和已引用的頁(yè)面分 開(kāi)。
  • 當(dāng)出現(xiàn)缺頁(yè)中斷后,操作系統(tǒng)會(huì)檢查所有的頁(yè)面,并根據(jù)它們的R位和M位將當(dāng)前值分為四類(lèi):
  • ?第0類(lèi):沒(méi)有引用R,沒(méi)有修改M
  • ?第1類(lèi):沒(méi)有引用R,已修改M
  • ?第2類(lèi):引用R,沒(méi)有修改M
  • ?第3類(lèi):已被訪問(wèn)R,已被修改M
  • 盡管看起來(lái)好像無(wú)法實(shí)現(xiàn)第一類(lèi)頁(yè)面,但是當(dāng)?shù)谌?lèi)頁(yè)面的R位被時(shí)鐘中斷清除時(shí),它們就會(huì)發(fā)生。時(shí)鐘中斷不會(huì)清除M位,因?yàn)樾枰@個(gè)信息才能知道是否寫(xiě)回磁盤(pán)中。清除R但不清除M會(huì)導(dǎo)致出現(xiàn) 一類(lèi)頁(yè)面。
  • NRU(Not Recently Used)算法從編號(hào)最小的非空類(lèi)中隨機(jī)刪除一個(gè)頁(yè)面。
  • 此算法隱含的思想是, 在一個(gè)時(shí)鐘內(nèi)(約20ms)淘汰一個(gè)已修改但是沒(méi)有被訪問(wèn)的頁(yè)面要比一個(gè)大量引用的未修改頁(yè)面好, NRU的主要優(yōu)點(diǎn)是易于理解并且能夠有效的實(shí)現(xiàn)。

3.先進(jìn)先出頁(yè)面置換算法

  • 另一種開(kāi)銷(xiāo)較小的方式是使用FIF0(First-In,First-Out)算法,這種類(lèi)型的數(shù)據(jù)結(jié)構(gòu)也適用在頁(yè) 面置換算法中。
  • 由操作系統(tǒng)維護(hù)一個(gè)所有在當(dāng)前內(nèi)存中的頁(yè)面的鏈表,最早進(jìn)入的放在表頭,最新進(jìn)入 的頁(yè)面放在表尾。
  • 在發(fā)生缺頁(yè)異常時(shí),會(huì)把頭部的頁(yè)移除并且把新的頁(yè)添加到表尾。
  • 還記得缺頁(yè)異常什么時(shí)候發(fā)生嗎?我們知道應(yīng)用程序訪問(wèn)內(nèi)存會(huì)進(jìn)行虛擬地址到物理地址的映 射,缺頁(yè)異常就發(fā)生在虛擬地址無(wú)法映射到物理地址的時(shí)候。因?yàn)閷?shí)際的物理地址要比虛擬地址 小很多,所以缺頁(yè)經(jīng)常會(huì)發(fā)生。
  • 先進(jìn)先出頁(yè)面可能是最簡(jiǎn)單的頁(yè)面替換算法了。在這種算法中,操作系統(tǒng)會(huì)跟蹤鏈表中內(nèi)存中的所有 頁(yè)。

下面我們舉個(gè)例子看一下

  • ?初始化的時(shí)候,沒(méi)有任何頁(yè)面,所以第一次的時(shí)候會(huì)檢查頁(yè)面1是否位于鏈表中,沒(méi)有在鏈表中,那么就是MISS ,頁(yè)面1進(jìn)入鏈表,鏈表的先進(jìn)先出的方向如圖所示。
  • ?類(lèi)似的,第二次會(huì)先檢查頁(yè)面2是否位于鏈表中,沒(méi)有在鏈表中,那么頁(yè)面2進(jìn)入鏈表,狀態(tài)為 MISS ,依次類(lèi)推。
  • ?我們來(lái)看第四次,此時(shí)的鏈表為12 3,第四次會(huì)檢查頁(yè)面2是否位于鏈表中,經(jīng)過(guò)檢索后, 發(fā)現(xiàn)2在鏈表中,那么狀態(tài)就是HIT ,并不會(huì)再進(jìn)行入隊(duì)和出隊(duì)操作,第五次也是一樣的。
  • ?下面來(lái)看第六次,此時(shí)的鏈表還是12 3,因?yàn)橹皼](méi)有執(zhí)行進(jìn)入鏈表操作,頁(yè)面5會(huì)首先進(jìn) 行檢查,發(fā)現(xiàn)鏈表中沒(méi)有頁(yè)面5,則執(zhí)行頁(yè)面5的進(jìn)入鏈表操作,頁(yè)面2執(zhí)行出鏈表的操作,執(zhí) 行完成后的鏈表順序?yàn)?35

4.第二次機(jī)會(huì)頁(yè)面置換算法

  • 我們上面學(xué)到的FIFO鏈表頁(yè)面有個(gè)缺陷,那就是出鏈和入鏈并不會(huì)進(jìn)行check檢查,這樣就會(huì)容 易把經(jīng)常使用的頁(yè)面置換出去(無(wú)法顯示熱點(diǎn)數(shù)據(jù))
  • 為了避免這一問(wèn)題,我們對(duì)該算法做一個(gè)簡(jiǎn)單的修改:我們檢查最老頁(yè) 面的R位,如果是0,那么這個(gè)頁(yè)面就是最老的而且沒(méi)有被使用,那么這個(gè)頁(yè)面就會(huì)被立刻換出。
  • 如果R位是1,那么就清除此位,此頁(yè)面會(huì)被放在鏈表的尾部,修改它的裝入時(shí)間就像剛放進(jìn)來(lái)的一 樣。然后繼續(xù)搜索。
  • 這種算法叫做 第二次機(jī)會(huì)(second chance)算法,就像下面這樣,我們看到頁(yè)面A到H保留在鏈表 中,并按到達(dá)內(nèi)存的時(shí)間排序。
  • a)按照先進(jìn)先出的方法排列的頁(yè)面;
  • b)在時(shí)刻20處發(fā)生缺頁(yè)異常中斷并且A的R位已經(jīng)設(shè)置時(shí)的 頁(yè)面鏈表。
  • 假設(shè)缺頁(yè)異常發(fā)生在時(shí)刻20處,這時(shí)最老的頁(yè)面是A ,它是在0時(shí)刻到達(dá)的。如果A的R位是03 那么它將被淘汰出內(nèi)存,或者把它寫(xiě)回磁盤(pán)(如果它已經(jīng)被修改過(guò)),或者只是簡(jiǎn)單的放棄(如果它是 未被修改過(guò))。
  • 另一方面,如果它的R位已經(jīng)設(shè)置了,則將A放到鏈表的尾部并且重新設(shè)置裝入時(shí)間 為當(dāng)前時(shí)刻(20處),然后清除R位。然后從B頁(yè)面開(kāi)始繼續(xù)搜索合適的頁(yè)面。
  • 尋找第二次機(jī)會(huì)的是在最近的時(shí)鐘間隔中未被訪問(wèn)過(guò)的頁(yè)面。如果所有的頁(yè)面都被訪問(wèn)過(guò),該算法就會(huì) 被簡(jiǎn)化為單純的FIFO算法。
  • 具體來(lái)說(shuō),假設(shè)圖a中所有頁(yè)面都設(shè)置了 R位。操作系統(tǒng)將頁(yè)面依次 移到鏈表末尾,每次都在添加到末尾時(shí)清除R位。
  • 最后,算法又會(huì)回到頁(yè)面A,此時(shí)的R位已經(jīng)被清 除,那么頁(yè)面A就會(huì)被執(zhí)行出鏈處理,因此算法能夠正常結(jié)束。

5.時(shí)鐘頁(yè)面置換算法

  • 即使上面提到的第二次頁(yè)面置換算法也是一種比較合理的算法,但它經(jīng)常要在鏈表中移動(dòng)頁(yè)面,既降低 了效率,而且這種算法也不是必須的。
  • 一種比較好的方式是把所有的頁(yè)面都保存在一個(gè)類(lèi)似鐘面的環(huán)形 鏈表中,一個(gè)表針指向最老的頁(yè)面。

如下圖所示:

  • 當(dāng)缺頁(yè)錯(cuò)誤出現(xiàn)時(shí),算法首先檢查表針指向的頁(yè)面,如果它的R位是。就淘汰該頁(yè)面,并把新的頁(yè)面插入到這個(gè)位置,然后把表針向前移動(dòng)一位;如果R位是1就清除R位并把表針前移一個(gè)位置。重復(fù)這個(gè)過(guò)程直到找到了一個(gè)R位為0的頁(yè)面位置。

了解這個(gè)算法的工作方式,就明白為什么它被稱(chēng)為 時(shí) 鐘(clokc)算法了。

6.最近最少使用頁(yè)面置換算法(LRU)

  • 最近最少使用頁(yè)面置換算法的一個(gè)解釋會(huì)是下面這樣:在前面幾條指令中頻繁使用的頁(yè)面和可能在后面 的幾條指令中被使用。
  • 反過(guò)來(lái)說(shuō),已經(jīng)很久沒(méi)有使用的頁(yè)面有可能在未來(lái)一段時(shí)間內(nèi)仍不會(huì)被使用。這 個(gè)思想揭示了一個(gè)可以實(shí)現(xiàn)的算法:在缺頁(yè)中斷時(shí),置換未使用時(shí)間最長(zhǎng)的頁(yè)面。這個(gè)策略稱(chēng)為 LRU(Least Recently Used),最近最少使用頁(yè)面置換算法。
  • 雖然LRU在理論上是可以實(shí)現(xiàn)的,但是從長(zhǎng)遠(yuǎn)看來(lái)代價(jià)比較高。為了完全實(shí)現(xiàn)LRU,會(huì)在內(nèi)存中維護(hù) —個(gè)所有頁(yè)面的鏈表,最頻繁使用的貞位于表頭,最近最少使用的貞位于表尾。
  • 困難的是在每次內(nèi)存引 用時(shí)更新整個(gè)鏈表。在鏈表中找到一個(gè)頁(yè)面,刪除它,然后把它移動(dòng)到表頭是一個(gè)非常耗時(shí)的操作,即 使使用硬件來(lái)實(shí)現(xiàn)也是一樣的費(fèi)時(shí)。
  • 然而,還有其他方法可以通過(guò)硬件實(shí)現(xiàn)LRU。讓我們首先考慮最簡(jiǎn)單的方式。這個(gè)方法要求硬件有一個(gè) 64位的計(jì)數(shù)器,它在每條指令執(zhí)行完成后自動(dòng)加1,每個(gè)頁(yè)表必須有一個(gè)足夠容納這個(gè)計(jì)數(shù)器值的域。
  • 在每次訪問(wèn)內(nèi)存后,將當(dāng)前的值保存到被訪問(wèn)頁(yè)面的頁(yè)表項(xiàng)中。一旦發(fā)生缺頁(yè)異常,操作系統(tǒng)就檢查所 有頁(yè)表項(xiàng)中計(jì)數(shù)器的值,找到值最小的一個(gè)頁(yè)面,這個(gè)頁(yè)面就是最少使用的頁(yè)面。

7.用軟件模擬LRU

  • 盡管上面的LRU算法在原則上是可以實(shí)現(xiàn)的,但是很少有機(jī)器能夠擁有那些特殊的硬件。
  • 上面是硬件 的實(shí)現(xiàn)方式,那么現(xiàn)在考慮要用軟件來(lái)實(shí)現(xiàn)LRU。一種可以實(shí)現(xiàn)的方案是NFU(Not Frequently Used,最不常用)算法。
  • 需要一個(gè)軟件計(jì)數(shù)器來(lái)和每個(gè)頁(yè)面關(guān)聯(lián),初始化的時(shí)候是0。在每個(gè)時(shí)鐘中 斷時(shí),操作系統(tǒng)會(huì)瀏覽內(nèi)存中的所有頁(yè),會(huì)將每個(gè)頁(yè)面的R位(0或1)加到它的計(jì)數(shù)器上
  • 這個(gè)計(jì)數(shù) 器大體上跟蹤了各個(gè)頁(yè)面訪問(wèn)的頻繁程度。當(dāng)缺頁(yè)異常出現(xiàn)時(shí),則置換計(jì)數(shù)器值最小的頁(yè)面。
  • NFU最主要的問(wèn)題是它不會(huì)忘記任何東西,想一下是不是這樣?例如,在一個(gè)多次(掃描)的編譯器 中,在第一遍掃描中頻繁使用的頁(yè)面會(huì)在后續(xù)的掃描中也有較高的計(jì)數(shù)。
  • 事實(shí)上,如果第一次掃描的執(zhí) 行時(shí)間恰好是各次掃描中最長(zhǎng)的,那么后續(xù)遍歷的頁(yè)面的統(tǒng)計(jì)次數(shù)總會(huì)比第一次頁(yè)面的統(tǒng)計(jì)次數(shù)小。 結(jié)果是操作系統(tǒng)將置換有用的頁(yè)面而不是不再使用的頁(yè)面。
  • 幸運(yùn)的是只需要對(duì)NFU做一個(gè)簡(jiǎn)單的修改就可以讓它模擬LRU,這個(gè)修改有兩個(gè)步驟:
  • ?首先,在R位被添加進(jìn)來(lái)之前先把計(jì)數(shù)器右移一位
  • ?第二步,R位被添加到最左邊的位而不是最右邊的位。

修改以后的算法稱(chēng)為老化Caging)算法,下圖解釋了老化算法是如何工作的:

  • 我們假設(shè)在第一個(gè)時(shí)鐘周期內(nèi)頁(yè)面0-5的R位依次是1, 0, 1, 0, 1, 1,(也就是頁(yè)面0是1,頁(yè) 面1是0,頁(yè)面2是1這樣類(lèi)推)。
  • 也就是說(shuō),在0個(gè)時(shí)鐘周期到1個(gè)時(shí)鐘周期之間,0, 2, 4, 5 都被引用了,從而把它們的R位設(shè)置為1,剩下的設(shè)置為0。
  • 在相關(guān)的六個(gè)計(jì)數(shù)器被右移之后R位被 添加到 左側(cè),就像上圖中的a。剩下的四列顯示了接下來(lái)的四個(gè)時(shí)鐘周期內(nèi)的六個(gè)計(jì)數(shù)器變化。
  • CPU正在以某個(gè)頻率前進(jìn),該頻率的周期稱(chēng)為時(shí)鐘滴答或時(shí)鐘周期。
  • 一個(gè)10OMhz的處理器每 秒將接收100,000,000個(gè)時(shí)鐘滴答。
  • 當(dāng)缺頁(yè)異常出現(xiàn)時(shí),將置換(就是移除)計(jì)數(shù)器值最小的頁(yè)面。如果一個(gè)頁(yè)面在前面4個(gè)時(shí)鐘周期內(nèi) 都沒(méi)有被訪問(wèn)過(guò),那么它的計(jì)數(shù)器應(yīng)該會(huì)有四個(gè)連續(xù)的0,因此它的值肯定要比前面3個(gè)時(shí)鐘周期內(nèi) 都沒(méi)有被訪問(wèn)過(guò)的頁(yè)面的計(jì)數(shù)器小。

這個(gè)算法與LRU算法有兩個(gè)重要的區(qū)別:看一下上圖中的e ,第三列和第五列

  • 它們?cè)趦蓚€(gè)時(shí)鐘周期內(nèi)都沒(méi)有被訪問(wèn)過(guò),在此之前的時(shí)鐘周期內(nèi)都引用了兩個(gè)頁(yè)面。
  • 根據(jù)LRU算法, 如果需要置換的話,那么應(yīng)該在這兩個(gè)頁(yè)面中選擇一個(gè)。那么問(wèn)題來(lái)了,我萌應(yīng)該選擇哪個(gè)?
  • 現(xiàn)在的問(wèn) 題是我們不知道時(shí)鐘周期1到時(shí)鐘周期2內(nèi)它們中哪個(gè)頁(yè)面是后被訪問(wèn)到的。因?yàn)樵诿總€(gè)時(shí)鐘周期內(nèi) 只記錄了一位,所以無(wú)法區(qū)分在一個(gè)時(shí)鐘周期內(nèi)哪個(gè)頁(yè)面最早被引用,哪個(gè)頁(yè)面是最后被引用的。
  • 因 此,我們能做的就是置換頁(yè)面3 ,因?yàn)轫?yè)面3在周期0-1內(nèi)都沒(méi)有被訪問(wèn)過(guò),而頁(yè)面5卻被引用 過(guò)。
  • LRU與老化之前的第2個(gè)區(qū)別是,在老化期間,計(jì)數(shù)器具有有限數(shù)量的位(這個(gè)例子中是8位),這 就限制了以往的訪問(wèn)記錄。
  • 如果兩個(gè)頁(yè)面的計(jì)數(shù)器都是0,那么我們可以隨便選擇一個(gè)進(jìn)行置換。實(shí)際 上,有可能其中一個(gè)頁(yè)面的訪問(wèn)次數(shù)實(shí)在9個(gè)時(shí)鐘周期以前,而另外一個(gè)頁(yè)面是在1000個(gè)時(shí)鐘周期之 前,但是我們卻無(wú)法看到這些。
  • 在實(shí)際過(guò)程中,如果時(shí)鐘周期是20 ms, 8位一般是夠用的。所以我們 經(jīng)常拿20 ms來(lái)舉例。

8.工作集頁(yè)面置換算法

  • 在最單純的分頁(yè)系統(tǒng)中,剛啟動(dòng)進(jìn)程時(shí),在內(nèi)存中并沒(méi)有頁(yè)面。此時(shí)如果CPU嘗試匹配第一條指令,就會(huì)得到一個(gè)缺貞異常,使操作系統(tǒng)裝入含有第一條指令的頁(yè)面。
  • 其他的錯(cuò)誤比如全局變量和堆棧 引起的缺貞異常通常會(huì)緊接著發(fā)生。一段時(shí)間以后,進(jìn)程需要的大部分頁(yè)面都在內(nèi)存中了,此時(shí)進(jìn)程開(kāi) 始在較少的缺頁(yè)異常環(huán)境中運(yùn)行。這個(gè)策略稱(chēng)為請(qǐng)求調(diào)頁(yè)(demand paging),因?yàn)轫?yè)面是根據(jù)需要被 調(diào)入的,而不是預(yù)先調(diào)入的。
  • 在一個(gè)大的地址空間中系統(tǒng)的讀所有的頁(yè)面,將會(huì)造成很多缺貞異常,因此會(huì)導(dǎo)致沒(méi)有足夠的內(nèi)存來(lái)容 納這些頁(yè)面。
  • 不過(guò)幸運(yùn)的是,大部分進(jìn)程不是這樣工作的,它們都會(huì)以局部性方式(locality of reference)來(lái)訪問(wèn),這意味著在執(zhí)行的任何階段,程序只引用其中的一小部分。
  • 一個(gè)進(jìn)程當(dāng)前正在使用的頁(yè)面的集合稱(chēng)為它的 工作集(working set),如果整個(gè)工作集都在內(nèi)存中, 那么進(jìn)程在運(yùn)行到下一運(yùn)行階段(例如,編譯器的下一遍掃面)之前,不會(huì)產(chǎn)生很多缺貞中斷。
  • 如果內(nèi) 存太小從而無(wú)法容納整個(gè)工作集,那么進(jìn)程的運(yùn)行過(guò)程中會(huì)產(chǎn)生大量的缺頁(yè)中斷,會(huì)導(dǎo)致運(yùn)行速度也會(huì) 變得緩慢
  • 因?yàn)橥ǔV恍枰獛准{秒就能執(zhí)行一條指令,而通常需要十毫秒才能從磁盤(pán)上讀入一個(gè)頁(yè)面。 如果一個(gè)程序每10 ms只能執(zhí)行一到兩條指令,那么它將需要很長(zhǎng)時(shí)間才能運(yùn)行完。如果只是執(zhí)行幾條指令就會(huì)產(chǎn)生中斷,那么就稱(chēng)作這個(gè)程序產(chǎn)生了顛簸(thrashing)。
  • 在多道程序的系統(tǒng)中,通常會(huì)把進(jìn)程移到磁盤(pán)上(即從內(nèi)存中移走所有的頁(yè)面),這樣可以讓其他進(jìn)程 有機(jī)會(huì)占用CPU。
  • 有一個(gè)問(wèn)題是,當(dāng)進(jìn)程想要再次把之前調(diào)回磁盤(pán)的頁(yè)面調(diào)回內(nèi)存怎么辦?從技術(shù)的 角度上來(lái)講,并不需要做什么,此進(jìn)程會(huì)一直產(chǎn)生缺頁(yè)中斷直到它的工作集 被調(diào)回內(nèi)存。
  • 然后,每次 裝入一個(gè)進(jìn)程需要20、100甚至1000次缺頁(yè)中斷,速度顯然太慢了,并且由于CPU需要幾毫秒時(shí)間 處理一個(gè)缺頁(yè)中斷,因此由相當(dāng)多的CPU時(shí)間也被浪費(fèi)了。
  • 因此,不少分頁(yè)系統(tǒng)中都會(huì)設(shè)法跟蹤進(jìn)程的工作集,確保這些工作集在進(jìn)程運(yùn)行時(shí)被調(diào)入內(nèi)存。這個(gè)方 法叫做工作集模式(working set model)
  • 它被設(shè)計(jì)用來(lái)減少缺頁(yè)中斷的次數(shù)的。在進(jìn)程運(yùn)行前首 先裝入工作集頁(yè)面的這一個(gè)過(guò)程被稱(chēng)為 預(yù)先調(diào)頁(yè)(prepaging),工作集是隨著時(shí)間來(lái)變化的
  • 根據(jù)研究表明,大多數(shù)程序并不是均勻的訪問(wèn)地址空間的,而訪問(wèn)往往是集中于一小部分頁(yè)面。一次內(nèi) 存訪問(wèn)可能會(huì)取出一條指令,也可能會(huì)取出數(shù)據(jù),或者是存儲(chǔ)數(shù)據(jù)。
  • 在任一時(shí)刻t,都存在一個(gè)集合, 它包含所喲歐最近k次內(nèi)存訪問(wèn)所訪問(wèn)過(guò)的頁(yè)面。這個(gè)集合w(k,t)就是工作集。因?yàn)樽罱黭=1次 訪問(wèn)肯定會(huì)訪問(wèn)最近k>1次訪問(wèn)所訪問(wèn)過(guò)的頁(yè)面,所以w(k,t)是k的單調(diào)遞減函數(shù)。
  • 隨著k的增 大,w(k,t)是不會(huì)無(wú)限變大的,因?yàn)槌绦虿豢赡茉L問(wèn)比所能容納頁(yè)面數(shù)量上限還多的頁(yè)面。
  • 事實(shí)上大多數(shù)應(yīng)用程序只會(huì)任意訪問(wèn)一小部分頁(yè)面集合,但是這個(gè)集合會(huì)隨著時(shí)間而緩慢變化,所以為 什么一開(kāi)始曲線會(huì)快速上升而k較大時(shí)上升緩慢。
  • 為了實(shí)現(xiàn)工作集模型,操作系統(tǒng)必須跟蹤哪些頁(yè)面在 工作集中。一個(gè)進(jìn)程從它開(kāi)始執(zhí)行到當(dāng)前所實(shí)際使用的CPU時(shí)間總數(shù)通常稱(chēng)作當(dāng)前實(shí)際運(yùn)行時(shí)間
  • 進(jìn)程的工作集可以被稱(chēng)為在過(guò)去的t秒實(shí)際運(yùn)行時(shí)間中它所訪問(wèn)過(guò)的頁(yè)面集合。
  • 下面來(lái)簡(jiǎn)單描述一下工作集的頁(yè)面置換算法,基本思路就是找出一個(gè)不在工作集中的頁(yè)面并淘汰它。

下 面是一部分機(jī)器頁(yè)表:

  • 因?yàn)橹挥心切┰趦?nèi)存中的頁(yè)面才可以作為候選者被淘汰,所以該算法忽略了那些不在內(nèi)存中的頁(yè)面。
  • 每 個(gè)表項(xiàng)至少包含兩條信息:上次使用該頁(yè)面的近似時(shí)間和R (訪問(wèn))位。空白的矩形表示該算法不需要其他字段,例如頁(yè)框數(shù)量、保護(hù)位、修改位。
  • 算法的工作流程如下:
  • 假設(shè)硬件要設(shè)置R和M位。同樣的,在每個(gè)時(shí)鐘周期內(nèi),一個(gè)周期性的時(shí)鐘中 斷會(huì)使軟件清除Referenced(引用)位。在每個(gè)缺貞異常,頁(yè)表會(huì)被掃描以找出一個(gè)合適的頁(yè)面把它 置換。
  • 隨著每個(gè)頁(yè)表項(xiàng)的處理,都需要檢查R位。如果R位是1,那么就會(huì)將當(dāng)前時(shí)間寫(xiě)入頁(yè)表項(xiàng)的 上次使 用時(shí)間域,表示的意思就是缺貞異常發(fā)生時(shí)頁(yè)面正在被使用。因?yàn)轫?yè)面在當(dāng)前時(shí)鐘周期內(nèi)被訪問(wèn)過(guò),那 么它應(yīng)該出現(xiàn)在工作集中而不是被刪除(假設(shè)t是橫跨了多個(gè)時(shí)鐘周期)。
  • 如果R位是0,那么在當(dāng)前的時(shí)鐘周期內(nèi)這個(gè)頁(yè)面沒(méi)有被訪問(wèn)過(guò),應(yīng)該作為被刪除的對(duì)象。為了查看 是否應(yīng)該將其刪除,會(huì)計(jì)算其使用期限(當(dāng)前虛擬時(shí)間-上次使用時(shí)間),來(lái)用這個(gè)時(shí)間和t進(jìn)行對(duì) 比。如果使用期限大于t,那么這個(gè)頁(yè)面就不再工作集中,而使用新的頁(yè)面來(lái)替換它。然后繼續(xù)掃描更 新剩下的表項(xiàng)。
  • 然而,如果R位是0但是使用期限小于等于t,那么此頁(yè)應(yīng)該在工作集中。此時(shí)就會(huì)把頁(yè)面臨時(shí)保存起 來(lái),但是會(huì)記生存時(shí)間最長(zhǎng)(即上次使用時(shí)間的最小值)的頁(yè)面。
  • 如果掃描完整個(gè)頁(yè)表卻沒(méi)有找到適合 被置換的頁(yè)面,也就意味著所有的頁(yè)面都在工作集中。在這種情況下,如果找到了一個(gè)或者多個(gè)R = 0 的頁(yè)面,就淘汰生存時(shí)間最長(zhǎng)的頁(yè)面。
  • 最壞的情況下是,在當(dāng)前時(shí)鐘周期內(nèi),所有的頁(yè)面都被訪問(wèn)過(guò)了(也就是都有R = 1),因此就隨機(jī)選擇一個(gè)頁(yè)面淘汰,如果有的話最好選一個(gè)未被訪問(wèn)的頁(yè)面,也就 是干凈的頁(yè)面。

9.工作集時(shí)鐘頁(yè)面置換算法

  • 當(dāng)缺頁(yè)異常發(fā)生后,需要掃描整個(gè)頁(yè)表才能確定被淘汰的頁(yè)面,因此基本工作集算法還是比較浪費(fèi)時(shí)間 的。
  • 一個(gè)對(duì)基本工作集算法的提升是基于時(shí)鐘算法但是卻使用工作集的信息,這種算法稱(chēng)為 WSClock(工作集時(shí)鐘)。由于它的實(shí)現(xiàn)簡(jiǎn)單并且具有高性能,因此在實(shí)踐中被廣泛應(yīng)用。

與時(shí)鐘算法一樣,所需的數(shù)據(jù)結(jié)構(gòu)是一個(gè)以頁(yè)框?yàn)樵氐难h(huán)列表,就像下面這樣:

  • 工作集時(shí)鐘頁(yè)面置換算法的操作:a)和b)給出R = 1時(shí)所發(fā)生的情形;c)和d)給出R = 0的例子
  • 最初的時(shí)候,該表是空的。當(dāng)裝入第一個(gè)頁(yè)面后,把它加載到該表中。隨著更多的頁(yè)面的加入,它們形 成一個(gè)環(huán)形結(jié)構(gòu)。每個(gè)表項(xiàng)包含來(lái)自基本工作集算法的上次使用時(shí)間,以及R位(已標(biāo)明)和M位 (未標(biāo)明)。
  • 與時(shí)鐘算法一樣,在每個(gè)缺頁(yè)異常時(shí),首先檢查指針指向的頁(yè)面。如果R位被是設(shè)置為1,該頁(yè)面在當(dāng) 前時(shí)鐘周期內(nèi)就被使用過(guò),那么該頁(yè)面就不適合被淘汰。
  • 然后把該頁(yè)面的R位置為0,指針指向下一個(gè) 頁(yè)面,并重復(fù)該算法。該事件序列化后的狀態(tài)參見(jiàn)圖b。
  • 現(xiàn)在考慮指針指向的頁(yè)面R = 0時(shí)會(huì)發(fā)生什么,參見(jiàn)圖c,如果頁(yè)面的使用期限大于t并且頁(yè)面為被訪 問(wèn)過(guò),那么這個(gè)頁(yè)面就不會(huì)在工作集中,并且在磁盤(pán)上會(huì)有一個(gè)此頁(yè)面的副本。
  • 申請(qǐng)重新調(diào)入一個(gè)新的 頁(yè)面,并把新的頁(yè)面放在其中,如圖d所示。另一方面,如果頁(yè)面被修改過(guò),就不能重新申請(qǐng)頁(yè)面,因 為這個(gè)頁(yè)面在磁盤(pán)上沒(méi)有有效的副本。
  • 為了避免由于調(diào)度寫(xiě)磁盤(pán)操作引起的進(jìn)程切換,指針繼續(xù)向前 走,算法繼續(xù)對(duì)下一個(gè)頁(yè)面進(jìn)行操作。畢竟,有可能存在一個(gè)老的,沒(méi)有被修改過(guò)的頁(yè)面可以立即使 用。
  • 原則上來(lái)說(shuō),所有的頁(yè)面都有可能因?yàn)榇疟P(pán)I/O在某個(gè)時(shí)鐘周期內(nèi)被調(diào)度。為了降低磁盤(pán)阻塞,需要 設(shè)置一個(gè)限制,即最大只允許寫(xiě)回n個(gè)頁(yè)面。一旦達(dá)到該限制,就不允許調(diào)度新的寫(xiě)操作。
  • 那么就有個(gè)問(wèn)題,指針會(huì)繞一圈回到原點(diǎn)的,如果回到原點(diǎn),它的起始點(diǎn)會(huì)發(fā)生什么?這里有兩種情 況:
    ?👏至少調(diào)度了一次寫(xiě)操作
    ?👏沒(méi)有調(diào)度過(guò)寫(xiě)操作
  • 在第一種情況中,指針僅僅是不停的移動(dòng),尋找一個(gè)未被修改過(guò)的頁(yè)面。由于已經(jīng)調(diào)度了一個(gè)或者多個(gè) 寫(xiě)操作,最終會(huì)有某個(gè)寫(xiě)操作完成,它的頁(yè)面會(huì)被標(biāo)記為未修改
  • 置換遇到的第一個(gè)未被修改過(guò)的頁(yè) 面,這個(gè)頁(yè)面不一定是第一個(gè)被調(diào)度寫(xiě)操作的頁(yè)面,因?yàn)橛脖P(pán)驅(qū)動(dòng)程序?yàn)榱藘?yōu)化性能可能會(huì)把寫(xiě)操作重 排序。
  • 對(duì)于第二種情況,所有的頁(yè)面都在工作集中,否則將至少調(diào)度了一個(gè)寫(xiě)操作。由于缺乏額外的信息,最 簡(jiǎn)單的方法就是置換一個(gè)未被修改的頁(yè)面來(lái)使用,掃描中需要記錄未被修改的頁(yè)面的位置,如果不存在 未被修改的頁(yè)面,就選定當(dāng)前頁(yè)面并把它寫(xiě)回磁盤(pán)。

10.頁(yè)面置換算法小結(jié)

我們到現(xiàn)在已經(jīng)研究了各種頁(yè)面置換算法,現(xiàn)在我們來(lái)一個(gè)簡(jiǎn)單的總結(jié),算法的總結(jié)歸納如下:

  • ?最優(yōu)算法在當(dāng)前頁(yè)面中置換最后要訪問(wèn)的頁(yè)面。不幸的是,沒(méi)有辦法來(lái)判定哪個(gè)頁(yè)面是最后一個(gè)要訪問(wèn)的,因此實(shí)際上該算法不能使用。然而,它可以作為衡量其他算法的標(biāo)準(zhǔn)。
  • ?NRU算法根據(jù)R位和M位的狀態(tài)將頁(yè)面分為四類(lèi)。從編號(hào)最小的類(lèi)別中隨機(jī)選擇一個(gè)頁(yè)面。 NRU算法易于實(shí)現(xiàn),但是性能不是很好。存在更好的算法。
  • ?FIFO會(huì)跟蹤頁(yè)面加載進(jìn)入內(nèi)存中的順序,并把頁(yè)面放入一個(gè)鏈表中。有可能刪除存在時(shí)間最長(zhǎng) 但是還在使用的頁(yè)面,因此這個(gè)算法也不是一個(gè)很好的選擇。
  • ?第二次機(jī)會(huì)算法是對(duì)FIFO的一個(gè)修改,它會(huì)在刪除頁(yè)面之前檢查這個(gè)頁(yè)面是否仍在使用。如果 頁(yè)面正在使用,就會(huì)進(jìn)行保留。這個(gè)改進(jìn)大大提高了性能。
  • ?時(shí)鐘算法是第二次機(jī)會(huì)算法的另外一種實(shí)現(xiàn)形式,時(shí)鐘算法和第二次算法的性能差不多,但是會(huì) 花費(fèi)更少的時(shí)間來(lái)執(zhí)行算法。
  • ?LRU算法是一個(gè)非常優(yōu)秀的算法,但是沒(méi)有特殊的硬件(TLB)很難實(shí)現(xiàn)。如果沒(méi)有硬件,就不能使用LRU算法。
  • ? NFU算法是一種近似于LRU的算法,它的性能不是非常好。
  • ?老化算法是一種更接近LRU算法的實(shí)現(xiàn),并且可以更好的實(shí)現(xiàn),因此是一個(gè)很好的選擇
  • ?最后兩種算法都使用了工作集算法。工作集算法提供了合理的性能開(kāi)銷(xiāo),但是它的實(shí)現(xiàn)比較復(fù)雜。WSClock是另外一種變體,它不僅能夠提供良好的性能,而且可以高效地實(shí)現(xiàn)。

總之,最好的算法是老化算法和WSClock算法。他們分別是基于LRU和工作集算法。

他們都具有良好 的性能并且能夠被有效的實(shí)現(xiàn)。還存在其他一些好的算法,但實(shí)際上這兩個(gè)可能是最重要的

總結(jié)

以上是生活随笔為你收集整理的OS- -内存之页面置换算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。