操作系統面試—內存管理

本文是對操作系統概念(第七版)——內存管理的學習總結,不足之處歡迎批評指正。

首先我們區分什麼是邏輯地址空間和物理地址空間。

邏輯地址空間:cpu所生成的地址,邏輯地址又稱爲虛擬地址。

物理地址:內存單元所看到的地址(加載到內存寄存器中的地址)。

運行是從虛擬地址到物理地址的映射是由內存管理單元(MMU)的硬件設備來完成的。

現在有兩個不同的地址,邏輯地址0~max,物理地址R~R+max。

內存分配策略


1、連續內存分配

最爲簡單的內存分配方法之一就是將內存分爲多個固定大小的分區,每個分區只能容納一個進程。從分區中如何選擇滿足進程要求的內存塊呢?最常用的有三個策略:

(1)首次適應(第一塊滿足要求)

(2)最佳適應(最小的足夠大的)

(3)最差適應(最大的)

三種策略的分析:

首次適應和最佳適應都有外部碎片問題。外部碎片問題:當所有總的可用內存之和可用滿足請求之和,但並不連續時就會出現外部碎片。

內部碎片:通常內存單元是以塊爲單位,進程所分配的可能比所需要的要大。

我們先討論如何解決外部碎片問題。

第一種解決方法:緊縮。緊縮的目的是移動內存內容,以便所有空閒空間合併成一整塊。

第二中解決方法:允許物理地址空間非連續。常見的有分頁和分段。


2、分頁

實現分頁的基本方法涉及將物理內存分爲固定大小的塊,稱爲幀;邏輯內存也分爲固定大小,稱爲頁。

分頁的實現爲:

cpu生成邏輯地址,改地址包含兩個部分:頁號(p)和頁偏移(d)。頁號作爲頁表的索引。頁表的內容是每頁所在物理內存的基地址,這些基地址和頁偏移的組合形成了物理地址。

通常頁大小是由硬件決定的,頁的大小通常爲2的冪,如果邏輯地址空間爲2^m,且頁的大小爲2^n單元(字節或字),那麼邏輯地址的高m-n爲表示頁號,第n爲表示頁偏移。由於物理地址非連續,所以分頁是不會產生外部碎片,但是由於頁的大小是由硬件決定的,所以分頁也有內部碎片。

分頁的一個重要特點是用戶視角的內存和實際的物理內存的分離。

分頁的硬件支持:

引入轉換表緩衝區(TLB),下圖是從其他地方截圖得到的,若侵犯版權,請告知。


3、頁表結構

提出的原因:以及分頁頁表太大。

(1)層次頁表

二級分頁算法(頁表號1+頁表號2+頁偏移)

(2)哈希頁表

哈希頁表以虛擬頁碼爲哈希值,哈希頁表中的每一條目都包括一個鏈表的元素,這些元素哈希成同一位置。每個元素有3個域:虛擬頁碼,所映射的幀號,指向鏈表元素的下一個指針。


具體工作流程:虛擬地址中的虛擬頁號轉換到哈希表中,用虛擬頁號和鏈表中每個元素的第一個域進行比較,如果匹配,那麼相應的幀號用來形成物理地址,否則繼續查找。

(3)反向頁表

反向頁表對於每個真正的內存頁或幀纔有一個條目。每個條目包含 保存在真正內存位置的頁的虛擬地址以及擁有該頁的進程的信息。因此,整個操作系統只有一個頁表,對每個物理內存的頁只有一條相應的條目。


pid是進程id。

反向頁表的問題:

1、雖然減少了內存存儲空間,但是增加了查找頁表的時間。這是因爲反向頁表是按照物理地址排序(見上圖),而查找是根據虛擬地址,所以可能需要查找整個表來尋求匹配。

2、在實現共享內存時存在困難。


4、分段

前面我們提到:採用分頁內存管理有一個不可避免的問題:用戶視角的內存和實際物理內存的隔離,用戶視角的內存需要映射到物理內存。

分段:邏輯地址空間是由一組段組成的,每個段都有名稱和長度,地址指定了段內名稱和段內偏移。因此用戶通過兩個量來指定地址:段名稱和段偏移(而分頁中用戶指定一個地址,由硬件分爲頁碼和頁偏移,這些程序員是看不見的)。

爲了簡單起見,段名稱是編號的,因此邏輯地址是由段號和段偏移組成的。<段號,段偏移>

這裏總結一下段和頁的區別:

1、頁是信息的物理單位,段是邏輯單位。

2、頁的作業地址是一維的,段是二維的。

3、頁的長度由系統決定,是等長的,而段是不等長的。

段表:將二維地址映射到一維地址。

段表的條目都有段基地址和段界限。




發佈了65 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章