一文讀懂存儲(chǔ)管理之頁式、段式、段頁式存儲(chǔ)及優(yōu)缺點(diǎn)
內(nèi)存管理方式主要分為:頁式管理、段式管理和段頁式管理。
頁式管理的基本原理是將各進(jìn)程的虛擬空間劃分為若干個(gè)長度相等的頁。把內(nèi)存空間按頁的大小劃分為片或者頁面,然后把頁式虛擬地址與內(nèi)存地址建立一一對應(yīng)的頁表,并用相應(yīng)的硬件地址轉(zhuǎn)換機(jī)構(gòu)來解決離散地址變換問題。頁式管理采用請求調(diào)頁和預(yù)調(diào)頁技術(shù)來實(shí)現(xiàn)內(nèi)外存存儲(chǔ)器的統(tǒng)一管理。 優(yōu)點(diǎn):沒有外碎片,每個(gè)內(nèi)碎片不超過頁的大小。 缺點(diǎn):程序全部裝入內(nèi)存,要求有相應(yīng)的硬件支持,如地址變換機(jī)構(gòu)缺頁中斷的產(chǎn)生和選擇淘汰頁面等都要求有相應(yīng)的硬件支持。增加了機(jī)器成本和系統(tǒng)開銷。
段式管理的基本思想是把程序按內(nèi)容或過程函數(shù)關(guān)系分成段,每段有自己的名字。一個(gè)用戶作業(yè)或者進(jìn)程所包含的段對應(yīng)一個(gè)二維線性虛擬空間,也就是一個(gè)二維虛擬存儲(chǔ)器。段式管理程序以段為單位分配內(nèi)存,然后通過地址映射機(jī)構(gòu)把段式虛擬地址轉(zhuǎn)換為實(shí)際內(nèi)存物理地址。 優(yōu)點(diǎn):可以分別編寫和編譯,可以針對不同類型的段采取不同的保護(hù),可以按段為單位來進(jìn)行共享,包括通過動(dòng)態(tài)鏈接進(jìn)行代碼共享。 缺點(diǎn):會(huì)產(chǎn)生碎片。 段頁式管理,系統(tǒng)必須為每個(gè)作業(yè)或者進(jìn)程建立一張段表以管理內(nèi)存分配與釋放、缺段處理等。另外由于一個(gè)段又被劃分為若干個(gè)頁,每個(gè)段必須建立一張頁表以把段中的虛頁變換為內(nèi)存中的實(shí)際頁面。顯然與頁式管理時(shí)相同,頁表也要有相應(yīng)的實(shí)現(xiàn)缺頁中斷處理和頁面保護(hù)等功能的表項(xiàng)。 段頁式管理是段式管理和頁式管理相結(jié)合而成,具有兩者的優(yōu)點(diǎn)。 由于管理軟件的增加,復(fù)雜性和開銷也增加。另外需要的硬件以及占用的內(nèi)存也有所增加,使得執(zhí)行速度下降。
首先看一下“基本的存儲(chǔ)分配方式”種類:

1. ?離散分配方式的出現(xiàn)
由于連續(xù)分配方式會(huì)形成許多內(nèi)存碎片,雖可通過“緊湊”功能將碎片合并,但會(huì)付出很大開銷。于是出現(xiàn)離散分配方式:將一個(gè)進(jìn)程直接分散地裝入到許多不相鄰的內(nèi)存分區(qū)中。
下面主要介紹“離散分配”三種方式的基本原理以及步驟:
2. ?基本分頁存儲(chǔ)
2.1.步驟
邏輯空間等分為頁;并從0開始編號
內(nèi)存空間等分為塊,與頁面大小相同;從0開始編號
分配內(nèi)存時(shí),以塊為單位將進(jìn)程中的若干個(gè)頁分別裝入到多個(gè)可以不相鄰接的物理塊中。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ?


2.2.地址結(jié)構(gòu)
分兩部分:頁號、位移量(業(yè)內(nèi)地址)

業(yè)內(nèi)地址的位數(shù)可以決定頁的大小(如上圖每頁大小為4K)。
邏輯地址=頁號&位移量(&號是連接符號,是將頁號作為邏輯地址的最高位)
2.3.地址映射(邏輯地址--->物理地址)
如下圖所示:(物理地址=塊號&塊內(nèi)地址)

因?yàn)閴K的大小=頁的大小,所以塊內(nèi)位移量=頁內(nèi)位移量,所以只需求出塊號即可:

如何求塊號呢?頁表來幫你
頁表:

給定一個(gè)邏輯地址和頁面大小,如何計(jì)算物理地址?
根據(jù)頁面大小可計(jì)算出頁內(nèi)地址的位數(shù)
頁內(nèi)地址位數(shù)結(jié)合邏輯地址計(jì)算出頁內(nèi)地址(即,塊內(nèi)地址)和頁號
頁號結(jié)合頁表,即可得出塊號
塊號&塊內(nèi)地址即可得出物理地址
2.4.地址變換原理及步驟

