4物理內(nèi)存管理:非連續(xù)內(nèi)存管理

6.1非連續(xù)內(nèi)存分配的需求背景

用戶想要一塊區(qū)域,而在內(nèi)存當(dāng)中又沒有滿足這個(gè)大小的連續(xù)區(qū)域,那這個(gè)分配就會(huì)失敗,基于這種現(xiàn)狀提出了一種需求,說我是否可以分配的內(nèi)存空間不連續(xù)

非連續(xù)分配的設(shè)計(jì)目標(biāo)

連續(xù)分配的缺點(diǎn)

分配給程序的物理內(nèi)存必須連續(xù)

存在外碎片和內(nèi)碎片

內(nèi)存分配的動(dòng)態(tài)修改困難

內(nèi)存利用率較低

非連續(xù)分配的設(shè)計(jì)目標(biāo):提高內(nèi)存利用效率和管理靈活性

非連續(xù)分配的設(shè)計(jì)目標(biāo):提高內(nèi)存利用效率和管理靈活性

允許共享代碼與數(shù)據(jù)

支持動(dòng)態(tài)加載和動(dòng)態(tài)鏈接

非連續(xù)內(nèi)存分配的實(shí)現(xiàn)

■非連續(xù)分配需要解決的問題

·如何實(shí)現(xiàn)虛擬地址和物理地址的轉(zhuǎn)換

軟件實(shí)現(xiàn)(靈活,開銷大)

硬件實(shí)現(xiàn)(夠用,開銷小)

■非連續(xù)分配的硬件輔助機(jī)制

·如何選擇非連續(xù)分配中的內(nèi)存分塊大小

段式存儲(chǔ)管理(segmentation)

段式存儲(chǔ)分的塊比較大,它以一個(gè)段作為一個(gè)基本的單位,在分配的時(shí)候,這一個(gè)段的內(nèi)容必須在物理內(nèi)存里是連續(xù)的,不同段之間是可以放到不同地方的

頁式存儲(chǔ)管理(paging)

把內(nèi)存分成更小的塊,這個(gè)塊的名字叫做頁,在分配的時(shí)候就是以頁為單位來分配,頁與頁之間是不連續(xù)的

6.2段式存儲(chǔ)管理 (segmentation)

段地址空間

■進(jìn)程的段地址空間由多個(gè)段組成

主代碼段

子模塊代碼段

公用庫代碼段

堆棧段(stack)

堆數(shù)據(jù)(heap)

初始化數(shù)據(jù)段

符號(hào)表等

■段式存儲(chǔ)管理的目的

更細(xì)粒度和靈活的分離與共享

段式地址空間的不連續(xù)二維結(jié)構(gòu)

段地址空間的邏輯視圖

段訪問機(jī)制

■段的概念

段表示訪問方式和存儲(chǔ)數(shù)據(jù)等屬性相同的一段地址空間

對(duì)應(yīng)一個(gè)連續(xù)的內(nèi)存“塊”

若干個(gè)段組成進(jìn)程邏輯地址空間

■段訪問:邏輯地址由二元組(s, addr)表示

s— 段號(hào)

addr— 段內(nèi)偏移

段訪問的硬件實(shí)現(xiàn)

段表,每個(gè)條目都有段基地址和段界限。段基地址包含該段在內(nèi)存中的開始開始物理地址,而段界限指定該段的長度。

6.3頁式存儲(chǔ)管理(paging)

■頁幀(幀、物理頁面, Frame, Page Frame)

把物理地址空間劃分為大小相同的基本分配單位(稱為幀)

2的n次方,如512, 4096, 8192

■頁面(頁、邏輯頁面, Page)

把邏輯地址空間也劃分為相同大小的基本分配單位(稱為頁)

幀和頁的大小必須是相同的

■頁面到頁幀

邏輯地址到物理地址的轉(zhuǎn)換

頁表

MMU(內(nèi)存管理單元)/TLB(高速緩存)

注:frame和page之間的區(qū)別是在于,一個(gè)用來描述邏輯頁面,一個(gè)用來描述物理頁幀

幀(Frame)

■物理內(nèi)存被劃分成大小相等的幀

內(nèi)存物理地址的表示:二元組(f, o)

f— 幀號(hào)(F位,共有2F個(gè)幀)

o— 幀內(nèi)偏移(S位,每幀有2S字節(jié))

物理地址= ?f * 2^S + o

概念:幀表:物理內(nèi)存分配細(xì)節(jié)。每個(gè)條目對(duì)應(yīng)著每一個(gè)幀,是空閑還是占用,被那個(gè)進(jìn)程的哪個(gè)頁所占用。

