分頁存儲和分段存儲


預備知識:

以下討論默認運算優先級為算數優先級,若未特殊說明,"="表示相等關系.

1.二進制乘數詞頭國際單位制詞頭

以M(兆)為例:

圖一

圖二

圖三

 

圖一為國際單位制兆以及相應詞頭間轉換關系,結合圖二可以看出,兩種詞頭表示的"兆"之間有明顯區別,兆在國際單位制中大於二進制中.其它詞頭可以相類比.

我們從店家購買U盤內存條等存儲大小都是按照國際單位制詞頭標識,但是計算機大多是按照二進制乘數詞頭標識.因而有買32G U盤,插入電腦一看總容量只有29.8GB.

1999年,國際電工委員會(IEC)擬定了一種新標准,簡單說就是在二進制詞頭的英文字符后加一個"i",取自binary.按這個標准,上面的U盤應該標注為29.8GiB.但是除了在相關行業,市場上大多還是沿用的SI的詞頭.

我們不關心這個,只記住下文采用IEC標准,前面這些都只是為了理解下面的知識. 

2.按字節編址和按字編址

假設某計算機為64位(bit),並假設一塊內存大小2GiB,那么所謂的自然字長就是64bit.這個條件只在按字編址的時候用到.

按字節編址就是說,一個地址對應一個字節的存儲空間.那么這2GiB編址或者尋址的范圍怎么算?一種思路是把所有詞頭都化為bit(縮寫為b).

2GiB=2^34bit 按字節(Byte縮寫為B)那么 1B=8=2^3b 所以 2^34 / 2^3 = 2^31 ,也就是說需要31條地址線,尋址范圍為 0~(2^31-1) .

按字編址,由於字長為64b,即 2^6b.那么 2^34 / 2^6 = 2^28 ,需要28條地址線,尋址范圍 0~(2^28-1).

可以看出按字編址需要的地址線更少.我們關心的是大多數計算機內存都是按字節編址,或者說下面說的頁表段表是按照字節編址.

即一個地址對應一個字節!

3.邏輯地址空間和物理地址空間

目標程序中使用的是邏輯地址,總是從0開始編址.邏輯地址對應實際的地址就是物理地址,邏輯地址到物理地址之間有一個轉換關系,具體見下文.

4.內部碎片外部碎片

內部碎片指以分配給進程的內存,但是部分未能被利用到,外部碎片指某種存儲管理方法下無法被分配的片段.


 

一.基本分頁存儲管理

1.頁面和頁框(物理塊)

分頁存儲管理將邏輯地址空間分為相等大小的若干頁,從0開始編號.相應地,把物理地址空間也分為若干個塊,也是從0開始編號.但是不一定或者說一般兩者的編號不是直接對應相等的.實際可能是0頁對應3塊...

我們的討論基於頁面大小等於塊大小,即頁內位移等於塊內位移.這樣兩者大小對應,並且可以簡化模型.

頁面大小選取關乎內存效率,小可以減少內部碎片但進程會占用更多頁面進而花更多時間在換頁上,大可以減少頁面長度但又會導致頁內碎片增大.我們的討論頁面大小為4KiB.

2.地址結構

假設系統為32b,那么

低12b表示位移量W,因為是按字節編址,同時也說明頁面大小為2^12B=4KiB.這個位移量就是頁內偏移也等於塊內偏移.

高20b代表也號,最大有2^20=1M頁.一個進程中的邏輯地址按如上方法描述.

假設某邏輯地址為A,那么P=A/L,'/'為取整,'L'為頁面大小,這里為4KiB.W=A%L.

3.頁表

前面提到的邏輯地址到物理地址轉換中,頁表就是描述(指定)兩者對應關系.

頁表由若干連續頁表項構成,本身需要放進內存里面,占用內存空間.

一個頁表項由頁號及其對應的塊號構成,由於一個頁表占用的是連續空間,所以頁號本身不需要存儲,只需要頁表的起始地址和根據邏輯地址算出來的頁內位移就可以找到所有物理塊.

