操作系统原理 : 非连续的内存分配,分段,页表
非連續(xù)的內(nèi)存分配通常,分段和分頁兩種方式
由于連續(xù)的內(nèi)存分配方式存在碎片問題。非連續(xù)的內(nèi)存分配就可以充分利用內(nèi)存碎片,主要存在的問題就是開銷,如果碎片多尋址效率會比較慢。
目錄
一、分段
二、分頁機(jī)制
三、頁表
四、二級頁表和多級頁表
五、反向頁表
一、分段
?
1)分段地址空間
數(shù)據(jù)是由段存儲,根據(jù)應(yīng)用執(zhí)行的特點(diǎn)可以將段進(jìn)行分類:例如文件頭,代碼段、數(shù)據(jù)段、符號表、堆、棧等。采用分段管理方式,就是將段進(jìn)行分類區(qū)分管理。
?
2)分段尋址方法
分段尋址方法即根據(jù)邏輯地址空間映射到物理地址空間。將單位邏輯地址分成兩部分,第一部分是段號,第二部分是段內(nèi)的偏移。 段號可在段表里找到物理內(nèi)存中對應(yīng)的起始地址,然后在這起始地址上加上段偏移量,得到程序的內(nèi)存空間起始位置。在段表里除了物理內(nèi)存對應(yīng)的起始地址還包含該段的最大長度限制信息,如果訪問越界則訪問非法(段錯誤異常)
二、分頁機(jī)制
1)分頁地址空間
?分頁和分段一樣,將單位邏輯地址分成兩部分,也需要有一個頁號和頁偏移。區(qū)別在于一個頁的大小不可變,是固定的。它的大小是2的冪。例如512,1024,2048.。。。。 頁號偏移的大小和頁幀偏移的大小是一致的。
頁幀是一種物理內(nèi)存的組織和布局方式,頁是邏輯地址的尋址方式。頁幀也有頁幀號和鎮(zhèn)內(nèi)偏移,物理地址也就可以得出來。例如在一個16bit的地址空間其中9bit是頁幀偏移,剩下7bit表示頁幀號當(dāng)物理地址二元組表示是(3,6)對應(yīng)的地址是1542
(邏輯)頁映射到(物理)頁幀,頁是連續(xù)的虛擬內(nèi)存而頁幀是非連續(xù)的虛擬內(nèi)存,由助于減小內(nèi)存碎片的產(chǎn)生,并不是所有的頁都有對應(yīng)的幀,邏輯地址要步物理內(nèi)存地址來的多,有些邏輯地址的頁號并不能在頁表中找到對應(yīng)的幀號。通常只需要從邏輯地址的頁號在頁表上查詢到幀號,得到幀號。又因?yàn)轫撎柶频拇笮『晚搸频拇笮∫彩且恢隆亩玫轿锢韮?nèi)存的空間。?
?
三、頁表
頁表數(shù)據(jù)結(jié)構(gòu),就相當(dāng)于一個大數(shù)組,頁號就相當(dāng)于數(shù)組的索引,這個大數(shù)組里面存放的就是幀號。通過邏輯頁號算出索引值從而得到幀號,外加上邏輯偏移地址就可以找到物理地址。其中標(biāo)志位中resident表示該頁號是否存在,如果是0則表示沒有可映射的物理內(nèi)存頁號。頁表的建立是由操作系統(tǒng)來完成的,頁表也是需要占用內(nèi)存空間的。
例如:邏輯地址空間有16bit ,意味者2^16 B = 64K的邏輯地址空間,但是物理空間只有32K,頁大小1k。邏輯頁有由元式表示 (4,0),說明頁號是4,偏移量是? 0,經(jīng)過PTBR運(yùn)算得到在頁表中flags=100 , resident位是0,則表示該頁號沒有可對應(yīng)的物理內(nèi)存,得到一個內(nèi)存訪問異常。
同理邏輯頁由二元式表示 (3,1023),說明頁號是3,偏移量是?1023,經(jīng)過PTBR運(yùn)算得到在頁表中flags=011 ,對應(yīng)的幀號frameNum = 00100=4, 所以對應(yīng)的物理內(nèi)存是? (4,1023),由于頁幀號5bit,頁偏移量是10bit 所以對應(yīng)的物理內(nèi)存值是? 2^10 * 4? + 1023? ?=5199
頁表也是需要占用內(nèi)存空間的。假如64位的機(jī)器,每頁1024字節(jié),用一個頁表來完成邏輯地址到物理地址的映射,則需要 2^64 / 1024? =2^54 個映射關(guān)系,意味著如果想要盡可能映射邏輯地址,可能頁表會放的跟大。其次一臺計(jì)算機(jī)上可能會有多個應(yīng)用程序在執(zhí)行,每個應(yīng)用程序都要求自己的一套頁表,所以一般的計(jì)算機(jī)很難完成用單個頁表的完成映射。其次要考慮的是時間開銷問題,因?yàn)轫摫硪彩谴鎯υ趦?nèi)存中,頁表訪問方式相當(dāng)于至少訪問兩次物理內(nèi)存?對于時間上的開銷其中一種方式就是CPU上的緩存機(jī)制,還有一種方式就是間接訪問的方式。
CPU的塊表(TLB),把經(jīng)常訪問的頁號存到TLB,如果命中則直接在CPU中取,如果沒命中再到內(nèi)存頁表中取,取完后更新塊表。注意這個取TLB的過程是由CPU完成,而TLB未命中后的操作由操作系統(tǒng)完成。
四、二級頁表和多級頁表
一般的計(jì)算機(jī)很難完成用單個頁表的完成映射,可以用多級頁表完成。即只有最后一級的頁表項(xiàng)存的是頁幀,而第一級開始當(dāng)作頁表的索引,頁表項(xiàng)存的是下級頁表的起始地址。當(dāng)然resident標(biāo)志在索引層頁表是可以省略的。雖然頁表增多,但是到最后的偏移量是不變的。多級頁表在相同的內(nèi)存空間下增加了多層級的訪問映射,層級雖多,但是頁表總大小要比單一頁表大小來的少得多,當(dāng)然訪問時間的開銷就會變得大。
五、反向頁表
有沒有一種方法讓,頁表的空間大小和邏輯地址頁號沒有直接的關(guān)系,盡量和物理地址空間的頁號建立映射關(guān)系,這么做的好處就是占用地址空間相對較少。那么這種方案需要考慮的問題就是CPU獲取邏輯地址時怎么樣去取物理地址?
可以利用當(dāng)前程序運(yùn)行的進(jìn)程號Pid 和CPU獲取到的頁表號通過一個簡單的hash函數(shù)得到一個頁幀號。組織結(jié)構(gòu)沒變、當(dāng)然hash函數(shù)最好通過硬件計(jì)算(PTBR頁表基址寄存器)來實(shí)現(xiàn),此方法需要考慮的時鍵值沖突的問題。
?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的操作系统原理 : 非连续的内存分配,分段,页表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统原理:连续的内存分配
- 下一篇: Linux C :C的汇编码生成