基于頁幀的物理地址計(jì)算實(shí)例

頁(Page)

進(jìn)程邏輯地址空間被劃分為大小相等的頁

頁內(nèi)偏移=幀內(nèi)偏移

通常:頁號(hào)大小≠ 幀號(hào)大小

進(jìn)程邏輯地址的表示:二元組(p, o)

p— 頁號(hào)(P位, 2P個(gè)頁)

o— 頁內(nèi)偏移(S位,每頁有2S字節(jié))

虛擬地址= p * 2^S + o

概念:采用分頁技術(shù)不會(huì)產(chǎn)生外部碎片:每個(gè)幀都可以分配給需要它的進(jìn)程。不過會(huì)產(chǎn)生內(nèi)部碎片。

頁式存儲(chǔ)中的地址映射

頁到幀的映射

邏輯地址中的頁號(hào)是連續(xù)的

物理地址中的幀號(hào)是不連續(xù)的

不是所有的頁都有對(duì)應(yīng)的幀

頁表

概念:保護(hù)

內(nèi)存保護(hù)是通過與每個(gè)幀相關(guān)聯(lián)的保護(hù)位來實(shí)現(xiàn)的。存在頁表中。表示是可讀寫還是只讀的。可以通過檢查保護(hù)位來驗(yàn)證有沒有讀寫的誤操作。

6.4頁表

頁表結(jié)構(gòu)

■每個(gè)進(jìn)程都有一個(gè)頁表

每個(gè)頁面對(duì)應(yīng)一個(gè)頁表項(xiàng)

隨進(jìn)程運(yùn)行狀態(tài)而動(dòng)態(tài)變化

頁表基址寄存器(PTBR: Page Table Base Register)

頁表地址轉(zhuǎn)換實(shí)例

頁式存儲(chǔ)管理機(jī)制的性能問題

■內(nèi)存訪問性能問題

訪問一個(gè)內(nèi)存單元需要2次內(nèi)存訪問

第一次訪問:獲取頁表項(xiàng)

第二次訪問:訪問數(shù)據(jù)

頁表大小問題:

■頁表可能非常大

64位機(jī)器如果每頁1024字節(jié),那么一個(gè)頁表的大小會(huì)是多少?

2^64/2^13(1024字節(jié)對(duì)于的比特)

■如何處理?

緩存(Caching)

將數(shù)組的第一項(xiàng)得到的頁表項(xiàng)緩存下來,要訪問第二項(xiàng)的時(shí)候直接去緩存中去找相應(yīng)的頁

間接(Indirection)訪問

頁表很大,一個(gè)很長的表,切段,先找它在那個(gè)字表,再去字表內(nèi)找

快表(Translation Look-aside Buffer, TLB)

快表實(shí)際上就是把近期訪問過的頁表項(xiàng)緩存到CPU里頭。在CPU里面加上一組關(guān)聯(lián)存儲(chǔ)器,key是邏輯地址,value是物理地址(頁幀號(hào))。

TLB采用小但專用且快速的硬件緩沖,又稱為轉(zhuǎn)換表緩沖區(qū),關(guān)聯(lián)的快速內(nèi)存。

■緩存近期訪問的頁表項(xiàng)

TLB使用關(guān)聯(lián)存儲(chǔ)(associative memory)實(shí)現(xiàn),具備快速訪問性能

如果TLB命中,物理頁號(hào)可以很快被獲取

如果TLB未命中,對(duì)應(yīng)的表項(xiàng)被更新到TLB中

多級(jí)頁表

對(duì)于整個(gè)列表中沒有用的頁表,可以通過各級(jí)頁表當(dāng)中的存在位把那些不存在的給省掉

■通過間接引用將頁號(hào)分成k級(jí)

建立頁表“樹”

減少每級(jí)頁表的長度

二級(jí)頁表實(shí)例

大地址空間問題

■對(duì)于大地址空間(64-bits)系統(tǒng),多級(jí)頁表變得繁瑣.

比如:5級(jí)頁表

邏輯(虛擬)地址空間增長速度快于物理地址空間

■頁寄存器和反置頁面的思路

不讓頁表與邏輯地址空間的大小相對(duì)應(yīng)

讓頁表與物理地址空間的大小相對(duì)應(yīng)

頁寄存器(Page Registers)

■每個(gè)幀與一個(gè)頁寄存器(Page Register)關(guān)聯(lián),寄存器內(nèi)容包括:

