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)程間的段共享