請看上圖,給出邏輯地址的頁號和頁內(nèi)地址,開始進(jìn)行地址變換:
在被調(diào)進(jìn)程的PCB中取出頁表始址和頁表大小,裝入頁表寄存器
頁號與頁表寄存器的頁表長度比較,若頁號大于等于頁表長度,發(fā)生地址越界中斷,停止調(diào)用,否則繼續(xù)
由頁號結(jié)合頁表始址求出塊號
塊號&頁內(nèi)地址,即得物理地址
以上即為頁式存儲(chǔ)的原理及整個(gè)過程……
3. ? 基本分段存儲(chǔ)
3.1.步驟
邏輯空間分為若干個(gè)段,每個(gè)段定義了一組有完整邏輯意義的信息(如主程序Main()),如:

內(nèi)存空間為每個(gè)段分配一個(gè)連續(xù)的分區(qū)
段的長度由相應(yīng)的邏輯信息組的長度決定,因而各段長度不等,引入分段存儲(chǔ)管理方式的目的主要是為了滿足用戶(程序員)在編程和使用上多方面的要求。
要注重理解,完整的邏輯意義信息,就是說將程序分頁時(shí),頁的大小是固定的,只根據(jù)頁面大小大小死生生的將程序切割開;而分段時(shí)比較靈活,只有一段程序有了完整的意義才將這一段切割開。(例如將一個(gè)人每隔50厘米切割一段,即為分頁;而將一個(gè)人分割為頭部、身體、腿部(有完整邏輯意義)三段,即為分段)
3.2.地址結(jié)構(gòu)
分兩部分:段號、位移量(段內(nèi)地址)

段內(nèi)地址的位數(shù)可以決定段的大小
邏輯地址=段號&段內(nèi)地址(&號是連接符號,是將段號作為邏輯地址的最高位)
3.3.地址映射(邏輯地址--->物理地址)
如下圖所示:(物理地址=基址+段內(nèi)地址)(注意為+號,而不是&號)

由上圖可知若想求物理地址,只需求出基址即可:
如何求基址呢?段表來幫你
段表:

求基址的過程與頁式存儲(chǔ)中求塊號的過程原理相同,這里需要注意的是,物理地址是基址+段內(nèi)地址,而不是基址&段內(nèi)地址,由邏輯地址得到段號、段內(nèi)地址,再根據(jù)段號和段表求出基址,再由基址+段內(nèi)地址即可得物理地址。
3.4.地址變換原理及步驟

請看上圖,給出邏輯地址的段號和段內(nèi)地址,開始進(jìn)行地址變換:
在被調(diào)進(jìn)程的PCB中取出段表始址和段表長度,裝入控制寄存器
段號與控制寄存器的頁表長度比較,若頁號大于等于段表長度,發(fā)生地址越界中斷,停止調(diào)用,否則繼續(xù)
由段號結(jié)合段表始址求出基址
基址+段內(nèi)地址,即得物理地址
以上即為段式存儲(chǔ)的原理及整個(gè)過程……
分頁和分段的主要區(qū)別:

4. ?基本段頁式存儲(chǔ)
4.1.步驟
用戶程序先分段,每個(gè)段內(nèi)部再分頁(內(nèi)部原理同基本的分頁、分段相同)

4.2.地址結(jié)構(gòu)
分三部分:段號、段內(nèi)頁號、頁內(nèi)地址

4.3.地址映射(邏輯地址--->物理地址)
邏輯地址----- >段號、段內(nèi)頁號、業(yè)內(nèi)地址
段表寄存器--- >段表始址
段號+段表始址---- >頁表始址
頁表始址+段內(nèi)頁號----->存儲(chǔ)塊號
塊號+頁內(nèi)地址------>物理地址

4.4.地址變換原理及步驟

請看上圖,給出邏輯地址的段號、頁號、頁內(nèi)地址,開始進(jìn)行地址變換:
在被調(diào)進(jìn)程的PCB中取出段表始址和段表長度,裝入段表寄存器
段號與控制寄存器的頁表長度比較,若頁號大于等于段表長度,發(fā)生地址越界中斷,停止調(diào)用,否則繼續(xù)
由段號結(jié)合段表始址求出頁表始址和頁表大小
頁號與段表的頁表大小比較,若頁號大于等于頁表大小,發(fā)生地址越界中斷,停止調(diào)用,否則繼續(xù)
由頁表始址結(jié)合段內(nèi)頁號求出存儲(chǔ)塊號
存儲(chǔ)塊號&頁內(nèi)地址,即得物理地址
以上即為段頁式存儲(chǔ)的原理及整個(gè)過程……
5. ?總結(jié)
在頁式、段式存儲(chǔ)管理中,為獲得一條指令或數(shù)據(jù),須兩次訪問內(nèi)存;而段頁式則須三次訪問內(nèi)存