頁表寄存器(PageTableRegister)被設計來存儲頁表起始地址和頁表長度(頁表大小).頁表長度用於判斷非法訪問中斷的條件.

 4.地址轉換

1.根據邏輯地址計算出頁號,頁號同頁面大小比較,等於或大於即產生中斷,否則進入下一步.

2.頁表(起)始地址+頁號*頁表項長度,得到該表項在頁表中的位置,訪問它即可得到塊號(物理地址).(第一次內存訪問)

3.塊號+頁內位移,得到欲訪問數據的最終地址,訪問它即可得到數據.(第二次內存訪問)

這個頁表項長度尤為注意!什么是頁表項長度(也稱頁表項大小)?

前面說了,頁表本身是要放進內存里的,且頁表占用的是一個連續空間.那么相鄰頁表項之間差多少地址?我也不知道!

這得看具體內存管理怎么設計的,一個頁表項用來存儲塊號,這個塊號最大有多大,需要占用多少個二進制位來存儲是需要看某具體機器的.

而且一頁表項還會存儲某些控制位,如讀寫控制.只需一個bit,我令它為0時表示可以讀寫,1時只能讀.這樣可以提供一種保護機制.看教科書或者參考書說的4B其實也是假設的,不要理解為32b的計算機,頁表項大小就一定是4B=32b!

 

注意區分(ctrl+f):頁面大小,頁表大小,頁表長度,頁表項大小,頁表項長度.有的是相同有的是包含.只說沒提到的,頁表大小=頁表長度*頁表項大小.

二.基本分段存儲管理

1.地址結構

由於頁表大小太大(相對的),實際可能不會有那么一塊大的且連續的內存來存儲頁表.(分段存儲的其他諸多優點自行翻書).人們又設計了另一種存儲方法.

那么

 高低個16b.

可以看到和分頁地址很像,確實有很多特性類似,但是實際分段是二維而分頁是一維.

因為分頁只是計算機自動完成將進程用到的內存(邏輯的)分成若干連續頁,某個邏輯地址對應的物理地址是一維對應,本身頁表項也只存了塊號.

而分段,段表項存的是某段段長和該段始址.分段每一段長度沒規定一定要相等!所以有種二維特性.

2.段表

地址空間被分為若干段,每段編址都從0開始,不同段通過段號確定.

 既然不同段都是從0開始編址,那我怎么知道0到底是哪段?

這里的編址說的是編邏輯地址中的低16b,即段內地址.段號是裝入時分別分配的.

也就是說不會有兩個邏輯地址相等,最多只是低16b相等,但是32b是不等的.

3.地址變換

1.邏輯地址>>16得到段號,段號同段表長度比較,等於或大於即產生中斷,否則進入下一步.

2.段表(起)始地址+段號*段表項長度,得到該表項在段表中的位置,訪問它即可得到段長和段始址.(第一次內存訪問)

3.檢查段內地址是否超過段長,等於或大於產生中斷,否則進入下一步.

4.該段始址+段內位移,得到欲訪問數據的最終地址,訪問它即可得到數據.(第二次內存訪問)

我們的所有討論都基於這個段表項大小.

19版天勤OS筆記說

湯曉丹4版OS指出,

頁表段表在內存中是一樣的,都要一塊連續而完整的空間.只是由於一段大小往往大於一頁大小,因而段表小於頁表.

但是對於頁號或者段號,他們的分布是類似的,因而獲取某個段表項應該和頁表項應該是一樣的.

看書時一直想不明白,天勤這個應該是寫錯了.只是練習題中,往往段號塊號直接給出,你直接去看表就定位到段表項了,不會算這一步.

 


 

REF:

https://zh.wikipedia.org/wiki/%E5%9B%BD%E9%99%85%E5%8D%95%E4%BD%8D%E5%88%B6%E8%AF%8D%E5%A4%B4

https://zh.wikipedia.org/wiki/%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%B9%98%E6%95%B0%E8%AF%8D%E5%A4%B4

https://blog.csdn.net/qq_26222859/article/details/50558253

https://blog.csdn.net/qq_28602957/article/details/53637103

https://blog.csdn.net/misayaaaaa/article/details/77622207


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM