操作系统 —— 内存管理
目錄
- 一、思維導圖
- 二、內存的基礎知識
- 2.1 什么是內存?
- 2.2 存儲單元
- 2.3 邏輯地址和物理地址
- 2.4 編譯、鏈接、裝入
- 2.4.1 編譯
- 2.4.2 鏈接
- 鏈接的三種方式 :
- 2.4.3 裝入
- 裝入的三種方式:
- 三、內存保護
- 四、內存空間的擴充
- 4.1 覆蓋與交換
- 4.1.1 覆蓋技術
- 4.1.2 交換技術
- 4.2 虛擬內存
- 4.2.1 傳統存儲管理方式的特征、缺點
- 4.2.2 高速緩沖技術的思想
- 4.2.3 虛擬內存的定義和特征
- 4.2.4 虛擬內存的實現
- 請求分頁存儲管理
- 頁面置換算法
- 頁面分配、置換策略
- 駐留集
- 策略
- 何時調入頁面
- 何處調入頁面
- 抖動現象
- 工作集
- 四、內存空間的分配和回收
- 4.1 連續分配管理方式
- 4.1.1 單一連續分配
- 4.1.2 固定分區分配
- 4.1.3 動態分區分配
- 4.1.4 動態分區分配算法
- 4.2 非連續分配管理方式
- 4.2.1 基本分頁存儲管理
- 頁框和頁面
- 地址轉換的實現
- 頁表
- 基本地址變換機構
- 具有快表的地址變換機構
- 兩級頁表
- 4.2.2 基本分段存儲管理
- 分段系統的邏輯地址結構
- 段表
- 查找過程
- 分段、分頁管理的對比
- 4.2.3 段頁式內存管理方式
- 分頁, 分段管理的優缺點分析
- 段頁式系統的邏輯地址結構
- 段表、頁表
- 查找過程
一、思維導圖
有需要可以下載:內存管理思維導圖PNG
二、內存的基礎知識
- 進程應該放在內存的哪里?
- 操作系統如何記錄哪些內存區域已經被分配了,哪些還空閑?
- 當進程運行結束之后,如何將進程占用的內存空間釋放?
2.1 什么是內存?
內存是用于存放數據的硬件
程序執行前需要先放到內存中才能被cpu處理
2.2 存儲單元
如果計算機"按字節編址", 每個存儲單元大小為 8 bit
如果計算機"按字編址", 每個存儲單元大小為 16 bit
2.3 邏輯地址和物理地址
指令的編指一般采用邏輯地址,即相對地址
物理地址 = 起始地址 + 邏輯地址
2.4 編譯、鏈接、裝入
2.4.1 編譯
由編譯程序將用戶源代碼編譯成若干個目標模塊
2.4.2 鏈接
由連接程序將編譯后形成的一組目標模塊以及所需函數連接在一起, 形成一個完整的裝入模塊
鏈接的三種方式 :
靜態鏈接
在程序運行之前,先將各目標模塊以及它們所需的庫函數連接成一個完整的可執行文件(裝入模塊),之后不再拆開。
裝入時動態鏈接
將各目標模塊裝入內存時,邊裝入邊鏈接的鏈接方式。
運行時動態鏈接
在程序執行中需要該目標模塊時,才對它進行鏈接。其優點是便于修改和更新,便于實現對目標模塊的共享。
2.4.3 裝入
由裝入程序將裝入模塊裝入內存運行
為了使編程更方便,程序員寫程序時應該只需關注指令、數據的邏輯性。而邏輯地址到物理地址的轉換(這個過程稱為地址重定位),應該由操作系統負責,這樣就保證了程序員寫程序時不需要關注物理內存的實際情況。
裝入的三種方式:
絕對裝入
在編譯時,如果知道程序將放到內存的哪個位置,編譯程序將產生絕對地址的目標代碼, 裝入程序按照裝入模塊中的地址,將程序和數據裝入內存【靈活性低, 只適合單道程序環境,無操作系統】
靜態重定位
又稱為可重定位裝入。 編譯, 鏈接后的裝入模塊地址都是從 0 開始的,指令中使用的地址和數據存放的地址都是相對于起始地址而言的邏輯地址。可以根據內存的當前狀況將裝入模塊裝入到內存的適當位置。裝入時對地址進行"重定位",邏輯地址變換為物理地址(地址變換是在裝入時一次完成的)。【早期多道批處理系統】
動態重定位
裝入程序把裝入模塊裝入內存后不會立即把邏輯地址轉換為物理地址,而是把地址轉換推遲到程序真正要執行時才進行。因此裝入內存后所有的地址依然是邏輯地址。這種方式需要一個重定位寄存器(存放裝入模塊的起始位置)的支持。【現代操作系統】
三、內存保護
上、下限寄存器
在CPU設置一對上、下限寄存器,存放進程的上、下限地址。進程的指令要訪問某個地址時,CPU檢查是否越界。
重定位寄存器、界地址寄存器
采用重定位寄存器(又稱基址寄存器)和界地址寄存器(又稱限長寄存器)進行越界檢查。重定位寄存器中存放的是進程的起始物理地址。界地址寄存器中存放的是進程的最大邏輯地址。
四、內存空間的擴充
4.1 覆蓋與交換
覆蓋, 交換, 虛擬存儲技術常用于實現內存空間的擴充
4.1.1 覆蓋技術
覆蓋技術的思想:將程序分為多個段,常用的段常駐內存,不常用的段在需要的時候調入內存
內存中分為一個"固定區" 和若干個"覆蓋區",常用的段放在固定區,不常用的段放在覆蓋區
缺點:必須由程序員聲明覆蓋結構, 對用戶不透明, 增加了用戶的編程負擔,覆蓋技術只用于早期的操作系統中。
4.1.2 交換技術
交換技術的思想:內存空間緊張時, 系統將內存中某些進程暫時換出外存,把外存中某些已具備運行條件的進程換入內存(即進程在內存與磁盤間動態調度)
1、應該在外存(磁盤)的什么位置保存被換出的進程?
2、什么時候應該交換?
3、應該換出哪些進程?
1.具有對換功能的操作系統中,通常把磁盤空間分為文件區和對換區兩部分。文件區主要用于存放文件,主要追求存儲空間的利用率,因此對文件區空間的管理采用離散分配方式;對換區空間只占磁盤空間的小部分,被換出的進程數據就存放在對換區。由于對換的速度直接影響到系統的整體速度,因此對換區空間的管理主要追求換入換出速度,因此通常對換區采用連續分配方式。總之,對換區的I/o速度比文件區的更快。
2.交換通常在許多進程運行且內存吃緊時進行,而系統負荷降低就暫停。例如:在發現許多進程運行時經常發生缺頁,就說明內存緊張,此時可以換出一些進程;如果缺頁率明顯下降,就可以暫停換出。
3.可優先換出阻塞進程;可換出優先級低的進程;為了防止優先級低的進程在被調入內存后很快又被換出,有的系統還會考慮進程在內存的駐留時。
4.2 虛擬內存
虛擬內存的目的是為了讓物理內存擴充成更大的邏輯內存,從而讓程序獲得更多的可用內存。
4.2.1 傳統存儲管理方式的特征、缺點
1、一次性:作業必須一次性全部裝入內存后才能開始運行
- 作業很大時,無法裝入導致大作業無法運行
- 大量作業要求運行時內存無法容納所有作業,導致多道程序并發度下降
2、駐留性:一旦作業被裝入內存,就會一直駐留在內存中,直到作業運行結束,這樣會導致內存中駐留大量的,暫時用不到的數據,浪費內存資源。
4.2.2 高速緩沖技術的思想
將近期會頻繁訪問到的數據放到更高速的存儲器中,暫時用不到的數據放在更低速存儲器中。
4.2.3 虛擬內存的定義和特征
-
在程序裝入時,將程序中很快會用到的部分裝入內存,暫時用不到的部分留在外存,就可以讓程序開始執行。
-
在程序執行過程中,當所訪問的信息不在內存時,由操作系統負責將所需信息由外存調入內存,然后繼續執行程序。請求調頁/段
-
內存空間不夠時, 操作系統負責將內存中暫時用不到的信息換出到外存。頁面置換
-
在用戶看來,就有一個比實際內存大很多的內存,這就叫虛擬內存。
虛擬內存的最大容量是由計算機的地址結構(CPU的尋址范圍)確定的
虛擬內存的實際容量 = min(內存容量+外存容量,CPU尋址范圍)
特征:
多次性:無需在作業運行時一次性全部裝入內存,而是允許被分成多次調入內存。
對換性:在作業運行時無需一直常駐內存,而是允許在作業運行過程中,將作業換入、換出。
虛擬性:從邏輯上擴充了內存的容量,使用戶看到的內存容量遠大于實際容量。
4.2.4 虛擬內存的實現
請求分頁存儲管理
頁表機制
缺頁中斷機構
在請求分頁操作系統中,每當要訪問的頁面不在內存時,便產生一個缺頁中斷, 然后由操作系統的缺頁中斷處理程序處理中斷。
此時缺頁的進程阻塞,放入阻塞隊列,調頁完成后再將其喚醒, 放回就緒隊列。
- 如果內存中有空閑塊,則為進程分配一個空閑塊,將所缺頁面裝入該塊,并修改頁表中相應的頁表項
- 如果內存中沒有空閑塊,則由頁面置換算法選擇一個頁面淘汰,若該頁面在內存期間被修改過,則要將其寫回外存,未修改過的頁面不用寫回外存。
缺頁中斷是因為當前執行的指令想要訪問目標頁面未調入內存而產生的,因此屬于內中斷(故障) 。
頁面置換算法
最佳置換算法 OPT
優先淘汰以后永不使用或者在最長時間內不會使用的頁面,保證最低的缺頁率。
但是操作系統無法預判頁面訪問序列,這種算法是無法實現的。
先進先出置換算法 FIFO
優先淘汰最早進入內存的頁面。
實現 :將調入內存的頁面根據調入的先后順序排成一個隊列,需要置換頁面的時候選擇隊首的頁面。
實現簡單;算法性能差,不適應進程實際運行時的規律,可能出現 Belady 異常。
最近最久未使用算法 LRU
優先淘汰最近最久未使用的頁面。
性能好,但實現起來需要專門的硬件支持,算法開銷大。
時鐘置換算法 CLOCK / 最近未用算法 NRU
同一種算法。
循環掃描各頁面,第一輪淘汰訪問位 = 0 的,并將掃描過的頁面訪問位改為1。若第一輪沒選中,則進行第二輪掃描。
實現簡單,算法開銷小;但未考慮頁面是否被修改過。
簡單的時鐘置換算法僅考慮到了一個頁面最近是否被訪問過,但是事實上,如果被淘汰的頁面沒有被修改過,就不需要執行I/O操作寫回外存。只有被淘汰的頁面被修改過時,才需要寫回外存。
因此, 除了考慮一個頁面最近有沒有被訪問過之外,操作系統還應該考慮頁面有沒有被修改過。
在其他條件都相同時,應該優先淘汰沒有修改過的頁面, 避免I/O操作,這就是改進型的時鐘置換算法的思想。
改進型的時鐘置換算法
利用(訪問位,修改位) 的形式表示各頁面狀態
| 第一輪 : 找第一個 (0, 0)的幀用于替換 ( 不修改標志位 ) | 最近沒訪問且沒修改 |
| 第二輪 : 找第一個 (0, 1)的幀用于替換 ( 將所有掃描過的幀訪問位設為0) | 最近沒訪問但修改過 |
| 第三輪 : 找第一個 (0, 0)的幀用于替換 ( 不修改標志位 ) | 最近訪問過但沒修改 |
| 第四輪 : 找第一個 (0, 1)的幀用于替換 | 最近訪問過也修改過 |
算法開銷小,性能也不錯。
Belady異常 —— 當為進程分配的物理塊數增大時,缺頁次數不減反增的異常現象。
頁面分配、置換策略
駐留集
請求分頁存儲管理器中給進程分配的物理塊的集合。
【系統給進程分配了n各物理塊的另一種表述:駐留集大小為n】
在采用虛擬存儲技術的系統中, 駐留集的大小一般小于進程的總大小
- 如果駐留集太小,會導致缺頁頻繁,系統要花大量的時間來處理缺頁,實際用于進程推進的時間很少。
- 如果駐留集太大,會導致多道程序并發度下降,資源利用率降低。
策略
固定分配:操作系統為每個進程分配一組固定數目的物理塊,在進程運行期間不再改變。即,駐留集大小不變。
可變分配:先為每個進程分配一定數目的物理塊,在進程運行期間,可根據情況做適當的增加或減少。即,駐留集大小可變。
局部置換:發生缺頁時只能選進程自己的物理塊進行置換。
全局置換:可以將操作系統保留的空閑物理塊分配給缺頁進程,也可以將別的進程持有的物理塊置換到外存,再分配給缺頁進程。
可變分配全局置換:只要缺頁就給分配新物理塊。
可變分配局部置換:要根據發生缺頁的頻率來動態地增加或減少進程的物理塊。
何時調入頁面
何處調入頁面
抖動現象
剛剛換出的頁面馬上又要換入內存,剛剛換入的頁面馬上又要換出外存,這種頻繁的頁面調度行為稱
為抖動,或顛簸。
產生抖動的主要原因是進程頻繁訪問的頁面數目高于可用的物理塊數( 分配給進程的物理塊不夠)。
工作集
工作集:指在某段時間間隔里,進程實際訪問頁面的集合。
駐留集:指請求分頁存儲管理中給進程分配的內存塊的集合。
- 一般來說,駐留集大小不能小于工作集大小,否則進程運行過程中將頻繁缺頁。
請求分段存儲管理
請求段頁式存儲管理
四、內存空間的分配和回收
4.1 連續分配管理方式
為用戶進程分配的必須是一個連續的內存空間。
4.1.1 單一連續分配
在單一連續分配的方式中, 內存被分為系統區和用戶區, 系統區用于存放操作系統的相關數據,用戶區用于存放用戶進程的相關數據。內存中只能有一道用戶程序,用戶程序獨占整個用戶區空間。
- 優點 : 實現簡單, 無外部碎片; 可以采用覆蓋技術擴充內存; 不一定需要采取內存保護
- 缺點 : 只能用于單用戶, 單任務的操作系統中; 有內部碎片; 存儲器利用率極低
內部碎片 : 分配給某進程的內存區域有一部分沒有用上,即存在" 內部碎片 ".
外部碎片 : 內存中的某些空閑分區由于太小而難以利用
4.1.2 固定分區分配
在產生了支持多道程序的系統后,為了能在內存中裝入多道程序而互相之間不產生干擾,將整個用戶區劃分為若干個固定大小的分區(分區大小可以相等也可以不相等),在每個分區中只能裝入一道作業, 形成了最早的可運行多道程序的內存管理方式。
操作系統建立分區說明表來實現各個分區的分配和回收。
每個表對應一個分區,通常按分區大小排列。每個表項包括對應分區的大小,起始地址,狀態。
用數據結構的數組(或鏈表)即可表示這個表。
當某用戶程序要裝入內存時,由操作系統內核程序根據用戶程序大小檢索該表,從中找到一個能滿足大小的、未分配的分區,將之分配給該程序,然后修改狀態為 ” 已分配 “ 。
- 優點:實現簡單,無外部碎片。
- 缺點:1、當用戶程序太大時,可能所有的分區都不能滿足需求,此時不得不采用覆蓋技術來解決,但這又會降低性能。2、會產生內部碎片,內存利用率低。
4.1.3 動態分區分配
動態分區分配又稱為可變分區分配, 這種分配方式不會預先劃分內存分區。而是在進程裝入內存時根據進程大小動態地建立分區,并使得分區的大小正好適合進程的需要。
系統要用什么樣的數據結構記錄內存的使用情況?
兩種常用的數據結構:空閑分區表、空閑分區鏈
空閑分區表:每個空閑分區對應一個表項。表項中包含分區號、分區大小、分區起始地址等信息。
空閑分區鏈:每個分區的其實部分和末尾部分分別設置前向指針和后向指針。起始部分處還可記錄分區大小等信息。
動態分配不會產生內部碎片, 而會產生外部碎片, 外部碎片可以通過" 緊湊"的方式解決。
4.1.4 動態分區分配算法
? 1、首次適應算法
每次都從低地址開始查找,找到第一個能滿足大小的空閑分區。
實現:把空閑分區按地址遞增的次序排列。
每次分配內存時順序地查找空閑分區鏈,找到大小能滿足要求的第一個空閑分區。
優點:綜合看性能最好。算法開銷小,回收分區后一般不需要對空閑分區隊列重新排序。
? 2、最佳適應算法
優先使用小的空閑分區
實現: 空閑分區按容量遞增次序鏈接。
每次分配內存時順序查找空閑分區鏈, 找到大小能滿足要求的第一個空閑分區。
優點:會有更多的大分區被保留下來,更能滿足大進程需求。
缺點:每次都選擇最小的分區進行分配,會留下越來越多的容量很小難以利用的內存塊,即產生很多的外部碎片;算法開銷大,回收分區后可能需要對空閑分區隊列重新排序。
? 3、最壞適應算法
優先使用大的空閑分區
實現: 空閑分區按容量遞減次序鏈接
優點:可以減少難以利用的小碎片。
缺點:每次都選用最大的分區進行分配,當較大的連續空閑區被小號之后,如果有大進程到來則沒有內存分區可以利用;算法開銷大。
4、鄰近適應算法
在首次適應算法的基礎上,每次都從上次查找結束的位置開始查找空閑分區鏈(表),找到大小能滿足的第一個空閑分區。
優點:不用每次都從低地址的小分區開始檢索。算法開銷小。
缺點:鄰近適應算法導致無論低地址還是高地址的空閑分區都有相同的概率被使用,也就導致了高地址部分的大分區更可能被使用劃分為小分區,最后導致沒有大分區可用。
算法開銷大:最佳適應法, 最壞適應法 ( 需要經常排序)
算法開銷小:首次適應算法, 鄰近適應算法
4.2 非連續分配管理方式
為用戶進程分配的可以是一些分散的內存空間。
4.2.1 基本分頁存儲管理
思想:把內存分為一個個相等的小分區, 再按照分區大小把進程拆分成一個個小部分.
頁框和頁面
頁框:將內存大小分為一個個大小相等的分區,每個分區就是一個 “ 頁框 ”,或稱 “ 頁幀 ”、“ 內存塊 ”、“ 物理塊 ”。每個頁框有一個編號,即 “ 頁框號 ”,或稱 “ 內存塊號 ”、“ 頁幀號 ”、“ 物理塊號 ” ,頁框號從 0 開始。
頁面:將用戶進程的地址空間也分為與頁框大小相等的一個個區域,稱為 “ 頁 ” 或 “ 頁面 ”。每個頁面也有一個編號,即 “ 頁號 ”,頁號也是從 0 開始。
imp:
- 進程的最后一個頁面可能沒有一個頁框那么大。因此。頁框不能太大,否則可能產生過大的內部碎片。
- 操作系統以頁框為單位為各個進程分配內存空間。進程的每個頁面分別放入一個頁框中。也就是說,進程的頁面與內存的頁框有一一對應的關系。
- 各個頁面不必連續存放,也不必按先后順序來,可以放到不相鄰的各個頁框中。
地址轉換的實現
1、確定邏輯地址的 " 頁號 " P ----- 頁號 = 邏輯地址 / 頁面長度
2、找到P號頁面在內存中的起始地址 ( 需要查找頁表 ) ----- 操作系統需要用某種數據結構記錄進程各個頁面的起始位置
3、確定邏輯地址的 " 頁內偏移 " W ----- 頁內偏移量 = 邏輯地址 % 頁面長度
4、物理地址 = P號頁面在內存中的起始地址 + 頁內偏移量W
求解:為了方便計算頁號和頁內偏移量,頁面大小一般設置為2的整數冪
結論:如果每個頁面大小為 2^k B,用二進制數表示邏輯地址,則末尾 K 位即為頁內偏移量,其余部分就是頁號。
頁表
為了能知道進程的每個頁面在內存中存放的位置,操作系統要為每個進程建立一張頁表。
- 一個進程對應一張頁表
- 進程的每一頁對應一個頁表項
- 每個頁表項由 “ 頁號 ” 和 “ 塊號 ” 組成
- 頁表記錄進程頁面和實際存放的內存塊之間的對應關系
imp:頁表中的頁號是 “ 隱含 ” 的,可以不占用存儲空間。
假設某系統物理內存大小為 4GB, 頁面大小為 4KB, 則每個頁表項至少應該為多少字節?
基本地址變換機構
用于實現邏輯地址到物理地址轉換(借助進程的頁表)的一組硬件機構
-
通常會在系統中設置一個頁表寄存器(PTR),存放頁表在內存中的起始地址 F 和頁表長度 M。
-
進程未執行時,頁表的始址和頁表長度放在進程控制塊(PCB)中;
-
當進程被調度時,操作系統內核會把它們放到頁表寄存器中。
設頁面大小為L,邏輯地址A到物理地址E的變換過程如下:
① 計算頁號 P 和頁內偏移量 W。
② 比較頁號 P 和頁表長度M,若P≥M,則產生越界中斷,否則繼續執行。(注意:頁號是從0開始的,而頁表長度至少是1,因此P=M時也會越界)
③ 頁表中頁號 P 對應的頁表項地址 = 頁表起始地址 F + 頁號 P * 頁表項長度,取出該頁表項內容b,即為內存塊號。
④ 計算E= b * L + W,用得到的物理地址 E 去訪存。
imp:頁表長度指的是這個頁表中總共有幾個頁表項,即總共有幾個頁;頁表項長度指的是每個頁表項占多大的存儲空間;頁面大小指的是一個頁面占多大的存儲空間
- 一共需要訪問兩次內存:第一次用來查頁表,第二次用于訪問目標內存單元。
- 頁式管理中地址是一維的。
- 為了方便找到頁表項,頁表一般是放在連續的內存塊的。
具有快表的地址變換機構
局部性原理
-
時間局部性
如果執行了程序中的某條指令, 那么不久之后這條指令很有可能再次執行; 如果某個數據被訪問過, 不久之后該數據很可能再次被訪問。
( 程序中存在大量的循環 )
-
空間局部性
一旦程序訪問了某個存儲單元, 在不久之后, 其附近的存儲單元也很有可能被訪問到。
( 很多數據在內存中連續存放 )
快表(TLB)
快表又成為聯想寄存器(TLB),是一種訪問速度比內存塊很多的高速緩沖存儲器,用來存放當前訪問的若干頁表項, 以加速地址變換的過程. 與此對應的,內存中的頁表常稱為慢表。
地址變換的過程
① CPU給出邏輯地址,由某個硬件算得頁號、頁內偏移量,將頁號與快表中的所有頁號進行比較。
② 如果找到匹配的頁號,說明要訪問的頁表項在快表中有副本,則直接從中取出該頁對應的內存塊號,再將內存塊號與頁內偏移量拼接形成物理地址,最后,訪問該物理地址對應的內存單元。因此,若快表命中,則訪問某個邏輯地址僅需一次訪存即可。
③ 如果沒有找到匹配的頁號,則需要訪問內存中的頁表,找到對應頁表項,得到頁面存放的內存塊號,再將內存塊號與頁內偏移量拼接形成物理地址,最后,訪問該物理地址對應的內存單元。因此,若快表未命中,則訪問某個邏輯地址需要兩次訪存(注意:在找到頁表項后,應同時將其存入快表,以便后面可能的再次訪問。但若快表已滿,則必須按照一定的算法對舊的頁表項進行替換)。
兩級頁表
單級頁表存在的問題
1、假設某計算機系統按字節尋址,支持32位邏輯地址,采用分頁存儲管理,頁面大小為4KB,頁表項長度為4B。
4KB = 2^12B,因此頁內地址要用12位表示,剩余20位表示頁號。
因此,該系統中用戶進程最多有2^20頁。相應的,一個進程的頁表中,最多會有220個頁表項,所以一個頁表最大需要220 * 4B = 222B。一個頁框(內存塊)大小為 4B,所以需要2^22 / 2^12 = 2^10個頁框存儲該頁表。而頁表的存儲是需要連續存儲的,因為根據頁號查詢頁表的方法:K號頁對應的頁表項的位置 = 頁表起始地址 + K * 4B,所以這就要求頁表的存儲必須是連續的。當頁表很大時,需要占用很多個連續的頁框。
回想一下,當初為什么使用頁表,就是要將進程劃分為一個個頁面可以不用連續的存放在內存中,但是此時頁表就需要1024個連續的頁框,與當時的目標相悖。
2、根據局部性原理可知,很多時候,進程在一段時間內只需要訪問某幾個頁面就可以正常運行了。因此沒有必要讓整個頁表都常駐內存。
解決方法
可將長長的頁表進行分組,使每個內存塊剛好可以放入一個分組,再將各組離散地放到各個內存塊中。
另外,為離散分配的頁表再建立一張頁表,稱為頁目錄表,或稱外層頁表,或稱頂層頁表
實現地址轉換
1、按照地址結構將邏輯地址拆成三個部分。
2、從PCB中讀取頁目錄起始地址,再根據一級頁號查頁目錄表,找到下一級頁表在內存中存放位置。
3、根據二級頁號查表,找到最終想要訪問的內存塊號。
4、結合頁內偏移量得到物理地址。
細節
- 若采用多級頁表機制,則各級頁表的大小不能超過一個頁面。
- 兩級頁表的訪存次數分析(假設沒有快表機構)
- 第一次訪存:訪問內存中的頁目錄表
- 第二次訪存:訪問內存中的二級頁表
- 第三次訪存:訪問目標內存單元
4.2.2 基本分段存儲管理
分段:進程的地址空間會按照自身的邏輯關系劃分為若干個段, 每個段都有一個段名, 每段從0開始編址。
內存分配規則:以段為單位進行分配,每個段在內存中占據連續空間,但各段之間可以不相鄰。
分段系統的邏輯地址結構
段號的位數決定了每個進程最多可以分為幾個段
段內地址位數決定了每個段的最大長度是多少
段表
查找過程
需要兩次訪存:第一次訪存查內存中的段表,第二次訪存訪問目標內存單元。
分段、分頁管理的對比
- 對程序員的透明性:分頁透明,但是分段需要程序員顯式劃分每個段。
- 地址空間的維度:分頁是一維地址空間,分段是二維的。
- 大小是否可以改變:頁的大小不可變,段的大小可以動態改變。
- 出現的原因:分頁主要用于實現虛擬內存,從而獲得更大的地址空間;分段主要是為了使程序和數據可以被劃分為邏輯上獨立的地址空間并且有助于共享和保護。
頁是信息的物理單位。
段是信息的邏輯單位。
4.2.3 段頁式內存管理方式
程序的地址空間劃分成多個擁有獨立地址空間的段,每個段上的地址空間劃分成大小相同的頁。這樣既擁有分段系統的共享和保護,又擁有分頁系統的虛擬內存功能。
分頁, 分段管理的優缺點分析
段頁式系統的邏輯地址結構
由段號、頁號位數、頁內偏移量組成
段號的位數決定了每個進程最多可以分幾個段
頁號位數決定了每個段最大有多少頁
頁內偏移量決定了頁面大小、內存塊大小是多少
" 分段 " 對用戶是可見的,而將各段"分頁"對用戶是不可見的,系統會根據段內地址自動劃分頁號和段內偏移量,因此段頁式管理的地址結構是 " 二維 " 的。
段表、頁表
每一個進程對應一個段表,每一個段又對應一個頁表,因此一個進程可能對應多個頁表。
每個段對應一個段表項,每個段表項由段號、頁表長度、頁表存放塊號(頁表起始地址)組成。
每個段表項長度相等,段號是隱含的。
每個頁面對應一個頁表項,每個頁表項由頁號、頁面存放的內存塊號組成。
每個頁表項長度相等,頁號是隱含的。
查找過程
1、由邏輯地址得到段號、頁號、頁內偏移
2、段號與段表寄存器的段長度比較,檢查是否越界
3、由段表始址, 段號找到對應段表項
4、根據段表中記錄的頁表長度,檢查頁號是否越界
5、由段表中的頁表地址, 頁號得到查詢頁表,找到相應頁表項
6、由頁面存放的內存塊號,頁內偏移得到最終的物理地址
7、訪問目標單元
需要三次訪存,第一次查段表,第二次查頁表,第三次訪問目標單元。
總結
以上是生活随笔為你收集整理的操作系统 —— 内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop分布式集群安装配置
- 下一篇: hbase单机模式配置