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