計算機作業系統第四章記憶體管理
虛擬記憶體管理包括虛擬記憶體概念、請求分頁管理方式、頁面置換演算法、頁面分配策略、工作集和抖動。
1.記憶體管理的概念
記憶體管理(Memory Management)是作業系統設計中最重要和最複雜的內容之一。雖然計算機硬體一直在飛速發展,記憶體容量也在不斷增長,但是仍然不可能將所有使用者程序和系統所需要的全部程式和資料放入主存中,所以作業系統必須將記憶體空間進行合理地劃分和有效地動態分配。作業系統對記憶體的劃分和動態分配,就是記憶體管理的概念。
有效的記憶體管理在多道程式設計中非常重要,不僅方便使用者使用儲存器、提高記憶體利用率,還可以通過虛擬技術從邏輯上擴充儲存器。
記憶體管理的功能有:
- 記憶體空間的分配與回收:由作業系統完成主儲存器空間的分配和管理,使程式設計師擺脫儲存分配的麻煩,提高程式設計效率。
- 地址轉換:在多道程式環境下,程式中的邏輯地址與記憶體中的實體地址不可能一致,因此儲存管理必須提供地址變換功能,把邏輯地址轉換成相應的實體地址。
- 記憶體空間的擴充:利用虛擬儲存技術或自動覆蓋技術,從邏輯上擴充記憶體。
- 儲存保護:保證各道作業在各自的儲存空間內執行,.互不干擾。
在進行具體的記憶體管理之前,需要了解程序執行的基本原理和要求。
裝入和連結
裝入
1.絕對裝入
目標模組採用絕對地址
邏輯地址和實際地址完全相同
適用於單道環境
2.可重定位裝入
在程式裝入的時候裝入
存在地址變換,但是是直接找的當前合適的記憶體位置
程式需要連續空間
不存在在程式執行的過程中在記憶體移動
3.動態執行時裝入
地址轉換在程式需要真正執行時才進行
可以在記憶體之中移動
可以實現虛擬儲存
連結
1.靜態連結
在程式執行之前,將各目標模組以及它們需要的庫函式連結成一個完整的轉入模組
2.裝入時動態連結
在裝入的時候邊裝入邊連結
便於修改和更新
便於實現目標模組的共享
3.執行時動態連結
當程式需要的時候採取連結
節約記憶體空間、加快裝入過程
2 記憶體覆蓋與記憶體交換
記憶體覆蓋
早期的計算機系統中,主存容量很小,雖然主存中僅存放一道使用者程式,但是儲存空間放不下使用者程序的現象也經常發生,這一矛盾可以用覆蓋技術來解決。
覆蓋的基本思想是:由於程式執行時並非任何時候都要訪問程式及資料的各個部分(尤其是大程式),因此可以把使用者空間分成一個固定區和若干個覆蓋區。將經常活躍的部分放在固定區,其餘部分按呼叫關係分段。首先將那些即將要訪問的段放入覆蓋區,其他段放在外存中,在需要呼叫前,系統再將其調入覆蓋區,替換覆蓋區中原有的段。
覆蓋技術的特點是打破了必須將一個程序的全部資訊裝入主存後才能執行的限制,但當同時執行程式的程式碼量大於主存時仍不能執行。
記憶體交換
交換(對換)的基本思想是,把處於等待狀態(或在CPU排程原則下被剝奪執行權利)的程式從記憶體移到輔存,把記憶體空間騰出來,這一過程又叫換出;把準備好競爭CPU執行的程式從輔存移到記憶體,這一過程又稱為換入。中級排程就是釆用交換技術。
例如,有一個CPU釆用時間片輪轉排程演算法的多道程式環境。時間片到,記憶體管理器將剛剛執行過的程序換出,將另一程序換入到剛剛釋放的記憶體空間中。同時,CPU排程器可以將時間片分配給其他已在記憶體中的程序。每個程序用完時間片都與另一程序交換。理想情況下,記憶體管理器的交換過程速度足夠快,總有程序在記憶體中可以執行。
有關交換需要注意以下幾個問題:
- 交換需要備份儲存,通常是快速磁碟。它必須足夠大,並且提供對這些記憶體映像的直接訪問。
- 為了有效使用CPU,需要每個程序的執行時間比交換時間長,而影響交換時間的主要是轉移時間。轉移時間與所交換的記憶體空間成正比。
- 如果換出程序,必須確保該程序是完全處於空閒狀態。
- 交換空間通常作為磁碟的一整塊,且獨立於檔案系統,因此使用就可能很快。
- 交換通常在有許多程序執行且記憶體空間吃緊時開始啟動,而系統負荷降低就暫停。
- 普通的交換使用不多,但交換策略的某些變種在許多系統中(如UNIX系統)仍發揮作用。
交換技術主要是在不同程序(或作業)之間進行,而覆蓋則用於同一個程式或程序中。由於覆蓋技術要求給出程式段之間的覆蓋結構,使得其對使用者和程式設計師不透明,所以對於主存無法存放使用者程式的矛盾,現代作業系統是通過虛擬記憶體技術來解決的,覆蓋技術則已成為歷史;而交換技術在現代作業系統中仍具有較強的生命力。
3 記憶體連續分配管理方式
- 單一連續分配: 即單使用者、單任務使用記憶體一部分用於OS 一部分用於使用者
- 固定分割槽分配:分割槽大小固定 ,分割槽數目固定,在記憶體中固定分配
1.分割槽使用表 分割槽的使用情況
2.記憶體利用與回收
3.缺點
規定了分割槽大小,大程式無法裝入
限制了活躍程序的最大數
碎片過多
擴充和貢獻困難
- 動態分割槽分配
1.演算法
首次適應演算法:每一次從頭開始 導致空閒區間分配不均
迴圈首次適應演算法:從上次找到的空閒分割槽的下一個空閒分割槽開始查詢可能會有小的程式佔據大的空閒分割槽,會缺乏大的空閒分割槽
最佳適應演算法:以分割槽的容量大小, 尋找第一個符合要求的會導致更多的小空間
最壞適應演算法 :和上面的演算法讓容量遞減會導致大的空閒空間不足
2.管理空閒分割槽
空閒分割槽表
空閒分割槽鏈
3.分割槽回收
要回收的分割槽上或下存在空閒分割槽,則合併
上下都有是則分割槽數減一,將下面的空閒分割槽從空閒表或連結串列中刪掉
上或者下有(只有一個)則不變
不存在則自己新建為新 空閒分割槽數加一
4.分割槽分配
存在一個最小不可再分割的大小
5.沒有程式數目和大小的限制但是會產生過多的碎片
動態重定位分配
分割槽後剩餘的一些碎片分割槽通過拼接形成更大的空閒分割槽
但會涉及到程式在記憶體中位置的變化
因此採用重定位的方法進行位置的變化
- 重定位暫存器
- 地址變換機構
夥伴系統(動態和固定分割槽的折中)
夥伴演算法
記憶體分配 當程序申請大小為n的空間時,設2`i-1<n≤2`i,則為程序分配大小為2`i的空間 (初始化2`m) 不存在則尋找更大的進行對半分配
記憶體回收 合併夥伴相鄰的大小相等的夥伴分割槽合併造成空間的浪費
在程序釋放儲存空間時,尋找夥伴合併,可以做到類似遞迴進行,直到找不到可以合併的夥伴為止
交換(中期排程)
以程序為單位
以頁或段為單位
4 記憶體非連續分配管理方式
基本分頁儲存管理方式
1.儲存空間
主存中為塊
程序的邏輯結構中為頁
2.頁面與頁表
邏輯空間稱為頁面 對應記憶體中的塊
頁表是記錄頁面在實體地址中對應的資料結構
最後一個頁面存在這頁面碎片
頁表存放
頁表
為記錄頁面在記憶體中對應的物理塊
頁表:頁號,塊號
邏輯地址構成
頁號
即在第幾頁
頁內位移
即距離頁面裡面第一個地址的距離
總的大小為頁面大小,如1KB的頁面,會有2的10次方的地址
邏輯地址從0開始
3.為解決連續分配方式存在的碎片
4.地址變換機構
4.1分頁邏輯地址
頁號和頁內位移
二進位制:
邏輯地址大小2`m 頁面大小2`n
則前m-n位表示頁號 後n位表示頁內位移
十進位制:
記A為邏輯地址,L為頁面大小,則:
頁號:P=int(A/L); 頁內地址:d=A mod L
4.2對映 頁號得到實體地址的基地址
基地址:頁號對應的物理塊號乘以頁面大小即(塊大小)
基地址加上頁內位移即實際實體地址
4.3快表
設定的一個認為常用的頁面集合
因為:訪問頁表要訪問2次以上主存
區域性性原理:所有的儲存單元都趨於聚集在一個較小的連續區域
增設一個具有並行查詢能力的高速緩衝儲存器
儲存頻繁訪問的頁表項
4.4兩級和多級頁表
將原來一張大的頁表分為多個頁表
將地址組成部分的頁表號分為多個部分
每多一個部分表示多出一個頁表對其進行記錄,就相當於形成了多表結構
實現可非連續儲存頁表
級別增多會導致訪問次數的增多
每多一次頁表會多一次對主存的訪問
5.資訊共享 多個程序頁表項指向同一個物理塊
6.可重入程式碼 純程式碼, 允許多個程序訪問但在執行過程中不可被修改
基本分段儲存管理方式
程式會劃分成不同大小的塊
使用分塊儲存會便於程式設計
便於共享和保護
每個分段都從0開始編址並採用一段連續的地址空間
故段連續 段之間不連續
1.邏輯地址結構 :段號和段內地址
2.段表 :分段儲存沒有均勻分割 故應存在段號 段長 基址 存放和頁表類似
段暫存器存放段表始址和段表長度
3.與分頁的區別
頁是資訊的物理單位
頁的大小固定而且由作業系統決定
地址是一維的
段是資訊的邏輯單位
4.資訊共享
多個程序的段表項指向同一記憶體區域實現
5.大小
邏輯地址結構
1.段號
通過段號可以知道最多允許有多少分段
2.段內地址
可以知道每段的最大長度
不定
段頁式儲存管理方式
結合分段的滿足使用者和分頁的高效記憶體滿足
先分成邏輯片段 再對片段進行分頁的操作
1.邏輯地址結構
- 段號
- 段內頁號
- 頁內地址
2.先分段再分段
所以會先訪問段表再訪問頁表
最後訪問資訊
3.段表和頁表
硬體支援只要段表暫存器