• Operating System Video Tutorials

作業系統 - 記憶體管理



記憶體管理是作業系統的功能,它處理或管理主記憶體,並在執行過程中將程序在主記憶體和磁碟之間來回移動。記憶體管理跟蹤每個記憶體位置,無論它是否已分配給某個程序或它是空閒的。它檢查要為程序分配多少記憶體。它決定哪個程序將在何時獲得記憶體。它跟蹤何時一些記憶體被釋放或未分配,並相應地更新狀態。

本教程將教你與記憶體管理相關的基本概念。

程序地址空間

程序地址空間是程序在其程式碼中引用的邏輯地址集。例如,當使用 32 位定址時,地址範圍可以從 0 到 0x7fffffff;也就是說,2^31 個可能的數字,理論總大小為 2GB。

作業系統在將記憶體分配給程式時負責將邏輯地址對映到物理地址。在分配記憶體之前和之後,程式中使用了三種類型的地址:

序號 記憶體地址和描述
1

符號地址

在原始碼中使用的地址。變數名、常量和指令標籤是符號地址空間的基本元素。

2

相對地址

在編譯時,編譯器將符號地址轉換為相對地址。

3

物理地址

載入器在程式載入到主記憶體時生成這些地址。

在編譯時和載入時地址繫結方案中,虛擬地址和物理地址相同。在執行時地址繫結方案中,虛擬地址和物理地址不同。

程式生成的所有邏輯地址的集合稱為邏輯地址空間。與這些邏輯地址相對應的所有物理地址的集合稱為物理地址空間

虛擬地址到物理地址的執行時對映由記憶體管理單元 (MMU) 完成,MMU 是一種硬體裝置。MMU 使用以下機制將虛擬地址轉換為物理地址。

  • 基址暫存器的值加到使用者程序生成的每個地址上,在將其傳送到記憶體時將其視為偏移量。例如,如果基址暫存器值為 10000,則使用者嘗試使用地址位置 100 將被動態重新分配到位置 10100。

  • 使用者程式處理虛擬地址;它永遠不會看到真實的物理地址。

靜態載入與動態載入

在開發計算機程式時,需要在靜態載入或動態載入之間進行選擇。如果必須靜態載入程式,則在編譯時,將編譯和連結完整的程式,而不會留下任何外部程式或模組依賴性。連結器將目標程式與其他必要的目標模組組合成一個絕對程式,其中還包括邏輯地址。

如果編寫的是動態載入程式,則編譯器將編譯程式,對於所有要動態包含的模組,只提供引用,其餘工作將在執行時完成。

在載入時,使用靜態載入,將絕對程式(和資料)載入到記憶體中以開始執行。

如果使用動態載入,庫的動態例程以可重定位的形式儲存在磁碟上,只有在程式需要時才載入到記憶體中。

靜態連結與動態連結

如上所述,當使用靜態連結時,連結器將程式所需的所有其他模組組合到單個可執行程式中,以避免任何執行時依賴性。

當使用動態連結時,不需要將實際的模組或庫與程式連結,而是在編譯和連結時提供對動態模組的引用。Windows 中的動態連結庫 (DLL) 和 Unix 中的共享物件是動態庫的良好示例。

交換

交換是一種機制,其中程序可以暫時從主記憶體(或移動)交換到輔助儲存器(磁碟),並將該記憶體提供給其他程序。在稍後的某個時間,系統將程序從輔助儲存器交換回主記憶體。

雖然交換過程通常會影響效能,但它有助於並行執行多個大型程序,這就是交換也被稱為記憶體壓縮技術的原因。

Process Swapping

交換過程的總時間包括將整個程序移動到輔助磁碟然後複製回記憶體所需的時間,以及程序恢復主記憶體所需的時間。

假設使用者程序的大小為 2048KB,並且在進行交換的標準硬碟上的資料傳輸速率約為每秒 1MB。將 1000K 程序實際傳輸到記憶體或從記憶體傳輸將需要

2048KB / 1024KB per second
= 2 seconds
= 2000 milliseconds

現在考慮進出時間,它將需要完整的 4000 毫秒加上其他開銷,在此期間程序競爭以恢復主記憶體。

記憶體分配

主記憶體通常有兩個分割槽:

  • 低記憶體 - 作業系統駐留在該記憶體中。

  • 高記憶體 - 使用者程序儲存在高記憶體中。

作業系統使用以下記憶體分配機制。

序號 記憶體分配和描述
1

單分割槽分配

