作業系統之記憶體管理篇

2022-08-15 19:51:20 字數 2340 閱讀 9400

虛擬記憶體:程式所使用的記憶體

為什麼引入虛擬記憶體?

1.如果沒有虛擬記憶體,我們執行的程式都將在物理記憶體上執行,當記憶體空間不足時,需要將其他程式裝入硬碟中,將新的程式裝入記憶體中,頻繁的裝入裝出效率極低。

2.程式直接訪問物理記憶體,所以程序可以修改其他程序的資料,甚至會修改核心位址空間的資料。

3.因為記憶體是隨機分配的,所以程式執行的位址也是不正確的。

為了解決以上幾個問題,讓作業系統為每個程序分配獨立的一套虛擬位址。讓每乙個程序都有自己的位址,互不干涉。但是程序不能訪問實體地址,而作業系統會提供一種機制,將不同程序的虛擬位址和不同記憶體的物理位址對映起來。

主要有三種方式:

一、記憶體分段

程式是由若干個邏輯分段組成的,可由**分段、資料分段、棧段、堆段組成。不同的段擁有不同的屬性,所以就用分段的形式把這些段分離出來。

分段機制下,虛擬位址和實體地址是如何對映的?

段選擇子中最重要的是段號,其用作段表的索引,段表中儲存的是這個段的基位址、段的界限和特權等級,而物理記憶體位址就由段表中這個段的基位址加上段內偏移量。

分段的缺點:

1.記憶體碎片的問題

外部記憶體碎片:產生了多個不連續的小物理記憶體,導致新的程式無法被裝載。

內部記憶體碎片:程式所有的記憶體都被裝載到了物理記憶體,但是有部分記憶體不常用,導致記憶體的浪費。

解決方案:記憶體交換,在linux系統裡,常看到的swap空間,這塊空間是從硬碟劃分出來的,用於記憶體與硬碟的空間交換。

2.記憶體交換的效率低的問題

是由記憶體碎片引起的,使用分段的方式,記憶體碎片很容易產生,而產生記憶體碎片,就要進行記憶體交換,每一次記憶體交換,我們都需要把一大段連續的記憶體資料寫到硬碟上。當記憶體交換交換的是乙個佔記憶體空間很大的程式,硬碟的訪問速度比記憶體慢太多了,導致整個機器都會顯得卡頓。

總結:分段的好處是能產生連續的記憶體空間,但會產生記憶體碎片和記憶體交換的空間太大的問題。

二、記憶體分頁

分頁是把整個虛擬和物理記憶體切成一段段固定尺寸的大小,這樣乙個連續且尺寸固定的記憶體空間,我們稱它為頁。在linux下,每一頁的大小為4kb

分頁機制下,虛擬位址和實體地址是如何對映的?

同樣的,頁號作為頁表的索引,頁表包含物理頁每頁所在物理記憶體的基位址,這個基位址加上頁內偏移量就形成了物理記憶體位址。

分頁的優點:

採用了分頁,釋放的記憶體都是以頁為單位釋放的,也就不會產生無法給程序使用的小記憶體。

如果記憶體空間不夠,作業系統會把其他正在執行的程序中的最近沒被使用

的記憶體頁面釋放掉,暫時寫在硬碟上,成為換出,需要的時候正再載入進來,成為換入,每次寫入磁碟的只有少數的幾頁,記憶體交換的效率相對比較高。

缺點:簡單的分頁有空間上的缺陷,每個程序都有自己的虛擬位址,如果很多個程序,就需要很大的記憶體來儲存頁表,這是對記憶體極大的浪費。

解決以上的問題,需要採用多級頁表,因為頁表一定要覆蓋全部虛擬位址空間,不分級的頁表就需要有100多萬個頁表來對映,而二級分頁則只需要1024個頁表項,此時一級頁表覆蓋了全部虛擬空間,而二級頁表再需要時建立。

三、段頁式記憶體管理

簡單的來說就是將記憶體分段和分頁組合起來。

段頁式記憶體管理是如何實現的呢?

先將程式劃分為多個有邏輯意義的段,也就是先分段,再將每個段劃分為多個頁,對段劃分出來的連續空間,再劃分固定大小的頁。

如何得到實體地址?

第一次訪問段表,得到頁表起始位址

第二次訪問頁表,得到物理頁號

第三次將物理頁號與業內位移組合,得到實體地址

linux記憶體主要採取了頁式記憶體管理,但由於硬體的原因,不可避免的涉及到段機制。但是實際上,段式對映的過程實際上沒有什麼作用。

linux系統中的每個段都是從0位址開始的整個4gb虛擬空間(32位),也就是所有段的起始位址都是一樣的,這意味著linux系統下的所有**,都面對的所有位址空間都是虛擬位址。而段只用於訪問控制和記憶體保護。

linux虛擬空間的部分分為核心空間和使用者空間:

32位系統的核心空間占用1g,而使用者空間占用3g

64位系統的核心空間和使用者空間都是128t,剩下的中間部分是未定義的。

對應的也有核心態和使用者態:

當程序執行在核心空間時就處於核心態,而程序執行在使用者空間時則處於使用者態。

在核心態時,程序執行在核心空間,此時cpu可以執行任何指令,執行的**也不受任何的限制,可以自由地訪問任何有效位址,也可以進行埠地訪問。

在使用者態時,程序執行在使用者空間,被執行地**要受cpu的檢查,它只能訪問對映其位址空間的頁表項中規定的在使用者態下可訪問頁面的虛擬位址。

所以,區分核心空間和使用者空間本質上是要提高作業系統的穩定性及可用性。

作業系統之記憶體管理

記憶體管理的功能有 1 空間分配與 2 位址轉換 3 空間擴充 4 儲存保護 將資料與程式裝入記憶體分以下步驟 1 編譯成模組 2 鏈結模組 分靜態 裝入時動態 執行時動態鏈結 3 將模組裝入記憶體 分絕對裝入 可重定位裝入 執行時動態裝入 邏輯位址與實體地址 訪問資料時是使用實體地址獲取資料,多個...

作業系統之記憶體管理

位址對映和重定位是乙個概念 適應於請求段的記憶體分配方法是最佳適應和可變分割槽 可重入 reentrant code 又稱為 純 purecode 是一種允許多個程序同時訪問的 為使各個程序所執行的 完全相同,絕對不允許可重入 在執行中有任何改變。目的 擴充主存容量 最基本的特徵 多次性 最主要的技...

作業系統之記憶體管理

便於程式設計師編寫程式 分治 可以控制每個段的許可權 寫 讀 符合跳轉指令邏輯 段號,段內偏移 執行時重定位 當執行某條指令時才進行位址重定位,先查詢程序pcb指向的段表,然後根據偏移量算出實體地址。編譯時重定位 編譯時就把所有跳轉指令進行重定位。缺點 導致必須使用重定位後的那一段記憶體,若那一段記...