1. 程式人生 > >《現代作業系統(中文第四版)》筆記 第三章 記憶體管理

《現代作業系統(中文第四版)》筆記 第三章 記憶體管理

記憶體管理

3.1無儲存器抽象

最開始並沒有對儲存器進行抽象,直接簡單粗暴的使用實體記憶體地址,直接從0到某個上限值。每個地址可容納一定的二進位制位儲存單元, 通常為8位。這個時期的組織記憶體的三種方式如下:

3.2 第一種儲存器抽象:地址空間

地址空間的概念:是一個程序可以用於定址的一套記憶體集合。通俗點講,就是每個程序內部有自己的虛擬地址空間0-1023,然後這套虛擬記憶體空間再對映到真實物理空間(比如2048 - 3071)。

為了把內部虛擬地址空間轉換為真實實體地址,就需要動態重定位, 典型的辦法就是給CPU配置兩個特殊暫存器,即基址暫存器界限暫存器。 程序載入到記憶體後,基址暫存器用來記錄程序實體記憶體的開始位置, 界限暫存器用來儲存程式的長度(也可理解為記錄程序實體記憶體的結束位置)。

虛擬記憶體與交換技術:由於記憶體空間是有限的,假設記憶體是100M,執行一個程式記憶體是 30M,但是實際上我們可以同時開啟4個,5個甚至更多程式,這就涉及到虛擬記憶體和交換技術了。虛擬記憶體就是假設我們的實體記憶體只有100M,但是實際的記憶體地址排到了200M,其中一段就是虛擬的。因為CPU任一時刻其實只能執行一個程式的, 利用這一點,當我們開啟5個30M的程序,但是實際正在前臺執行的只有其中一兩個,那麼暫未執行的就存回到硬碟,需要排程的時候再載入進記憶體。這就是在記憶體與硬碟間相互交換。 如下是程序載入到記憶體的示例圖:

記憶體緊縮:如上圖, 執行時間長了,程序間的記憶體就可能有小塊未使用的空閒區,把小塊合成一大塊連續記憶體,就叫記憶體緊縮。但是會耗費大量CPU時間。

空閒記憶體管理

1.使用點陣圖的儲存管理

使用點陣圖時,記憶體被劃分為幾個或幾千個位元組的單元,即點陣圖中的一位,0表示空閒,1表示佔用。如下:

其中陰影區表示空閒記憶體,圖b 是一張點陣圖。圖a 一共有A/B/C/D/E 五個程序在執行。每個單元的大小很重要,單元越小,則點陣圖越大, 單元越大,則點陣圖越小。

2.使用連結串列的儲存管理

上圖c 則是用連結串列對記憶體進行管理,記憶體被劃為很多記憶體段(每一段不不一定相等),連線起來就是一張連結串列,一共都四個域:1.指示標誌(P表示空閒,H表示程序佔用), 2、起始地址; 3.長度;4、指向下一個節點的指標。如下圖:

剛開始時 A,X,B三個程序在執行,記憶體被劃為為三段,如果X終止了,則記憶體還是三段,只是X原本佔用的這一段就變為了空閒區(如圖a)。如果程序X,B都終止了,則記憶體變為了兩段(如圖b),如果A,X,B全部終止,則程序就變為了一段,如圖d.相對應的,在連結串列中的三個記憶體節點就變成了一個新的節點,老的三個節點被刪除掉。

3.3 虛擬記憶體

為了解決程式大於記憶體本身的問題,提出了這麼一種解決辦法:把程式分割成很多片段,然後程式執行時,先執行第一塊,然後執行第二塊,這樣,執行時,就只需要把程式的部分載入到記憶體即可,這個由作業系統動態的在記憶體和磁碟上換入換出,這個方法就就演變出了虛擬記憶體

虛擬記憶體:每個程式有自己的地址空間,把這個空間分割為多塊,每一塊稱為一頁或頁面(page),每一頁都有連續的地址範圍,執行時這些頁對映到實體記憶體。當程式執行哪一頁時,硬體就去執行,從而不必把所有頁都載入到記憶體。

程式自己的地址稱為虛擬地址,它們構成了虛擬地址空間,虛擬地址通過記憶體管理單元(Memory Management Unit, MMU) 對映到實體記憶體地址上,從而被執行。示例圖如下:

虛擬地址按照固定大小劃分為若干個頁面, 在實體記憶體中對應的單元稱為頁框(page frame),它們大小通常是一樣的。可以理解為每個頁框可以容納一個頁面。 如上圖3-9, 虛擬頁面16個,但是實際實體地址只有8個頁框,如果程式要訪問一個沒有對映到物理頁框的頁面,就會產生缺頁中斷或稱為缺頁錯誤,作業系統就會把選擇其中一個使用較少的頁框,那上面的內容清除,用來載入需要訪問的頁面。

在實際硬體中,用一個“在/不在” 位(present/absent bit)來記錄頁面在記憶體中的情況,如0表示不再位, 1表示在位。

看示例圖:

在有16個虛擬頁面的情況下, 頁表由16個虛擬頁面組成,假如現在要把一個頁面載入進實體記憶體, 高四位代表在頁表的位置, 0010換成10進位制就是2, 編號2的這個頁面時在位的,並且高三位的實體地址就是110,再加上低12位,就組成了一個真實的實體地址 輸出。 這就完成了16位虛擬地址到15位實體地址的轉換。

頁面的構成:頁框號、在不/在 位, 保護位,修改位,訪問位,快取記憶體禁止位。

  • 保護位:指一個頁允許什麼型別的訪問, 讀、寫、可讀寫。
  • 修改位:是否有修改過,修改過,則則需要先寫入磁碟儲存才能丟棄,如果沒修改過,更換其他頁面時,就可以直接丟棄了。
  • 訪問位:是否正在訪問、包裹讀、寫
  • 快取記憶體禁止位:禁止告訴快取。

針對大記憶體的頁表, 有多級頁表、倒排頁表等,方便快速查詢定址。

3.4 頁面置換演算法

  • 最優頁面置換演算法
  • 最近未使用頁面演算法
  • 先進先出頁面置換演算法
  • 第二次機會頁面置換演算法
  • 時鐘頁面置換演算法
  • 最近最少使用頁面置換演算法
  • 工作集頁面置換演算法
  • 工作集時鐘頁面置換演算法

針對他們的總結如下:

所以一般採用工作集時鐘頁面置換演算法