記憶體分配方式及分配演算法優劣

2021-10-24 01:59:33 字數 2744 閱讀 1015

內部碎片的產生:因為所有的記憶體分配必須起始於可被 4、8 或 16 整除(視 處理器體系結構而定)的位址或者因為mmu的分頁機制的限制,決定記憶體分配演算法僅能把預定大小的記憶體塊分配給客戶。假設當某個客戶請求乙個 43 位元組的記憶體塊時,因為沒有適合大小的記憶體,所以它可能會獲得 44位元組、48位元組等稍大一點的位元組,因此由所需大小四捨五入而產生的多餘空間就叫內部碎片。

外部碎片的產生: 頻繁的分配與**物理頁面會導致大量的、連續且小的頁面塊夾雜在已分配的頁面中間,就會產生外部碎片。假 設有一塊一共有100個單位的連續空閒記憶體空間,範圍是0-99。如果你從中申請一塊記憶體,如10個單位,那麼申請出來的記憶體塊就為0-9區間。這時候你 繼續申請一塊記憶體,比如說5個單位大,第二塊得到的記憶體塊就應該為10-14區間。如果你把第一塊記憶體塊釋放,然後再申請一塊大於10個單位的記憶體塊,比 如說20個單位。因為剛被釋放的記憶體塊不能滿足新的請求,所以只能從15開始分配出20個單位的記憶體塊。現在整個記憶體空間的狀態是0-9空閒,10-14 被占用,15-24被占用,25-99空閒。其中0-9就是乙個記憶體碎片了。如果10-14一直被占用,而以後申請的空間都大於10個單位,那麼0~9就 永遠用不上了,變成外部碎片。

記憶體分配方式主要有連續型分配方式和非連續型分配方式,顧名思義,連續型分配方式就是分配連續的空間,非連續型分配方式就是分配非連續的記憶體空間。

-連續型分配記憶體方式:

這種分割槽方式存在兩個問題

一是程式可能太大而放不進任何乙個分割槽中,這時使用者不得不使用覆蓋技術來使用記憶體空間;

二是主存利用率低,當程式小於固定分割槽大小時,也占用了乙個完整的記憶體分割槽空間,這樣分割槽內部有空間浪費,這種現象稱為內部碎片

固定分割槽是可用於多道程式設計最簡單的儲存分配,無外部碎片,但不能實現多程序共享乙個主存區,所以儲存空間利用率低。固定分割槽分配很少用於現在通用的作業系統中,但在某些用於控制多個相同物件的控制系統中仍發揮著一定的作用。

-動態分割槽分配:

不預先劃分記憶體,在程式裝入記憶體時,根據程序的大小動態地建立分割槽,並使得分割槽的大小正好適合程序的需要,因此系統中分割槽的大小和數目是可變的。

如圖4所示,系統有64mb記憶體空間,其中低8mb固定分配給作業系統,其餘為使用者可用記憶體。開始時裝入前三個程序,在它們分別分配到所需空間後,記憶體只剩下4mb,程序4無法裝入。

在某個時刻,記憶體中沒有乙個就緒程序,cpu出現空閒,作業系統就換出程序2,換入程序4。由於程序4比程序2小,這樣在主存中就產生了乙個6mb的記憶體塊。之後cpu又出現空閒,而主存無法容納程序2,作業系統就換出程序1,換入程序2。

動態分割槽分配記憶體方式剛開始是很好地,但是,之後會導致記憶體出現很多的小的記憶體塊,也就是外部碎片。外部碎片可以通過緊湊來解決,就是作業系統不時地對程序進行移動和整理。但是這需要動態重定位暫存器的支援,且相對費時。緊湊的過程實際上類似於windows系統中的磁碟整理程式,只不過後者是對外存空間的緊湊。

在程序裝入或換入主存時,如果記憶體中有多個足夠大的空閒塊,作業系統必須確定分配哪個記憶體塊給程序使用,這就是動態分割槽的分配策略。

1)首次適應:位址遞增,順序查詢,第乙個能滿足的即分配給程序。

2)最佳適應:容量遞增,找到第乙個能滿足要求的空閒分割槽。

3)最壞適應:容量遞減,找到第乙個能滿足要求的分割槽。

4)鄰近適應:迴圈首次適應演算法。

在這幾種方法中,首次適應演算法不僅是最簡單的,而且通常也是最好和最快的。在unix 系統的最初版本中,就是使用首次適應演算法為程序分配記憶體空間,其中使用陣列的資料結構 (而非鍊錶)來實現。不過,首次適應演算法會使得記憶體的低位址部分出現很多小的空閒分割槽,而每次分配查詢時,都要經過這些分割槽,因此也增加了查詢的開銷。

鄰近適應演算法試**決這個問題,但實際上,它常常會導致在記憶體的末尾分配空間(因為在一遍掃瞄中,記憶體前面部分使用後再釋放時,不會參與分配),**成小碎片。它通常比首次適應演算法的結果要差。

最佳適應演算法雖然稱為「最佳」,但是效能通常很差,因為每次最佳的分配會留下很小的難以利用的記憶體塊,它會產生最多的外部碎片。

最壞適應演算法與最佳適應演算法相反,選擇最大的可用塊,這看起來最不容易產生碎片,但是卻把最大的連續記憶體劃分開,會很快導致沒有可用的大的記憶體塊,因此效能也非常差。

kunth和shore分別就前三種方法對記憶體空間的利用情況做了模擬實驗,結果表明:

首次適應演算法可能比最佳適應法效果好,而它們兩者一定比最大適應法效果好

另外注意,在演算法實現時,分配操作中最佳適應法和最大適應法需要對可用塊進行排序或遍歷查詢,而首次適應法和鄰近適應法只需要簡單查詢

**操作中,當**的塊與原來的空閒塊相鄰時(有三種相鄰的情況,比較複雜),需要將這些塊合併。在演算法實現時,使用陣列或鍊錶進行管理。除了記憶體的利用率,這裡的演算法開銷也是作業系統設計需要考慮的乙個因素。

參考文獻:

1.記憶體分配方式及記憶體碎片

2.8.記憶體連續分配方式採用的幾種演算法及各自優劣

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的 整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函 數執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指...

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個 執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執 行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令...

記憶體分配方式

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它與資料結構中的堆是兩回事,分配方...