1. 程式人生 > >第四章 儲存器管理(1)

第四章 儲存器管理(1)

儲存部件層

在這裡插入圖片描述

**

程式的裝入和連結

**
程式進記憶體的一般過程:
1)編譯compiler:編譯程式:將使用者原始碼編譯成若干個目標模組。
2)連結link:連結程式:將形成的一組目標模組,及它們需要的庫函式連結在一起,形成一個完整的裝入模組。
3)裝入load:由裝入程式將裝入模組裝入記憶體,構造PCB,形成程序,開始執行(使用實體地址)。
在這裡插入圖片描述
1.地址的概念
邏輯地址(相對地址,虛地址)
使用者的程式經過彙編或編譯後形成目的碼,目的碼中的指令地址是相對地址。
一般首地址為0,其餘指令中的地址都相對於首地址來編址。
不能用邏輯地址在記憶體中讀取資訊

實體地址(絕對地址,實地址)


記憶體中儲存單元的地址。
實體地址可直接定址被執行。

地址對映
將使用者程式中的邏輯地址轉換為執行時由機器直接定址的記憶體實體地址的過程。

2.程式裝入中的地址處理
邏輯地址 ====== 實體地址:
絕對裝入方式(absolute loading)
在這裡插入圖片描述
編譯程式生成的“目的碼”就是”裝入模組” ,邏輯地址直接從某個地址R處增長,裝入模組直接裝入記憶體地址R處。
實體地址一般由編譯或彙編程式給出或由程式設計師賦予
優點:
裝入過程簡單。不需任何地址變換,程式中的邏輯地址與實際記憶體實體地址完全相同。
缺點:過於依賴硬體結構, 只適用早期針對硬體直接程式設計、單道環境下。
邏輯地址 重定位 實體地址:
靜態可重定位裝入方式(relocatable loading mode)


在這裡插入圖片描述
地址對映在程式執行之前進行,重定位後實體地址不再改變。
可由專門設計的重定位裝配程式完成(軟):裝入時根據所定位的記憶體地址去修改每個邏輯地址,新增相應偏移量,重定位為實體地址。
優點:不需硬體支援,可以裝入有限的多道程式
缺點:軟體裝入一次完成,一個程式通常需要佔用連續的記憶體空間,程式裝入記憶體後不能移動。也不易實現共享。
動態執行時(重定位)裝入方式(dynamic run-time loading)

3.不同的程式連結裝入方式
裝入是使用記憶體的開始,但連結的不同會使記憶體的使用有差別
根據連結時間的不同,分成三種:
靜態連結:
裝入執行前將多個目標模組及所需庫函式連結成一個整體,以後不再拆開。
裝入執行前,生成可執行檔案時進行的。
將多個目標模組及所需庫函式連結成一個整體,以後不再拆開。
在這裡插入圖片描述


裝入時動態連結:
裝入記憶體時,邊裝入邊連結的連結方式。
由一個目標模組開始裝入,若又涉及外部模組呼叫事件,裝入程式再找出相應的外部目標模組,並將它裝入記憶體,還要修改目標模組中的相對地址。
與靜態連結比較:
(1) 靜態連結好的程式,修改部分模組後,需重新連結成可裝入程式。動態方式則便於修改和更新。
(2) 便於實現共享。靜態的N個程式都需要一個模組時,需要進行N次拷貝。
在這裡插入圖片描述
執行時動態連結:
對某些目標模組的連結,在執行中需要該目標模組時,才對它進行連結。
裝入時動態連結的問題
許多情況下,事先不知道某應用程式本次執行需要哪些模組,只能全部裝入,裝入時全部連結在一起,效率低。
辦法:有的模組不經常使用就暫時不裝入,執行時用到了再裝入。
(如程式總不出錯,就不會用到錯誤處理模組。)
即執行時動態連結:執行時,將對某些模組的連結推遲到執行時才連結裝入。
優點:程式執行裝入的內容少了,加快了裝入過程,而且節省大量的記憶體空間。
在這裡插入圖片描述
**

連續分配儲存管理方式

**
為一個使用者程式分配一個連續的記憶體空間
20世紀六、七十年代的OS中,分類:
單一連續分配
記憶體分為系統區和使用者區兩部分
系統區:僅提供給OS使用,通常放在記憶體低址部分
使用者區:除系統區以外的全部記憶體空間,提供給使用者使用。
最簡單的一種儲存管理方式,只能用於單使用者、單任務的作業系統中。
優點:易於管理。
缺點:對要求記憶體空間少的程式,造成記憶體浪費;程式全部裝入,很少使用的程式部分也佔用記憶體。

固定分割槽分配
把記憶體分為一些大小相等或不等的分割槽(partition),每個應用程序佔用一個分割槽。作業系統佔用其中一個分割槽。
提高:支援多個程式併發執行,適用於多道程式系統和分時系統。最早的多道程式儲存管理方式。
劃分為幾個分割槽,便只允許幾道作業併發
固定分配的不足:
內碎片(一個分割槽內的剩餘空間)造成浪費
分割槽總數固定,限制併發執行的程式數目。
具體實現:
1)如何劃分分割槽大小
分割槽大小相等:
只適合於多個相同程式的併發執行(處理多個型別相同的物件)。缺乏靈活性。
分割槽大小不等:
多個小分割槽、適量的中等分割槽、少量的大分割槽。根據程式的大小,分配當前空閒的、適當大小的分割槽。
2)需要的資料結構
建立一記錄相關資訊的分割槽表(或分割槽連結串列),表項有:

                     | 起始位置 | 大小 | 狀態 

分割槽表中,表項值隨著記憶體的分配和釋放而動態改變
3)分配回收操作
也可將分割槽表分為兩個表格
空閒分割槽表/佔用分割槽表。從而減小每個表格長度。
檢索演算法
空閒分割槽表可能按不同分配演算法採用不同方式對錶項排序
(將分割槽按大小排隊或按分割槽地址高低排序)。
過程:
檢索空閒分割槽表;
找出一個滿足要求且尚未分配的分割槽,分配給請求程式;
若未找到大小足夠的分割槽,則拒絕為該使用者程式分配記憶體。

動態分割槽分配
分割槽的大小不固定:在裝入程式時根據程序實際需要,動態分配記憶體空間,即——需要多少劃分多少。
空閒分割槽表項:從1項到n項:
記憶體會從初始的一個大分割槽不斷被劃分、回收從而形成記憶體中的多個分割槽
動態重定位分割槽分配
優點:併發程序數沒有固定數的限制,不產生內碎片。
缺點:有外碎片(分割槽間無法利用的空間)
具體實現:
1)分割槽分配中的資料結構
①空閒分割槽表:
記錄每個空閒分割槽的情況。
每個空閒分割槽對應一個表目,包括分割槽序號、分割槽始址及分割槽的大小等資料項。
②空閒分割槽鏈:
每個分割槽的起始部分,設定用於控制分割槽分配的資訊,及用於連結各分割槽的前向指標;
分割槽尾部則設定一後向指標,在分割槽末尾重複設定狀態位和分割槽大小表目方便檢索。
2)分割槽分配演算法
動態分割槽方式,分割槽多、大小差異各不相同,此時把一個新作業裝入記憶體,更需選擇一個合適的分配演算法,從空閒分割槽表/鏈中選出一合適分割槽
①首次適應演算法FF
空閒分割槽排序:以地址遞增的次序連結。
*檢索:*分配記憶體時,從鏈首開始順序查詢直至找到一個大小能滿足要求的空閒分割槽;
分配:從該分割槽中劃出一塊作業要求大小的記憶體空間分配給請求者,餘下的空閒分割槽大小改變仍留在空閒鏈中。
若從頭到尾檢索不到滿足要求的分割槽則分配失敗
優點:優先利用記憶體低址部分,保留了高地址部分的大空閒區;
缺點:但低址部分不斷劃分,會產生較多小碎片;而且每次查詢從低址部分開始,會逐漸增加查詢開銷

②迴圈首次適應演算法
空閒分割槽排序:按地址
檢索:從上次找到的空閒分割槽的下一個空閒分割槽開始查詢,直到找到一個能滿足要求的空閒分割槽。為實現演算法,需要:
設定一個起始查尋指標
採用迴圈查詢方式
*分配:*分出需要的大小
優點:空閒分割槽分佈均勻,減少查詢開銷
缺點:缺乏大的空閒分割槽

③最佳適應演算法
總是把能滿足要求、又是最小的空閒分割槽分配給作業,避免“大材小用”。
空閒分割槽排序:所有空閒分割槽按容量從小到大排序成空閒分割槽表或鏈。
檢索:從表或鏈的頭開始,找到的第一個滿足的就分配
分配:分出需要的大小
缺點:每次找到最合適大小的分割槽割下的空閒區也總是最小,會產生許多難以利用的小空閒區(外碎片)
④最差適應演算法
基本不留下小空閒分割槽,但會出現缺乏較大的空閒分割槽的情況。
⑤快速適應演算法
根據程序常用空間大小進行劃分,相同大小的串成一個鏈,需管理多個各種不同大小的分割槽的連結串列。程序需要時,從最接近大小需求的鏈中摘一個分割槽。類似的:夥伴演算法
能快速找到合適分割槽,但連結串列資訊會很多;實際上是空間換時間。
3)分割槽分配操作
分配記憶體
找到滿足需要的合適分割槽,劃出程序需要的空間
if s<=size,將整個分割槽分配給請求者
if s> size,按請求的大小劃出一塊記憶體空間分配出去,餘下部分留在空閒鏈中,將分配區首址返回給呼叫者。
回收記憶體
程序執行完畢釋放記憶體時,系統根據回收區首址a,在空閒分割槽鏈(表)中找到相應插入點,根據情況修改空閒分割槽資訊,可能會進行空閒分割槽的合併
回收區:
(1)回收區(首址a)與一個分割槽f1末尾(首址b+大小)鄰接:將回收區與f1合併,修改f1的表項的分割槽大小
(2)回收區(首址a+大小)與一個分割槽f2的首址b鄰接:將回收區與f2合併,修改f2的表項的首址、分割槽大小
(3) (1)(2)兩種情況都有,則將回收區與前後兩個分割槽F1、F2鄰接:將三個分割槽合併,使用F1的表項和F1的首址,取消F2的表項,大小為三者之和
(4) 回收區沒有鄰接的分割槽:為回收區單獨建立新表項,填寫回收區的首址與大小,根據其首址插到空閒鏈中的適當位置

動態重定位分割槽分配
有緊湊功能的動態分割槽分配
在這裡插入圖片描述
在這裡插入圖片描述

記憶體管理之對換
當記憶體空間還是滿足不了需求時,引入“對換”思想:
把記憶體中暫時不能執行、或暫時不用的程式和資料調到外存上,以騰出足夠的記憶體;把已具備執行條件的程序和程序所需要的程式和資料,調入記憶體。
按對換單位分類:
整體對換(或程序對換):以整個程序為單位(連續分配)
頁面對換或分段對換:以頁或段為單位(離散分配)

實現程序對換,系統必須具備的功能:
對換空間的管理
在這裡插入圖片描述
程序的換出、換入操作