1. 程式人生 > >操作系統:內存連續分配

操作系統:內存連續分配

分配 滿足 頁式 src 存儲管理 最小 最大的 建立 sys

?

日期: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一樣。

操作系統:內存連續分配