《現代作業系統(中文第四版)》筆記 第三章 記憶體管理
記憶體管理
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 頁面置換演算法
- 最優頁面置換演算法
- 最近未使用頁面演算法
- 先進先出頁面置換演算法
- 第二次機會頁面置換演算法
- 時鐘頁面置換演算法
- 最近最少使用頁面置換演算法
- 工作集頁面置換演算法
- 工作集時鐘頁面置換演算法
針對他們的總結如下:
所以一般採用工作集時鐘頁面置換演算法