【操作系統】第四章 存儲器管理(2)——存儲管理的連續分配方式

連續分配存儲管理方式

爲一個用戶程序分配一個連續的內存空間

20世紀六、七十年代的OS中,分類:

單一連續分配    

固定分區分配

動態分區分配 

動態重定位分區分配

其他 



1 單一連續分配


內存分爲系統區和用戶區兩部分:

系統區:僅提供給OS使用,通常放在內存低址部分

用戶區:除系統區以外的全部內存空間,提供給用戶使用。

最簡單的一種存儲管理方式,只能用於單用戶、單任務的操作系統中。

優點:易於管理。

缺點:對要求內存空間少的程序,造成內存浪費;程序全部裝入,很少使用的程序部分也佔用內存。



2 固定分區分配


把內存分爲一些大小相等或不等的分區(partition),每個應用進程佔用一個分區。操作系統佔用其中一個分區。

提高:支持多個程序併發執行,適用於多道程序系統和分時系統。最早的多道程序存儲管理方式。

劃分爲幾個分區,便允許幾道作業併發


2.1 如何劃分分區大小

分區大小相等:只適合於多個相同程序的併發執行(處理多個類型相同的對象)。缺乏靈活性。

分區大小不等:多個小分區、適量的中等分區、少量的大分區。根據程序的大小,分配當前空閒的、適當大小的分區。


2.2 需要的數據結構

建立一記錄相關信息的分區表(或分區鏈表),表項有:

| 起始位置 | 大小 | 狀態 |

分區表中,表項值隨着內存的分配和釋放而動態改變



2.3程序分配內存的過程

可將分區表分爲兩個表格:空閒分區表/佔用分區表。從而減小每個表格長度。

檢索算法:空閒分區表可能按不同分配算法採用不同方式對錶項排序(將分區按大小排隊或按分區地址高低排序)。

過程:

檢索空閒分區表;找出一個滿足要求且尚未分配的分區,分配給請求程序;若未找到大小足夠的分區,則拒絕爲該用戶程序分配內存。


固定分配的不足

內碎片(一個分區內的剩餘空間)造成浪費

分區總數固定,限制併發執行的程序數目



3 動態分區分配

分區的大小不固定:在裝入程序時根據進程實際需要,動態分配內存空間,即需要多少劃分多少

空閒分區表項:從1項到n項:內存會從初始的一個大分區不斷被劃分、回收從而形成內存中的多個分區。

優點:併發進程數沒有固定數的限制,不產生內碎片。

缺點:有外碎片(分區間無法利用的空間)


3.1 數據結構

①空閒分區表:

•記錄每個空閒分區的情況。

•每個空閒分區對應一個表目,包括分區序號、分區始址及分區的大小等數據項。

②空閒分區鏈:

•每個分區的起始部分,設置用於控制分區分配的信息,及用於鏈接各分區的前向指針;

•分區尾部則設置一後向指針,在分區末尾重複設置狀態位和分區大小表目方便檢索。


3.2 分區分配算法

動態分區方式,分區多、大小差異各不相同,此時把一個新作業裝入內存,更需選擇一個合適的分配算法,從空閒分區表/鏈中選出一合適分區

①首次適應算法FF

②循環首次適應算法

③最佳適應算法

④最差適應算法

⑤快速適應算法


①首次適應算法FF

1.空閒分區排序:以地址遞增的次序鏈接。

2.檢索:分配內存時,從鏈首開始順序查找直至找到一個大小能滿足要求的空閒分區;

3.分配:從該分區中劃出一塊作業要求大小的內存空間分配給請求者,餘下的空閒分區大小改變仍留在空閒鏈中。

若從頭到尾檢索不到滿足要求的分區則分配失敗

優點:優先利用內存低址部分,保留了高地址部分的大空閒區;

缺點:但低址部分不斷劃分,會產生較多小碎片;而且每次查找從低址部分開始,會逐漸增加查找開銷。


②循環首次適應算法

1.空閒分區排序:按地址

2.檢索:從上次找到的空閒分區的下一個空閒分區開始查找,直到找到一個能滿足要求的空閒分區。爲實現算法,需要:

設置一個起始查尋指針

採用循環查找方式

3.分配:分出需要的大小

優點:空閒分區分佈均勻,減少查找開銷

缺點:缺乏大的空閒分區


③最佳適應算法

1.空閒分區排序:所有空閒分區按容量從小到大排序成空閒分區表或鏈。

2.檢索:從表或鏈的頭開始,找到的第一個滿足的就分配

3.分配:分出需要的大小

優點:總是把能滿足要求、又是最小的空閒分區分配給作業,避免“大材小用”。

 缺點:每次找到最合適大小的分區割下的空閒區也總是最小,會產生許多難以利用的小空閒區(外碎片)


④最差適應算法/最壞匹配法(worst-fit)

基本不留下小空閒分區,但會出現缺乏較大的空閒分區的情況。


⑤快速適應算法

根據進程常用空間大小進行劃分,相同大小的串成一個鏈,需管理多個各種不同大小的分區的鏈表。進程需要時,從最接近大小需求的鏈中摘一個分區。類似的:夥伴算法

能快速找到合適分區,但鏈表信息會很多;實際上是空間換時間。


3.3 分區分配操作

空閒分區的大小m.size,

用戶需要的大小u.size

s=m.size- u.size

size爲系統規定不再切割的分區大小

分配內存

找到滿足需要的合適分區,劃出進程需要的空間

s<=size,將整個分區分配給請求者

s> size,按請求的大小劃出一塊內存空間分配出去,餘下部分留在空閒鏈中,將分配區首址返回給調用者。

回收內存

進程運行完畢釋放內存時,系統根據回收區首址a,在空閒分區鏈(表)中找到相應插入點,根據情況修改空閒分區信息,可能會進行空閒分區的合併。


3.4 動態重定位分區分配——有緊湊功能的動態分區分配 

用戶程序在內存中移動,將空閒空間緊湊起來提高空間利用率。但必然需要地址變化,增加“重定位”工作。

地址變換過程是在程序執行過程期間(相對地址與重定位寄存器中的地址相加),隨着對每條指令的訪問自動進行,稱爲動態重定位。

動態重定位分區分配算法與動態分區分配算法基本相同,差別在於增加了緊湊的功能


3.5 內存空間管理之對換

當內存空間還是滿足不了需求時,引入“對換”思想:

把內存中暫時不能運行、或暫時不用的程序和數據調到外存上,以騰出足夠的內存;把已具備運行條件的進程和進程所需要的程序和數據,調入內存。


按對換單位分類:

整體對換(或進程對換):以整個進程爲單位(連續分配)

頁面對換或分段對換:以頁或段爲單位(離散分配)


實現進程對換,系統必須具備的功能:

�對換空間的管理

�進程的換出、換入操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章