操作系統:內存連續分配
?
日期:2019/5/4
關鍵詞:操作系統筆記;內存管理;連續分配
?
一、概述
物理內存分配方案:
- 連續分配存儲管理
- 分頁存儲管理
- 分段存儲管理
- 段頁式存儲管理
可分為2大類:連續分配(1)和離散分配(2,3,4)。
二、動態內存分配
2.1 數據結構
- 空閑分區表(二維表):在系統中設置一張空閑分區表,用於記錄每個空閑分區的情況。每個 空閑分區占一個表目,表目中包括分區序號、分 區始址及分區的大小等數據項。
- 空閑分區鏈(鏈表)
2.2 分配與回收操作
- 內存分配
u.size:請求分區的大小。
m.size:每個空閑分區的大小。
size:事先規定不再切割的剩余分區大小。
註:m.size – u.size <= size?
- 內存回收
... | ... | ... | ... |
F1 | 非空閑 | F1 | 非空閑 |
回收區 | 回收區 | 回收區 | 回收區 |
非空閑 | F2 | F2 | 非空閑 |
... | ... | ... | .... |
1 | 2 | 3 | 4 |
四種情況:
1. 向前合並:與插入點的前一個空閑分區 F1相鄰接,不必為回收分區分配新表項,而只需修改其前一分區 F1的大小。
2. 向後合並:與插入點的後一空閑分區 F2相鄰接,用回收區的首址作為新空閑區的首址,大小為兩者之和。
3. 前後合並:回收區同時與插入點的前、後兩個分區鄰接,此時將三個分區合並, 使用 F1的表項和 F1的首址,取消 F2的表項,大小為三者之和。
4. 回收區既不與 F1鄰接,又不與 F2鄰接。這時應為回收區單獨建立一新表項,填寫 回收區的首址和大小,並根據其首址插入到空閑鏈中的適當位置。
2.2 分配算法——基於順序搜索
- 首次適應算法(First Fit)
空閑分區以地址遞增的次序鏈接,分配時,從鏈首開始順序查找,找到後,再按照作業的大小,從該分區中劃出一塊內存空間分配給請求者,余下的空閑分區仍留在空閑鏈中。
優點:高地址區存在大的空閑區。
缺點:低址部分留下許多無用留碎片(因為不斷被劃分),而每次查找又都從低址部分開始,增加了查找開銷。
- 循環首次適應算法(Next Fit)
從上次找到的空閑分區的下一個開始查找。
優點:該算法能使內存中的空閑分區分布比較均勻,從而減少查找空閑分區的時間。
缺點:缺少大的空閑區。
- 最佳適應算法(Best Fit)
空閑分區按其從小到大的順序鏈接。順鏈找第一個滿足要求的空閑區。(即所有滿足條件的空閑分區中最小的那個)
缺點:分配後,切割下來的剩余部分總是最小的,產生很多難以利用的碎片。
- 最壞適應算法(Worst Fit)
所有滿足條件的空閑分區中最大的那個。(實際上就是所有空閑分區中最大的那個)
2.3 分配算法——基於索引搜索
- 快速適應算法(Quick Fit)
- 哈希算法
- 夥伴系統(Buddy System)
固定分區如果分區大小與進程大小很不匹配,利用率低下;動態分區維護復雜;夥伴系統是一種折中的方案。
Unix存儲分配就采用改進後的夥伴系統。
口訣:大於一半拿整個,小於一半拿一半。
算法示例:
三、可重定位分區分配
媽蛋,這裏就是把動態內存分配中產生的"空洞"壓縮。課本講得跟shit一樣。
操作系統:內存連續分配