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