在這種型別的分配中,使用重定位暫存器方案來保護使用者程序彼此不受影響,並防止更改作業系統程式碼和資料。重定位暫存器包含最小物理地址的值,而限制暫存器包含邏輯地址的範圍。每個邏輯地址都必須小於限制暫存器。

2

多分割槽分配

在這種型別的分配中,主記憶體被分成許多固定大小的分割槽,每個分割槽只能包含一個程序。當分割槽空閒時,從輸入佇列中選擇一個程序並將其載入到空閒分割槽中。當程序終止時,分割槽將可用於另一個程序。

碎片

隨著程序載入和從記憶體中移除,空閒記憶體空間被分成小塊。有時會發生程序由於其小尺寸而無法分配到記憶體塊,並且記憶體塊仍然未被使用的情況。這個問題被稱為碎片。

碎片分為兩種型別:

序號 碎片和描述
1

外部碎片

總記憶體空間足以滿足請求或在其上駐留程序,但它不連續,因此無法使用。

2

內部碎片

分配給程序的記憶體塊更大。部分記憶體未被使用,因為它不能被另一個程序使用。

下圖顯示了碎片如何導致記憶體浪費以及如何使用壓縮技術從碎片記憶體中建立更多空閒記憶體:

Memory Fragmentation

可以透過壓縮或整理記憶體內容來減少外部碎片,以便將所有空閒記憶體放在一個大的塊中。為了使壓縮可行,重新定位應該是動態的。

可以透過有效地分配最小但足夠大的分割槽來減少內部碎片。

分頁

計算機可以定址的記憶體量大於系統上實際安裝的記憶體量。這部分額外的記憶體實際上稱為虛擬記憶體,它是硬碟的一個部分,用於模擬計算機的 RAM。分頁技術在實現虛擬記憶體中起著重要作用。

分頁是一種記憶體管理技術,其中程序地址空間被分成大小相同的塊,稱為頁面(大小為 2 的冪,介於 512 位元組和 8192 位元組之間)。程序的大小以頁面數來衡量。

類似地,主記憶體被分成稱為的小型固定大小的(物理)記憶體塊,並且幀的大小與頁面的大小相同,以最佳化主記憶體的利用率並避免外部碎片。

Paging

地址轉換

頁面地址稱為邏輯地址,由頁號偏移量表示。

Logical Address = Page number + page offset

幀地址稱為物理地址,由幀號偏移量表示。

Physical Address = Frame number + page offset

一種稱為頁表的資料結構用於跟蹤程序的頁面與物理記憶體中幀之間的關係。

Page Map Table

當系統將幀分配給任何頁面時,它會將此邏輯地址轉換為物理地址,並在頁表中建立條目,在程式的整個執行過程中使用。

當要執行程序時,其對應的頁面將載入到任何可用的記憶體幀中。假設您有一個 8KB 的程式,但您的記憶體在給定時間點只能容納 5KB,那麼分頁概念將發揮作用。當計算機的 RAM 用盡時,作業系統 (OS) 將將空閒或不需要的記憶體頁面移動到輔助記憶體以釋放 RAM 供其他程序使用,並在程式需要時將其帶回。

此過程在程式的整個執行過程中繼續進行,其中作業系統不斷將空閒頁面從主記憶體中移除並將其寫入輔助記憶體,並在程式需要時將其帶回。

分頁的優點和缺點

以下是分頁的優點和缺點列表:

  • 分頁減少了外部碎片,但仍然存在內部碎片。

  • 分頁易於實現,並被認為是一種高效的記憶體管理技術。

  • 由於頁面和幀的大小相等,交換變得非常容易。

  • 頁表需要額外的記憶體空間,因此對於RAM較小的系統可能不太好。

分段

分段是一種記憶體管理技術,其中每個作業被分成幾個大小不同的段,每個段對應一個包含執行相關功能的程式碼塊的模組。每個段實際上是程式的不同邏輯地址空間。

當要執行一個程序時,其對應的段被載入到非連續的記憶體中,儘管每個段都被載入到可用的連續記憶體塊中。

分段記憶體管理的工作方式與分頁非常相似,但是這裡的段是變長的,而分頁中的頁面是固定大小的。

程式段包含程式的主函式、實用函式、資料結構等等。作業系統為每個程序維護一個**段對映表**和一個空閒記憶體塊列表,以及段號、段大小和主存中對應的記憶體位置。對於每個段,該表儲存段的起始地址和段的長度。對記憶體位置的引用包括一個標識段的值和一個偏移量。

Segment Map Table
廣告