buddy system記憶體管理,努力讓記憶體分配與相鄰記憶體合併能快速進行(對於普通演算法來講,合併記憶體相當困難),它利用的是計算機擅長處理2的冪運算。
我們建立一系列空閒塊列表,每一種都是2的倍數。
舉個例子,如果最小分配單元是8位元組,整個記憶體空間有1m。我們建立8位元組記憶體塊鍊錶,16位元組記憶體塊鍊錶,32位元組記憶體塊鍊錶,64,128,256,512,1k,2k, 4k, 8k, 16k, 32k, 64k, 128k, 256k, 512k 和乙個1m記憶體塊鍊錶。
除了1m記憶體塊鍊錶有乙個可用單元,其餘鍊錶初始為空。所有的記憶體分配都會向上取整到2的倍數—-70k會向上取整到128k,15k會向上取整到16k,等等。
buddy system允許乙個被分配塊單元平均拆分成兩個大小是原來一半的塊單元,這兩個塊單元互為夥伴。塊b的夥伴必須滿足大小跟塊b一樣大,並且記憶體位址相鄰(才可以合併)。
另乙個夥伴性質是所有塊單元在記憶體中的位址必須能被它自己的大小整除。比如16位元組的塊的位址都是一些16的倍數,如64位元組的塊的位址都是一些64的倍數,等等。
不僅如此,低位址的「夥伴」必須在乙個能它「父親塊大小」整除,簡單的說,來自同乙個大塊的兩個小塊才是夥伴。
分配記憶體示例
我們想分配70k的塊空間
1.70
k向上取整到2的倍數:128
k2.查詢有128
k空閒塊嗎?
3.沒有,分配256
k塊。 a.有256
k的空閒塊嗎?
b.沒有,分配512
k的塊。
i.有512
k空閒塊嗎?
ii.沒有,分配1m的空閒塊
i.有1m的空閒塊嗎?
ii.有,從1m的那個空閒鍊錶中摘下,分配出去
iii.拆開一半掛在512k空閒鍊錶上
iv.返回另一半512
k塊 c.拆開一半掛在256k空閒鍊錶上
d.返回另一半256k塊
4.將獲得的256
k的塊拆兩半,一半掛在128
k空閒鍊錶中
5.另一半128
k塊返回使用者。
記憶體**示例
當**乙個記憶體塊,我們把它掛到對應的空閒鍊錶上,然後查詢它的夥伴是不是也在這個空閒鍊錶上,如果是則合併他們然後掛接在對應2倍大小塊所對應的空閒鍊錶。重複該邏輯。假設我們**剛剛分配的128k塊記憶體
1.這個128
k的塊的夥伴也在128
k的空閒鍊錶上嗎?
2.是的,移除它的128
k夥伴塊。
3.合併成256
k的記憶體塊
a.這個256
k的塊的夥伴也在256
k空閒鍊錶上嗎?
b.是的,移除該夥伴並合併成512
k的塊。
c.這個512
k的塊的夥伴也在512
k空閒鍊錶上嗎?
d.是的,移除該夥伴並合併成1m的塊。
e.這個1m的塊的夥伴也在1m空閒鍊錶上嗎?
f.沒有,新增這個1m的塊在1m的空閒鍊錶上。
演算法的優劣勢分析
buddy system能很快地分配和**記憶體塊,但有內碎片,因為它要向上取2的冪的塊大小,有空間浪費,但這是所有記憶體分配演算法都避免不了的。linux系統使用它來分配記憶體頁,很可能是因為記憶體頁的大小是2的次冪。
記憶體管理演算法 Buddy夥伴演算法
buddy演算法的優缺點 1 儘管夥伴記憶體演算法在記憶體碎片問題上已經做的相當出色,但是該演算法中,乙個很小的塊往往會阻礙乙個大塊的合併,乙個系統中,對記憶體塊的分配,大小是隨機的,一片記憶體中僅乙個小的記憶體塊沒有釋放,旁邊兩個大的就不能合併。2 演算法中有一定的浪費現象,夥伴演算法是按2的冪次...
記憶體管理演算法 Buddy夥伴演算法
buddy演算法的優缺點 1 儘管夥伴記憶體演算法在記憶體碎片問題上已經做的相當出色,但是該演算法中,乙個很小的塊往往會阻礙乙個大塊的合併,乙個系統中,對記憶體塊的分配,大小是隨機的,一片記憶體中僅乙個小的記憶體塊沒有釋放,旁邊兩個大的就不能合併。2 演算法中有一定的浪費現象,夥伴演算法是按2的冪次...
夥伴演算法 Buddy
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!hi,buddy 刺蝟 關於位圖 linux核心夥伴演算法中每個order 的點陣圖都表示所有的空閒塊,比如我家的電腦記憶體256m 現在連上個qq主頁都比較卡 理論上的order為0的bitmap有256m 4k 2 塊。為什麼要除以二呢?因為 ...