内存管理之虚拟页式分配
? ? ? ?分頁(yè)內(nèi)存分配和分段內(nèi)存分配可以解決程序在內(nèi)存中離散存放的問(wèn)題,但是,這個(gè)兩種方式都要求程序?qū)?span style="color:#ff0000;">整個(gè)裝入內(nèi)存。如果程序比內(nèi)存大,那么分頁(yè)和分段都無(wú)法解決這個(gè)問(wèn)題。其實(shí)一個(gè)程序在短時(shí)間內(nèi)的執(zhí)行可能局限于某小段程序范圍內(nèi),這樣把程序全部調(diào)入內(nèi)存早成空間浪費(fèi),可以只裝入一部分,進(jìn)程需要的其他數(shù)據(jù)存放在外存,當(dāng)需要的時(shí)候調(diào)入內(nèi)存。這樣做的好處:內(nèi)存中可以保存更多的進(jìn)程;進(jìn)程可以比主存大。
1.虛擬存儲(chǔ)器
? ? ? ?虛擬存儲(chǔ)是指請(qǐng)求調(diào)入功能和置換功能。給用戶(hù)的感覺(jué)是整個(gè)進(jìn)程被調(diào)入了內(nèi)存,其實(shí)是只有一部分,其余部分在外村。虛存就是內(nèi)存和外存之和。虛擬存儲(chǔ)需要解決如下幾個(gè)問(wèn)題:
? ? ?(1)地址映射:一個(gè)頁(yè)面可能多次被調(diào)入和調(diào)出內(nèi)存,每次在內(nèi)存的地址不同,這就需要將邏輯地址轉(zhuǎn)換為相應(yīng)的物理地址,并且是動(dòng)態(tài)的。
? ? ?(2)分配策略:為了訪問(wèn)虛存中的任何部分,待訪問(wèn)的數(shù)據(jù)必須駐留在內(nèi)存。事先要提供一個(gè)種存儲(chǔ)器分配策略,以確定要調(diào)入的部分裝入到存儲(chǔ)器的哪個(gè)位置。
? ? ?(3)置換策略:當(dāng)系統(tǒng)內(nèi)存空間不夠時(shí),系統(tǒng)必須通過(guò)換出頁(yè)面來(lái)找到空間。系統(tǒng)可以將進(jìn)程某些不用的空間換出內(nèi)存,也可以將其他進(jìn)程頁(yè)面換出,如何取舍。
? ? ?(4)裝載控制:靜態(tài)裝載將進(jìn)程的所有虛擬存儲(chǔ)器裝載到內(nèi)存。動(dòng)態(tài)裝載只是用的時(shí)候才裝入。
2.請(qǐng)求分頁(yè)
? ? ? ?請(qǐng)求分頁(yè)存儲(chǔ)管理方式也叫虛擬頁(yè)式分配,是虛擬器存儲(chǔ)器的一種實(shí)現(xiàn)方法。所謂請(qǐng)求分頁(yè)是指在基本分頁(yè)上的基礎(chǔ)上增加請(qǐng)求調(diào)頁(yè)和頁(yè)面置換功能的一種存儲(chǔ)分配策略。純分頁(yè)系統(tǒng)中,進(jìn)程的所有頁(yè)面都在物理內(nèi)存中,而虛擬頁(yè)式分配,一個(gè)進(jìn)程只有部分頁(yè)在內(nèi)存中,一部分在外存中。一旦進(jìn)程訪問(wèn)的頁(yè)不在內(nèi)存,對(duì)進(jìn)程來(lái)說(shuō)就意味著缺頁(yè),就通過(guò)缺頁(yè)中斷向操作系統(tǒng)發(fā)出一個(gè)請(qǐng)求,請(qǐng)求把內(nèi)存中位于外存的頁(yè)調(diào)入內(nèi)存。
? ? ?請(qǐng)求分頁(yè)的硬件支持:頁(yè)表需要加入幾個(gè)標(biāo)志項(xiàng),缺頁(yè)中斷機(jī)構(gòu)和地址變換機(jī)構(gòu)。
? ? ? 內(nèi)存分配策略:分配給一個(gè)進(jìn)程的存儲(chǔ)量越小,內(nèi)存中容納的進(jìn)程數(shù)越多,但是進(jìn)程缺頁(yè)異常也就越頻繁。同時(shí)給進(jìn)程分配一定數(shù)量的物理塊后,由于局部原理,給該進(jìn)程分配更多的頁(yè)物理塊對(duì)該進(jìn)程的缺頁(yè)率無(wú)影響了。三種分配策略:
? ? ?(1)固定分配策略:分配給進(jìn)程的物理塊在運(yùn)行過(guò)程中不變,當(dāng)進(jìn)程發(fā)生缺頁(yè)時(shí),從該進(jìn)程中占用的幾個(gè)物理塊找到一頁(yè)替換出去。
? ? ?(2)可變局部分配策略:內(nèi)存中每個(gè)進(jìn)程分配了一定數(shù)量的物理塊。但是系統(tǒng)中還有一個(gè)空閑物理塊。進(jìn)程發(fā)生缺頁(yè)時(shí),先檢查空閑物理塊,如果有空的,直接分配給進(jìn)程。沒(méi)有空的,只能從進(jìn)程自己的空間中選一頁(yè)置換出去。
? ? ?(3)可變分配全局置換:一旦進(jìn)程發(fā)生缺頁(yè),從整個(gè)內(nèi)存中選擇一頁(yè)置換出去。
? ? ? ?在采用固定分配時(shí),可以按照進(jìn)程數(shù)平均分配給每個(gè)進(jìn)程等份的空間;可以按照進(jìn)程大小比例分配空間;考慮進(jìn)程優(yōu)先級(jí)分配。
3.頁(yè)面轉(zhuǎn)換算法
? ? ??當(dāng)頁(yè)不在內(nèi)存中,系統(tǒng)要選一頁(yè)移到外存中,下面介紹幾個(gè)固定分配局部置換的內(nèi)存分配策略:
? ? ?(1)最優(yōu)頁(yè)面置換算法(OPT):缺頁(yè)時(shí),當(dāng)前內(nèi)存中的這幾頁(yè)中,有的頁(yè)再也不用了,那么把該頁(yè)置換出是最好的。如果當(dāng)前內(nèi)存中的幾頁(yè)都要使用,選擇一個(gè)最后用到的頁(yè)把他轉(zhuǎn)換出去。
范例:內(nèi)存為某進(jìn)程分配三個(gè)物理塊(不能變了),進(jìn)程頁(yè)面走向如下:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
? ? ? ??7:發(fā)生缺頁(yè)中斷,調(diào)入內(nèi)存;? 0:發(fā)生缺頁(yè)中斷,調(diào)入內(nèi)存;1:發(fā)生缺頁(yè)中斷,調(diào)入內(nèi)存;2:需要從7,0,1中選擇一個(gè)置換,頁(yè)面7是第18個(gè)要訪問(wèn)的頁(yè)面,0是第5個(gè)要訪問(wèn)的頁(yè)面,1是第14個(gè)訪問(wèn)的頁(yè)面,所以選擇7置換,即內(nèi)存總還剩2 0 1。依次類(lèi)推。。。
注意:開(kāi)始內(nèi)存是空的,所以沒(méi)有頁(yè)面,這時(shí)也算缺頁(yè)異常。
? ? ? (2)先進(jìn)先出算法:總是選擇當(dāng)前系統(tǒng)中最早進(jìn)入內(nèi)存的那一頁(yè)置換出去。
范例:內(nèi)存為某進(jìn)程分配三個(gè)物理塊(不能變了),進(jìn)程頁(yè)面走向如下:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
? ? ? ?7:發(fā)生缺頁(yè)中斷,調(diào)入內(nèi)存;? 0:發(fā)生缺頁(yè)中斷,調(diào)入內(nèi)存;1:發(fā)生缺頁(yè)中斷,調(diào)入內(nèi)存;2:淘汰7,即內(nèi)存中0 1 2;2:已經(jīng)在內(nèi)存;0:在內(nèi)存;3:0是最早進(jìn)入內(nèi)存的,雖然前一次是0,但是因?yàn)閮?nèi)存中,已經(jīng)有了所以不算新進(jìn)入的。后面依次了退。。
? ? ? ? FIFO算法有時(shí)候會(huì)產(chǎn)生Belady現(xiàn)象,即分配給進(jìn)程空間增大,反而缺頁(yè)率增加了,其他算法沒(méi)有。
? ? ?(3)最近很少使用置換算法(LRU):總是選擇當(dāng)前頁(yè)面中沒(méi)有被使用時(shí)間最久的那一頁(yè),即使用最少的那一頁(yè),將它換出出去。
范例:內(nèi)存為某進(jìn)程分配三個(gè)物理塊(不能變了),進(jìn)程頁(yè)面走向如下:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
最終的序列:(7 0 1)(2 1 0)(0 2 1)(3 0 2)(0 3 2)(4 0 3)(2 4 0)(3 2 4)(0 3 2)(3 0 2)。。。
? ? ?(4)clock算法:針對(duì)FIFO性能差,而LRU實(shí)現(xiàn)困難。Clock算法需要給每個(gè)物理塊增加一個(gè)附加位,稱(chēng)為使用位。當(dāng)某頁(yè)裝入內(nèi)存時(shí),使用位設(shè)為1,物理塊被使用時(shí),也被設(shè)為1。clock算法將頁(yè)面看作一個(gè)循環(huán)緩沖區(qū),并且有一個(gè)指針與之關(guān)聯(lián)。當(dāng)需要進(jìn)行置換的時(shí)候,指針掃描,如果指針?biāo)傅捻?yè)面為0,則被置換。如果不為0,將其置0,繼續(xù)掃描下一塊,直到找到一個(gè)使用位為0的塊。如果所有位都是1,則掃描整個(gè)系統(tǒng),回到指針開(kāi)始的位置替換該頁(yè)。所有的使用位為0,則指針指向的物理塊被替換。
? ? ? ?Unix的clock算法:unix不是在缺頁(yè)的時(shí)候才選擇置換,而是一次缺頁(yè)總是使用當(dāng)前空閑物理塊表中的一塊,如果沒(méi)有空閑塊,則進(jìn)程會(huì)被阻塞,直到有空閑塊。unix中有一個(gè)頁(yè)面守護(hù)進(jìn)程周期性醒來(lái),然后選擇一些使用位為0的頁(yè)面置換出去。
? ? ?(5)改進(jìn)時(shí)鐘算法:時(shí)鐘算法只考慮了每一頁(yè)的使用頻率,并沒(méi)有考慮該頁(yè)是否被修改。如果系統(tǒng)中的某一頁(yè)被換出,而且它被修改了,那么需要把該頁(yè)重新寫(xiě)回外村(沒(méi)有被修改的時(shí)候,不要寫(xiě)到外存,直接替換)。為了區(qū)分是否被修改,額外添加一個(gè)修改位w。新頁(yè)面裝入內(nèi)存時(shí),w=0,修改后,w=1。具有兩個(gè)附加位的物理塊中的頁(yè)具有以下四種情況:
? ? ? ? ? ? ? a.最近未被訪問(wèn)過(guò),未被修改過(guò)(u=0,w=0);//最適合換出的頁(yè)面
? ? ? ? ? ? ? b.最近未被訪問(wèn)過(guò),被修改過(guò)(u=0,w=1);//上面的沒(méi)有選擇這種頁(yè)面
? ? ? ? ? ? ? c.最近被訪問(wèn)過(guò),未被修改過(guò)(u=1,w=0);//上面的沒(méi)有選擇這種頁(yè)面
? ? ? ? ? ? ? c.最近被訪問(wèn)過(guò),被修改過(guò)(u=1,w=1);//上面的沒(méi)有選擇這種頁(yè)面
?
轉(zhuǎn)載于:https://www.cnblogs.com/dyllove98/archive/2013/06/16/3138882.html
總結(jié)
以上是生活随笔為你收集整理的内存管理之虚拟页式分配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python做插件应用_Python插件
- 下一篇: 一个优秀的软件测试工程师需具备的技能