OS酱:“哎呀内存太小了,人家又缺页了!”
操作系統(tǒng)--虛頁面管理之頁面置換算法
?
系統(tǒng)的內(nèi)存并不是無限大,操作系統(tǒng)會為每個(gè)程序分配內(nèi)存,當(dāng)訪問的地址塊不在內(nèi)存中,就要從外存(即硬盤,U盤等)調(diào)入,這就是所說的缺頁異常。
當(dāng)發(fā)生缺頁異常時(shí),操作系統(tǒng)會選擇一個(gè)頁面進(jìn)行換出從而為新進(jìn)來的頁面騰出空間。對于被置換的頁面有以下情況:
如果要被換出的頁面只被訪問而沒被修改,那么直接將此頁面丟棄。
如果要被換出的頁面被修改,那么為了使得外存中的數(shù)據(jù)保證正確,先要將內(nèi)存中的數(shù)據(jù)寫入外存,然后在丟棄。
雖然,被置換頁面的可以隨機(jī)選擇,但是不同的選擇,所導(dǎo)致后續(xù)系統(tǒng)訪存開銷是不一樣,甚至?xí)霈F(xiàn)很極端的情況,每次訪存都發(fā)生缺頁中斷,極大的增加系統(tǒng)額外的訪存開銷。
很多的頁面置換算法被提出用于操作系統(tǒng),但是在其他各類應(yīng)用,無論是數(shù)學(xué)還是經(jīng)濟(jì)學(xué)都有類似的涉獵,今天我們就來討論一下這些算法。
OPT算法(最佳置換算法)
算法特點(diǎn):
最佳置換算法是由 Belady 于1966年提出的一種理論上的算法。每次選擇以后永不使用的, 或許是在最長(未來)時(shí)間內(nèi)不再被訪問的頁面的頁面被淘汰。顯然OPT算法是最優(yōu)的,但是在實(shí)際操作往往無法預(yù)知未來,所以O(shè)PT只存在理論而不能真的實(shí)現(xiàn),通常用于衡量其他置換算法的優(yōu)劣。
算法流程:
在缺頁中斷發(fā)生時(shí),首先從 主存中移出永遠(yuǎn)不再需要的頁面;如無這樣的頁面存在,則選擇最長時(shí)間不需要訪問的頁面。
舉例如下:
?
?
缺頁9次,總訪問次數(shù)12次缺頁率:6/12 = 50%
FIFO算法(先進(jìn)先出置換算法)
Belady異常:
采用FIFO算法時(shí),如果對一個(gè)進(jìn)程未分配它所要求的全部頁面,有時(shí)就會出現(xiàn)分配的頁面數(shù)增多但缺頁率反而提高的異常現(xiàn)象。
?
實(shí)現(xiàn)方法:
最簡單的頁面置換算法,每次淘汰最先調(diào)入內(nèi)存的頁面。由操作系統(tǒng)維護(hù)一個(gè)所有在當(dāng)前內(nèi)存中的頁面的鏈表,最早進(jìn)入的放在表頭,最新進(jìn)入的頁面放在表尾,每次淘汰隊(duì)首頁面。因?yàn)橄冗M(jìn)入的頁面可能已經(jīng)使用完畢,所以不會再被使用的概率可能性較大,優(yōu)先淘汰。但是FIFO容易產(chǎn)生Belady異常。
?
該算法實(shí)現(xiàn)比較簡單,對具有線性順序訪問的程序比較合適,而對其他情況效率不高。因?yàn)榻?jīng)常被訪問的頁面,往往在內(nèi)存中停留最久,結(jié)果這些常用的頁面卻因變老而被淘汰。
舉例如下:
?
?
缺頁9次,總訪問次數(shù)12次缺頁率:9/12 = 75%
LRU算法 (最近最久未使用算法)
利用局部性原理,根據(jù)一個(gè)作業(yè)在執(zhí)行過程中過去的頁面訪問==歷史來推測未來==的行為。它認(rèn)為過去一段時(shí)間里不曾被訪問過的頁面,在最近的將來可能也不會再被訪問。所以,這種算法的實(shí)質(zhì)是:當(dāng)需要淘汰一個(gè)頁面時(shí),總是選擇在最近一段時(shí)間內(nèi)最久不用的頁面予以淘汰。 即淘汰最近最長時(shí)間未訪問過的頁面。
LRU置換算法的硬件支持
-
寄存器為每個(gè)在內(nèi)存中的頁面配置一個(gè)移位寄存器,用來記錄某進(jìn)程在內(nèi)存中各頁的使用情況。移位寄存器表示為R=Rn-1Rn-2Rn-3…R2R1R0當(dāng)進(jìn)程訪問某物理塊時(shí),要將相應(yīng)寄存器的Rn-1位置成1;同時(shí),每隔一定時(shí)間將寄存器右移一位;如果把n位寄存器的數(shù)看作一個(gè)整數(shù),那么具有最小數(shù)值的寄存器所對應(yīng)的頁面,就是最近最久未使用的頁面。
-
棧利用一個(gè)特殊的棧來保存當(dāng)前使用的各個(gè)頁面的頁面號。每當(dāng)進(jìn)程訪問某頁面時(shí),便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此,棧頂始終是最新被訪問頁面的編號,而棧底則是最近最久未使用頁面的頁面號。
?
舉例如下:
?
缺頁7次,總訪問次數(shù)12次缺頁率:7/12 = 58.3%
?
實(shí)際上,LRU算法根據(jù)各頁以前的情況,是“向前看”的,而最佳置換算法則根據(jù)各頁以后的使用情況,是“向后看”的。LRU性能較好,但需要寄存器和棧的硬件支持。
?
LRU是堆棧類的算法。理論上可以證明,堆棧類算法不可能出現(xiàn)Belady異常。
?
FIFO算法基于隊(duì)列實(shí)現(xiàn),不是堆棧類算法。
?
LRU算法的性能接近于OPT,但是實(shí)現(xiàn)起來比較困難,且開銷大;FIFO算法實(shí)現(xiàn)簡單,但性能差。
Clock算法(時(shí)鐘置換算法)
也稱為NRU算法(最近未使用算法)是LRU和FIFO的折中算法。
?
實(shí)現(xiàn):CLOCK算法是給每一個(gè)頁面設(shè)置一個(gè)訪問位,用來標(biāo)識是否最近被訪問過,Clock維護(hù)的是內(nèi)存中頁面組成的循環(huán)鏈表。當(dāng)頁面被裝入內(nèi)存時(shí),或是內(nèi)存中的頁面被訪問時(shí),訪問位被置為1。若內(nèi)存已被裝滿,那就需要淘汰一個(gè)頁面,于是指針就從上一個(gè)被淘汰的頁面的下一個(gè)位置開始,順序去遍歷這循環(huán)列表,訪問到訪問位為1的頁面時(shí),就把該訪問位置0,繼續(xù)遍歷,只要遇到訪問位為0的頁面時(shí),淘汰該頁面。其實(shí)調(diào)入內(nèi)存也是訪問,那么上面就變成了:
?
訪問則置1
替換則遍歷
遍歷遇1置0,遇0替換。
?
舉例如下:
內(nèi)存中共分配3個(gè)頁面資源
?
改進(jìn)后的Clock算法(二次機(jī)會法)
由 訪問位A 和 修改位M 可以組合成下面四種類型的頁面:
?
最近既未被訪問,又未被修改(Visit=0, Modify=0) :是最佳淘汰頁。
最近未被訪問,但已被修改(Visit=0, Modify=1):并不是很好的淘汰頁。
最近已被訪問, 但未被修改(Visit=1, Modify=0):該頁有可能再被訪問。
最近已被訪問且被修改(Visit=1, Modify=1):該頁可能再被訪問。
?
執(zhí)行過程:5. 查找00,有,淘汰,算法結(jié)束!繼續(xù)循環(huán)直到一圈結(jié)束,未找到則下一步;6. 查找01,有,淘汰,算法結(jié)束!未找到繼續(xù)循環(huán)遍歷直到一圈結(jié)束,在此過程中將Visit位置為“0”,未找到則下一步;7. 重復(fù)第一步。
?
優(yōu)點(diǎn):減少磁盤I/O;缺點(diǎn):幾輪掃描,增加開銷!
總結(jié)
以上是生活随笔為你收集整理的OS酱:“哎呀内存太小了,人家又缺页了!”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中select标签怎么用
- 下一篇: 证明:对于一棵二叉树,若度为2的结点有n