使用位(Residence bit):此幀是否被進(jìn)程占用

占用頁號(hào)(Occupier):對(duì)應(yīng)的頁號(hào)p(一個(gè)進(jìn)程占用了這一頁,它的邏輯頁號(hào)是多少,把頁號(hào)保存下來)

保護(hù)位(Protection bits)

頁寄存器方案的特征

■優(yōu)點(diǎn):

頁表大小相對(duì)于物理內(nèi)存而言很小

頁表大小與邏輯地址空間大小無關(guān)

■缺點(diǎn):

頁表信息對(duì)調(diào)后,需要依據(jù)幀號(hào)可找頁號(hào)

在頁寄存器中搜索邏輯地址中的頁號(hào)

頁寄存器中的地址轉(zhuǎn)換

■CPU生成的邏輯地址如何找對(duì)應(yīng)的物理地址?

對(duì)邏輯地址進(jìn)行Hash映射,以減少搜索范圍

需要解決可能的沖突

■用快表緩存頁表項(xiàng)后的頁寄存器搜索步驟

對(duì)邏輯地址進(jìn)行Hash變換

在快表中查找對(duì)應(yīng)頁表項(xiàng)

有沖突時(shí)遍歷沖突項(xiàng)鏈表

查找失敗時(shí),產(chǎn)生異常

■快表的限制

快表的容量限制

快表的功耗限制(StrongARM上快表功耗占27%)

反置頁表

反置頁表對(duì)于每個(gè)真正的內(nèi)存或幀才有一個(gè)條目。每個(gè)條目保護(hù)保存在真正內(nèi)存位置的頁的虛擬地址以及擁有該頁的進(jìn)程信息。實(shí)現(xiàn)共享內(nèi)存時(shí)存在困難

■基于Hash映射值查找對(duì)應(yīng)頁表項(xiàng)中的幀號(hào)

進(jìn)程標(biāo)識(shí)與頁號(hào)的Hash值可能有沖突

頁表項(xiàng)中包括保護(hù)位、修改位、訪問位和存在位等標(biāo)識(shí)

哈希頁表

每個(gè)元素有3個(gè)域(1)虛擬頁碼,(2)所映射的幀號(hào)(3)指向鏈表的下一個(gè)元素的指針。

反置頁表的Hash沖突

6.5段頁式存儲(chǔ)管理

段頁式存儲(chǔ)管理的需求

段式存儲(chǔ)在內(nèi)存保護(hù)方面有優(yōu)勢(shì),頁式存儲(chǔ)在內(nèi)存利用和優(yōu)化轉(zhuǎn)移到后備存儲(chǔ)方面有優(yōu)勢(shì)。

段式存儲(chǔ)、頁式存儲(chǔ)能否結(jié)合?

由于段式存儲(chǔ),它分的塊比較大,每一塊里頭的存儲(chǔ)的內(nèi)容是同一個(gè)段,這同一個(gè)段的訪問方式和存儲(chǔ)的數(shù)據(jù)都是相同的或者相類似的,做存儲(chǔ)的保護(hù)是比較方便的,而另一種做法頁式存儲(chǔ),它是由于分了很小的標(biāo)準(zhǔn)大小的塊,那這樣的話它在內(nèi)存利用效率,內(nèi)存和外存之間的存儲(chǔ)的后備,這方面是會(huì)比較有優(yōu)勢(shì)。

段頁式存儲(chǔ)管理

首先是段號(hào)由進(jìn)程的段基址找到相應(yīng)的段表基址,找到相應(yīng)的段表項(xiàng),這個(gè)段表項(xiàng)里面有相應(yīng)段的段長度和段基址,那這些加在一起得到一個(gè)相應(yīng)段的頁表的基址,這個(gè)再加上頁號(hào),就可以得到相應(yīng)的頁表項(xiàng),頁表項(xiàng)里頭呢就有對(duì)應(yīng)的物理頁的頁號(hào)、物理頁幀號(hào)。這個(gè)頁幀號(hào)和頁內(nèi)偏移加在一起就可以訪問到實(shí)際的物理存儲(chǔ)單元。

■在段式存儲(chǔ)管理基礎(chǔ)上,給每個(gè)段加一級(jí)頁表

段頁式存儲(chǔ)管理中的內(nèi)存共享

可以在段表的基址上加上一個(gè)共享段,指向相同的頁表,那這兩個(gè)段就共享了

■通過指向相同的頁表基址,實(shí)現(xiàn)進(jìn)程間的段共享

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容