內存管理算法--Buddy伙伴算法


Buddy算法的優缺點:

1)盡管伙伴內存算法在內存碎片問題上已經做的相當出色,但是該算法中,一個很小的塊往往會阻礙一個大塊的合並,一個系統中,對內存塊的分配,大小是隨機的,一片內存中僅一個小的內存塊沒有釋放,旁邊兩個大的就不能合並。

2)算法中有一定的浪費現象,伙伴算法是按2的冪次方大小進行分配內存塊,當然這樣做是有原因的,即為了避免把大的內存塊拆的太碎,更重要的是使分配和釋放過程迅速。但是他也帶來了不利的一面,如果所需內存大小不是2的冪次方,就會有部分頁面浪費。有時還很嚴重。比如原來是1024個塊,申請了16個塊,再申請600個塊就申請不到了,因為已經被分割了。

3)另外拆分和合並涉及到 較多的鏈表和位圖操作,開銷還是比較大的。

Buddy(伙伴的定義):

這里給出伙伴的概念,滿足以下三個條件的稱為伙伴:
1)兩個塊大小相同;
2)兩個塊地址連續;
3)兩個塊必須是同一個大塊中分離出來的;

Buddy算法的分配原理:

假如系統需要4(2*2)個頁面大小的內存塊,該算法就到free_area[2]中查找,如果鏈表中有空閑塊,就直接從中摘下並分配出去。如果沒有,算法將順着數組向上查找free_area[3],如果free_area[3]中有空閑塊,則將其從鏈表中摘下,分成等大小的兩部分,前四個頁面作為一個塊插入free_area[2],后4個頁面分配出去,free_area[3]中也沒有,就再向上查找,如果free_area[4]中有,就將這16(2*2*2*2)個頁面等分成兩份,前一半掛如free_area[3]的鏈表頭部,后一半的8個頁等分成兩等分,前一半掛free_area[2]
的鏈表中,后一半分配出去。假如free_area[4]也沒有,則重復上面的過程,知道到達free_area數組的最后,如果還沒有則放棄分配。

 

 

 

Buddy算法的釋放原理:

內存的釋放是分配的逆過程,也可以看作是伙伴的合並過程。當釋放一個塊時,先在其對應的鏈表中考查是否有伙伴存在,如果沒有伙伴塊,就直接把要釋放的塊掛入鏈表頭;如果有,則從鏈表中摘下伙伴,合並成一個大塊,然后繼續考察合並后的塊在更大一級鏈表中是否有伙伴存在,直到不能合並或者已經合並到了最大的塊(2*2*2*2*2*2*2*2*2個頁面)。

整個過程中,位圖扮演了重要的角色,如圖2所示,位圖的某一位對應兩個互為伙伴的塊,為1表示其中一塊已經分配出去了,為0表示兩塊都空閑。伙伴中無論是分配還是釋放都只是相對的位圖進行異或操作。分配內存時對位圖的
是為釋放過程服務,釋放過程根據位圖判斷伙伴是否存在,如果對相應位的異或操作得1,則沒有伙伴可以合並,如果異或操作得0,就進行合並,並且繼續按這種方式合並伙伴,直到不能合並為止。

 

參考:http://blog.csdn.net/orange_os/article/details/7392986


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM