初窺記憶體管理(三)夥伴演算法

2021-06-05 18:20:45 字數 1218 閱讀 3173

假設系統的可利用記憶體空間容量為2m個字(位址從0到2m-1),則在開始執行時,整個記憶體區是乙個大小為2m的空閒塊,在執行了一段時間之後,被分隔成若干占用塊和空閒塊。為了在分配時查詢方便起見,我們將所有大小相同的空閒塊建於一張子表中。每個子表是乙個雙重鍊錶,這樣的鍊錶可能有m+1個,將這m+1個表頭指標用向量結構組織成乙個表,這就是夥伴系統中的可利用空間表,如圖所示:

分配演算法: 

當使用者提出大小為n的記憶體請求時,首先在可利用表上尋找結點大小與n相匹配的子表,若此子表非空,則將子表中任意乙個結點分配之即可;若此子表為空,則需從結點更大的非空子表中去查詢,直至找到乙個空閒塊,則將其中一部分分配給使用者,而將剩餘部分插入相應的子表中。

若2k-1

< n ≤ 2k-1,又第k+1個子表不空,則只要刪除此煉表中第乙個結點並分配給使用者即可;若 2k-2

< n ≤ 2k-1-1,此時由於結點大小為2k-1 的子表為空,則需從結點大小為2k 的子表中取出一塊,將其中一半分配給使用者,剩餘的一半作為乙個新結點插入在結點大小為2k-1的子表中,若2k-i-1

< n ≤ 2k-i-1(i為小於是的整數),並且所有結點小於2k的子表均為空,則同樣需從結點大小為2k的子表中取出一塊,將其中2k-i的一小部分分配給使用者,剩餘部分分割成若干個結點分別插入在結點大小為2k-1 、 2k-2 、…、 2k-i的子表中。

在使用者釋放不再使用的占用塊時,系統需將這新的空閒塊插入到可利用空間表中去。這裡,同樣有乙個位址相鄰的空閒塊歸併成大塊的問題。但是在夥伴系統中僅考慮互為「夥伴」的兩個空閒塊的歸併。

何謂「夥伴」?如前所述,在分配時經常需要將乙個大的空閒塊**成兩個大小相等的儲存區,這兩個由同一大塊**出來的小塊就稱之「互為夥伴」。例如:假設p為大小為pow(2,k)的空閒塊的初始位址,且p mod pow(2,k+1)=0,則初始位址為p和p+pow(2,k)的兩個空閒塊互為夥伴。在夥伴系統中**空閒塊時,只當其夥伴為空閒塊時才歸併成大塊。也就是說,若有兩個空閒塊,即使大小相同且位址相鄰,但不是由同一大塊**出來的,也不歸併在一起。

由此,在**空閒塊時,應首先判別其夥伴是否為空閒塊,若否,則只要將釋放的空閒塊簡單插入在相應子表中即可;若是,則需在相應子表中找到其夥伴並刪除之,然後再判別合併後的空閒塊的夥伴是否是空閒塊。依此重複,直到歸併所得空閒塊的夥伴不是空閒塊時,再插入到相應的子表中去。

全文**

記憶體管理 三 夥伴系統

linux核心記憶體管理的一項重要工作就是如何在頻繁申請釋放記憶體的情況下,避免碎片的產生。linux採用夥伴系統解決外部碎片的問題,採用slab解決內部碎片的問題 buddy演算法最主要的的特點任何時候區域裡的空閒記憶體都能以2的n次方進行拆分或合併。夥伴系統的宗旨就是用最小的記憶體塊來滿足核心的...

linux記憶體管理(五) 夥伴系統

核心中很多時候要求分配連續頁,而計算機經過長時間的執行以後,頻繁的分配和釋放記憶體,就會造成有很多記憶體雖然空閒可用,但是散布在實體地址空間的各處,這就是記憶體管理的碎片問題。為了能夠快速檢測記憶體中的連續區域,減緩碎片問題,linux核心採用了古老而歷經考驗的技術 夥伴系統。如圖所示,第一幅圖中有...

初窺記憶體管理(一)

大家都知道,我們malloc的時候作業系統維護著一張雙鏈表記錄堆裡面的空閒記憶體塊情況,每個節點對應一塊記憶體。最佳適應法 分配記憶體 大小為size 的時候,從表頭開始搜尋,找那塊比size大的最小空閒記憶體塊,進行分配,餘下的部分變成一塊空閒記憶體塊插入到鍊錶中 迴圈首次適應法 該演算法是首次適...