12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理
文章目錄
- 1 基本分頁存儲管理
- 1.1 什么是分頁存儲
- 1.2 重要的數(shù)據(jù)結(jié)構(gòu)——頁表
- 1.3 基本地址變換機(jī)構(gòu)
- 1.4 具有快表的地址變換機(jī)構(gòu)
- 1.4.1 什么是快表(TLB)
- 1.4.2 引入快表后,地址的變換過程
- 1.4.3 地址變換過程小結(jié)
- 1.5 兩級頁表
- 1.5.1 單級頁表存在的問題,為啥引入兩極頁表
- 1.5.2 兩級頁表的原理、地址結(jié)構(gòu)
- 1.5.3 二級頁表如何實現(xiàn)地址變換
- 1.5.4 二級頁表小結(jié)
- 2 基本分段存儲管理方式
- 2.1 分段
- 2.2 段表
- 2.3 地址變換
- 2.4 分段、分頁管理的對比
- 2.5 分段存儲管理小結(jié)
- 3 段頁式存儲管理
- 3.1 分頁、分段優(yōu)缺點分析
- 3.2 分段+分頁=段頁式管理
- 3.3 段頁式管理的邏輯地址結(jié)構(gòu)
- 3.4 段表、頁表
- 3.5 段頁式管理地址變換過程
- 3.6 段頁式管理小結(jié)
1 基本分頁存儲管理
連續(xù)分配:為用戶進(jìn)程分配的必須是一個連續(xù)的內(nèi)存空間。
非連續(xù)分配:為用戶進(jìn)程分配的可以是一些分散的內(nèi)存空間。
1.1 什么是分頁存儲
(注意:進(jìn)程的最后一個頁面可能沒有一個頁框那么大。也就是說,分頁存儲有可能產(chǎn)生內(nèi)部碎片,因此頁框不能太大,否則可能產(chǎn)生過大的內(nèi)部碎片造成浪費)
1.2 重要的數(shù)據(jù)結(jié)構(gòu)——頁表
為了能知道進(jìn)程的每個頁面在內(nèi)存中存放的位置,操作系統(tǒng)要為每個進(jìn)程建立一張頁表。
注:頁表通常存在PCB(進(jìn)程控制塊)中核心問題:
假設(shè)某系統(tǒng)物理內(nèi)存大小為4GB,頁面大小為4KB,則每個頁表項至少應(yīng)該為多少字節(jié)?
頁表項連續(xù)存放,因此頁號可以是隱含的,不占存儲空間(類比數(shù)組)
引出問題:假設(shè)頁表中的各頁表項從內(nèi)存地址為X的地方開始連續(xù)存放…
如何找到頁號為i的頁表項?
i號頁表項的存放地址=X+3*I因此,頁表中的頁號可以是隱含的,即頁號不占用存儲空間
假設(shè)某系統(tǒng)物理內(nèi)存大小為4GB,頁面大小為4KB,則每個頁表項至少應(yīng)該為多少字節(jié)?
進(jìn)程在內(nèi)存中連續(xù)存放時 , 操作系統(tǒng)是如何實現(xiàn)邏輯地址到物理地址的轉(zhuǎn)換的?
過程如下:
思考:將進(jìn)程地址空間分頁之后 ,操作系統(tǒng)該如何實現(xiàn)邏輯地址到物理地址的轉(zhuǎn)換 ?
特點:雖然進(jìn)程的各個頁面是離散存放的,但是頁面內(nèi)部是連續(xù)存放的
如果要訪問邏輯地址A,則 :
邏輯地址A對應(yīng)的物理地址=P號頁面在內(nèi)存中的起始地址+頁內(nèi)偏移量W
子問題:如何確定一個邏輯地址對應(yīng)的頁號、頁內(nèi)偏移量?
Eg:在某計算機(jī)系統(tǒng)中,頁面大小是50B。某進(jìn)程邏輯地址空間大小為200B,則邏輯地址110對應(yīng)的頁號、頁內(nèi)偏移量是多少?
如何計算:
頁號=邏輯地址/頁面長度 (取除法的整數(shù)部分)
頁內(nèi)偏移量=邏輯地址%頁面長度(取除法的余數(shù)部分)
本例中頁號=110/50=2
頁內(nèi)偏移量=110%50=10
邏輯地址可以拆分為(頁號,頁內(nèi)偏移量)
通過頁號查詢頁表,可知頁面在內(nèi)存中的起始地址
頁面在內(nèi)存中的起始地址+頁內(nèi)偏移量=實際的物理地址
邏輯地址→物理地址,二進(jìn)制轉(zhuǎn)化
在計算機(jī)內(nèi)部,地址是用二進(jìn)制表示的, 如果頁面大小剛好是2的整數(shù)冪,則計算機(jī)硬件可以很快速的把邏輯地址拆分成(頁號,頁內(nèi)偏移量)
假設(shè)某計算機(jī)用32個二進(jìn)制位表示邏輯地址,頁面大小為4KB =212 B=4096B
頁號=2/4096=0=00000000000000000000
頁內(nèi)偏移量=2%4096=2=000000000010
頁號=4097/4096=1=00000000000000000001
頁內(nèi)偏移量=4097%4096=1=000000000001
如果每個頁面大小為2KB,用二進(jìn)制數(shù)表示邏輯地址, 則末尾K位即為頁內(nèi)偏移量,其余部分就是頁號
假設(shè)物理地址也用32個二進(jìn)制位表示,則由于內(nèi)存塊的大小=頁面大小,因此:
根據(jù)頁號可以查詢頁表,而頁表中記錄的只是內(nèi)存塊號,而不是內(nèi)存塊的起始地址!
起始地址計算: J號內(nèi)存塊的起始地址=J*內(nèi)存塊大小
假設(shè)通過查詢頁表得知1號頁面存放的內(nèi)存塊號是9(1001),
則9號內(nèi)存塊的起始地址=9X4096=00000000000000001001000000000000
則邏輯地址4097對應(yīng)的物理地址=頁面在內(nèi)存中存放的起始地址+頁內(nèi)偏移量 =(00000000000000000011000000000001)
結(jié)論:如果頁面大小剛好是2 的整數(shù)冪,則只需把頁表中記錄的物理塊號拼接上頁內(nèi)偏移量就能得到對應(yīng)的物理地址
1.3 基本地址變換機(jī)構(gòu)
注意:頁面大小是2的整數(shù)冪
設(shè)頁面大小為L,邏輯地址A到物理地址E的變換過程如下:
變換過程說明:
(注意:頁號從0開始,而頁表長度至少是1,因此P=M時也會越界)
注意區(qū)分頁表項長度、頁表長度、頁面大小的區(qū)別、頁表長度指的是這個頁表中總共有幾個頁表項,即總共有幾個頁;頁表項長度指的是每個頁表項占多大存儲空間;頁面大小指的是一個頁面占多大的存儲空間
例:若頁面大小L為1K字節(jié),頁號2對應(yīng)的內(nèi)存塊號b=8,將邏輯地址A=2500轉(zhuǎn)換為物理地址E。
題目等價描述:某系統(tǒng)按字節(jié)尋址,邏輯地址結(jié)構(gòu)中,頁內(nèi)偏移量占10位,頁號2對應(yīng)的內(nèi)存塊號b=8,將邏輯地址A=2500轉(zhuǎn)換為物理地址E。
頁內(nèi)偏移量占10位,說明一個頁面的大小L為210B=1KB
頁號P=A/L=2500/1024=2;頁內(nèi)偏移量W=A%L=2500%1024=452
在分頁存儲管理(頁式管理)的系統(tǒng)中,只要確定了每個頁面的大小,邏輯地址結(jié)構(gòu)就確定了。因此,頁式管理中地址是一維的。即只要給出一個邏輯地址,系統(tǒng)就可以自動地算出頁號、頁內(nèi)偏移量兩個部分,并不需要顯式地告訴系統(tǒng)這個邏輯地址中,頁內(nèi)偏移量占多少位。
1.4 具有快表的地址變換機(jī)構(gòu)
快表的地址變換機(jī)構(gòu):是基本地址變換機(jī)構(gòu)的改進(jìn)版本
1.4.1 什么是快表(TLB)
快表,又稱聯(lián)想寄存器(TLB,translation lookaside buffer ),是一種訪問速度比內(nèi)存快很多的高速緩存(TLB不是內(nèi)存!),用來存放近訪問的頁表項的副本,可以加速地址變換的速度。 與此對應(yīng),內(nèi)存中的頁表常稱為慢表。
1.4.2 引入快表后,地址的變換過程
(注意:在找到頁表項后,應(yīng)同時將其存入快表, 以便后面可能的再次訪問。但若快表已滿,則必須按照一定的算法對舊的頁表項進(jìn)行替換)
由于查詢快表的速度比查詢頁表的速度快很多,因此只要快表命中,就可以節(jié)省很多時間。 因為局部性原理,一般來說快表的命中率可以達(dá)到90%以上。
- 例:某系統(tǒng)使用基本分頁存儲管理,并采用了具有快表的地址變換機(jī)構(gòu)。訪問一次快表耗時1us,訪問一次內(nèi)存耗時100us。若快表的命中率為90%,那么訪問一個邏輯地址的平均耗時是多少?
說明:
- 有的系統(tǒng)支持快表和慢表同時查找,如果是這樣,平均耗時應(yīng)該是(1+100)* 0.9+(100+100)* 0.1= 110.9us 若未采用快表機(jī)制,則訪問一個邏輯地址需要100+100=200us 顯然,引入快表機(jī)制后,訪問一個邏輯地址的速度快多了。
1.4.3 地址變換過程小結(jié)
TLB和普通Cache的區(qū)別:
TLB中只有頁表項的副本,而普通Cache中可能會有其他各種數(shù)據(jù)的副本
1.5 兩級頁表
1.5.1 單級頁表存在的問題,為啥引入兩極頁表
單級頁表:
某計算機(jī)系統(tǒng)按字節(jié)尋址,支持32位的邏輯地址,采用分頁存儲管理,頁面大小為4KB,頁表項長度為4B。
4KB=212B,因此頁內(nèi)地址要用12位表示,剩余20位表示頁號。
因此,該系統(tǒng)中用戶進(jìn)程最多有220 頁。相應(yīng)的,一個進(jìn)程的頁表中,最多會有220 =1M=1048576個頁表項,所以一個頁表最大需要 220 * 4B=222 B,共需要222 /212 =210 個頁框存儲該頁表。
根據(jù)頁號查詢頁表的方法:K號頁對應(yīng)的頁表項存放位置=頁表始址+K* 4
要在所有的頁表項都連續(xù)存放的基礎(chǔ)上才能用這種方法找到頁表項
根據(jù)局部性原理可知,很多時候,進(jìn)程在一段時間內(nèi)只需要訪問某幾個頁面就可以正常運行了。因此沒有必要讓整個頁表都常駐內(nèi)存。
思考:我們是如何解決進(jìn)程在內(nèi)存中必須連續(xù)存儲的問題的?
將進(jìn)程地址空間分頁,并為其建立一張頁表,記錄各頁面的存放位置同樣的思路也可用于解決“頁表必須連續(xù)存放”的問題,把必須連續(xù)存放的頁表再分頁,從而將頁表拆開
把頁表再分頁并離散存儲,然后再建立一張頁表記錄頁表各個部分的存放位置,稱為頁目錄表,或稱外層頁表,或稱頂層頁表
1.5.2 兩級頁表的原理、地址結(jié)構(gòu)
因此,該系統(tǒng)中用戶進(jìn)程最多有220 頁。相應(yīng)的,一個進(jìn)程的頁表中,最多會有220 =1M=1048576個頁表項,所以一個頁表最大需要 220 * 4B=222 B,共需要222 /212 =210 個頁框存儲該頁表。
10位一級頁號剛好可表示0~1023
1.5.3 二級頁表如何實現(xiàn)地址變換
例:將邏輯地址(0000000000,0000000001,111111111111)轉(zhuǎn)換為物理地址(用十進(jìn)制表示)。
最終要訪問的內(nèi)存塊號為4
該內(nèi)存塊的起始地址為4*4096=16384
頁內(nèi)偏移量為4095
最終的物理地址為 16384+4095=20479
沒有必要讓整個頁表常駐內(nèi)存,因為進(jìn)程在一段時間內(nèi)可能只需要訪問某幾個特定的頁面。
可以在需要訪問頁面時才把頁面調(diào)入內(nèi)存(虛擬存儲技術(shù))。可以 在頁表項中增加一個標(biāo)志位,用于表示該頁面是否已經(jīng)調(diào)入內(nèi)存
例:某系統(tǒng)按字節(jié)編址,采用40位邏輯地址,頁面大小為4KB,頁表項大小為4B,假設(shè)采用純頁式 存儲,則要采用()級頁表,頁內(nèi)偏移量為()位?
頁面大小= 4KB =212B,按字節(jié)編址,因此頁內(nèi)偏移量為12位
頁號= 40-12 = 28位
頁面大小= 212B,頁表項大小= 4B ,則每個頁面可存放212 / 4 = 210個頁表項
因此各級頁表最多包含210個頁表項,需要10 位二進(jìn)制位才能映射到210個頁表項,因此每一級的頁表對應(yīng)頁號應(yīng)為10位。總共28位的頁號至少要分為三級
如果只分為兩級頁表,則一級頁號占18位, 也就是說頁目錄表中最多可能有218個頁表項,超過了一個頁面, 顯然,一個頁面是放不下這么多頁表項的
第一次訪存:訪問內(nèi)存中的頁目錄表
第二次訪存:訪問內(nèi)存中的二級頁表
第三次訪存:訪問目標(biāo)內(nèi)存單元
N級頁表訪問一個邏輯地址,需要N+1次訪存
1.5.4 二級頁表小結(jié)
2 基本分段存儲管理方式
“分段”與“分頁”最大的區(qū)別就是——離散分配時所分配地址空間的基本單位不同
2.1 分段
編譯程序會 將段名轉(zhuǎn)換為段號
由于是按邏輯功能模塊劃分,用戶編程更方便,程序的可讀性更高
上述匯編指令,寫程序時使用的段名[D]、[X]會被編譯程序翻譯成對應(yīng)段號
<A>單元、<B>單元會被編譯程序 翻譯成段內(nèi)地址
分段系統(tǒng)的邏輯地址結(jié)構(gòu)由段號(段名)和段內(nèi)地址(段內(nèi)偏移量)所組成。如:
段號的位數(shù)決定了每個進(jìn)程最多可以分幾個段
段內(nèi)地址位數(shù)決定了每個段的最大長度是多少
在上述例子中,若系統(tǒng)是按字節(jié)尋址的,則段號占16位,因此在該系統(tǒng)中,每個進(jìn)程最多有216 =64K個段; 段內(nèi)地址占16位,因此每個段的最大長度是216 =64KB。
2.2 段表
問題:程序分多個段,各段離散地裝入內(nèi)存,為了保證程序能正常運行,就必須能從物理內(nèi)存中找到各個邏輯段的存放位置。為此,需為每個進(jìn)程建立一張段映射表,簡稱“段表”。
1. 每個段對應(yīng)一個段表項,其中記錄了該段在內(nèi)存中的起始位置(又稱 “基址”)和段的長度。
2. 各個段表項的長度是相同的。
例如:某系統(tǒng)按字節(jié)尋址,采用分段存儲管理,邏輯地址結(jié)構(gòu)為(段號16位,段內(nèi)地址16位),因此用16位即可表示最大段長。物理內(nèi)存大小為4GB(可用32位表示整個物理內(nèi)存地址空間)。
因此,可以讓每個段表項占16+32=48位,即6B。由于段表項長度相同,因此段號可以是隱含的,不占存儲空間。
若段表存放的起始地址為M,則K號段對應(yīng)的段表項存放的地址為M+K*6
2.3 地址變換
2.4 分段、分頁管理的對比
段是信息的邏輯單位。分段的主要目的是更好地滿足用戶需求。一個段通常包含著一組屬于一個邏輯模塊的信息。分段對用戶是可見的,用戶編程時需要顯式地給出段名。
段的長度卻不固定,決定于用戶編寫的程序。
分段的用戶進(jìn)程地址空間是二維的,程序員在標(biāo)識一個地址時,既要給出段名,也要給出段內(nèi)地址。
不能被修改的代碼稱為純代碼或可重入代碼(不屬于臨界資源),這樣的代碼是可以共享的。可修改的代碼是不能共享的(比如,有一個代碼段中有很多變量,各進(jìn)程并發(fā)地同時訪問可能造成數(shù)據(jù)不一致)
只需讓各進(jìn)程的段表項指向同一個段即可實現(xiàn)共享
(1)分頁(單級頁表):第一次訪存——查內(nèi)存中的頁表,第二次訪存——訪問目標(biāo)內(nèi)存單元。總共兩次訪存
(2)分段:第一次訪存——查內(nèi)存中的段表,第二次訪存——訪問目標(biāo)內(nèi)存單元。總共兩次訪存
(3)與分頁系統(tǒng)類似,分段系統(tǒng)中也可以引入快表機(jī)構(gòu),將近期訪問過的段表項放到快表中,這樣可以少一次訪問,加快地址變換速度。
2.5 分段存儲管理小結(jié)
3 段頁式存儲管理
3.1 分頁、分段優(yōu)缺點分析
分段管理中產(chǎn)生的外部碎片也可以用“緊湊”來解決,只是需要付出較大的時間代價
3.2 分段+分頁=段頁式管理
3.3 段頁式管理的邏輯地址結(jié)構(gòu)
即把段內(nèi)地址再拆分為頁號+頁面偏移量
段號的位數(shù)決定了每個進(jìn)程最多可以分幾個段
頁號位數(shù)決定了每個段最大有多少頁
頁內(nèi)偏移量決定了頁面大小、內(nèi)存塊大小是多少
在上述例子中,若系統(tǒng)是按字節(jié)尋址,則
- 段號占16位,因此在該系統(tǒng)中,每個進(jìn)程最多有216=64K個字段
- 頁號占4位,因此每個段最多有24=16頁
- 頁內(nèi)偏移量占12位,因此每個頁面\每個內(nèi)存塊大小為212=4096=4KB
“分段”對用戶是可見的,程序員編程時需要顯式地給出段號、段內(nèi)地址。
而將各段“分頁”對用戶是不可見的。系統(tǒng)會根據(jù)段內(nèi)地址自動劃分頁號和頁內(nèi)偏移量。
因此段頁式管理的地址結(jié)構(gòu)是二維的。
簡記:頁式一維、段式二維、段頁式二維
3.4 段表、頁表
每個段對應(yīng)一個段表項,每個段表項由段號、頁表長度、頁表存放塊號(頁表起始地址)組成。每個段表項長度相等,段號是隱含的。
每個頁面對應(yīng)一個頁表項,每個頁表項由頁號、頁面存放的內(nèi)存塊號組成。每個頁表項長度相等,頁號是隱含的。
3.5 段頁式管理地址變換過程
也可引入快表機(jī)構(gòu),用段號和頁號作為查詢快表的關(guān)鍵字。若快表命中則僅需一次訪存
3.6 段頁式管理小結(jié)
總結(jié)
以上是生活随笔為你收集整理的12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TabError的解决方法
- 下一篇: 8 操作系统第二章 进程管理 信号量