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