分配記憶體
釋放記憶體
兩個塊的大小相同
兩個塊的位址連續
兩個塊必須是從同乙個大塊分離出來的
linux把每個zone分成max_order個free_area,每個free_are的大小是2的冪次方。max_order的值為11,第0組大小為2^0個頁,第1組大小為2^1個頁,依次類推,最大的是2^10個頁,即1024*4kb=4mb。同樣大小的塊形成乙個鍊錶。每個free_area都維護了乙個位圖,該位圖表示所有的空閒塊,有n個空閒塊,則有n/2位,每位對應兩個夥伴塊,為0代表兩塊都空閒,為1表示其中一塊忙。在每次分配或者釋放時,都要進行異或運算,意思是,初始階段兩塊都空閒,值為0;使用了其中一塊之後,值異或為1;另外一塊如果也使用了,值異或為0;其中一塊釋放兩,值異或為1;兩塊都釋放了,異或為0。
struct free_area
;struct zone
先找到等於或者最接近2的冪次方的鍊錶,檢視對應的free_area的nr_free是否還有剩餘,如果有的話,則直接分配;如果沒有的話,則從更大一級的free_area中尋找,如果有空的,就將該結點取出來,分成兩半,稱為夥伴,一半用於記憶體分配,另一半整合到小一級的free_area中;如果還是沒有,則繼續上面的過程。
釋放記憶體其實是分配的逆過程,當釋放乙個塊時,先查詢對應的free_area中的鍊錶中是否有夥伴存在,如果沒有,則直接把釋放的塊插入free_area結構體成員free_list中;如果有的話,則將其夥伴從鍊錶中取下,合併成乙個大塊,然後在這個大塊對應的free_area中查詢是否有夥伴,依次類推,直到不能合併為止。
減少了空閒分割槽,提高了空間利用率
可以分配連續的記憶體頁面
適合大記憶體分配
合併需要嚴格的條件,不是夥伴不能合併
如果兩個大小相同的記憶體塊之間有乙個小的記憶體塊,則這兩個記憶體塊不能合併
只能分配2的冪次方記憶體區,會造成浪費。比如需要17k時,就只能分配32k大小的記憶體空間,剩下的15k就被浪費了
由於是用鍊錶和位圖進行操作,演算法開銷比較大
linux 物理記憶體管理之夥伴系統
linux使用夥伴系統來管理物理記憶體頁 顧名思義一下,在作業系統分配記憶體的過程中,乙個記憶體塊常常被分成兩個大小相等的記憶體塊,這兩個大小相等的記憶體塊就是夥伴關係,他滿足三個條件 為了便於頁面維護,將多個頁面組成記憶體塊,每個記憶體塊都有2的方冪個頁,方冪的指數被稱為階order,order相...
linux記憶體管理之夥伴系統(建立)
核心使用夥伴系統來解決記憶體分配引起的外部碎片問題。一 資料結構描述 結構zone中的free area陣列描述夥伴系統該陣列為free area結構 www.2cto.com struct zone www.2cto.com struct free area 下圖為夥伴系統在管理區中的表示。二 夥...
記憶體管理之夥伴演算法
通常情況下,乙個高階作業系統必須要給程序提供基本的 能夠在任意時刻申請和釋放任意大小記憶體的功能,就像malloc 函式那樣,然而,實現malloc 函式並不簡單,由於程序申請記憶體的大小是任意的,如果作業系統對malloc 函式的實現方法不對,將直接導致乙個不可避免的問題,那就是記憶體碎片。記憶體...