linux夥伴演算法

2021-10-19 13:48:58 字數 2413 閱讀 5684

** 

它要解決的問題是頻繁地請求和釋放不同大小的一組連續頁框,必然導致在已分配頁框的塊內分散了許多小塊的空閒頁面,由此帶來的問題是,即使有足夠的空閒頁框可以滿足請求,但要分配乙個大塊的連續頁框可能無法滿足請求。

夥伴演算法(buddy system)把所有的空閒頁框分為11個塊鍊錶,每塊鍊錶中分布包含特定的連續頁框位址空間,比如第0個塊鍊錶包含大小為2^0個連續的頁框,第1個塊鍊錶中,每個鍊錶元素包含2個頁框大小的連續位址空間,….,第10個塊鍊錶中,每個鍊錶元素代表4m的連續位址空間。每個鍊錶中元素的個數在系統初始化時決定,在執行過程中,動態變化。

夥伴演算法每次只能分配2的冪次頁的空間,比如一次分配1頁,2頁,4頁,8頁,…,1024頁(2^10)等等,每頁大小一般為4k,因此,夥伴演算法最多一次能夠分配4m的記憶體空間。

兩個記憶體塊,大小相同,位址連續,同屬於乙個大塊區域。(第0塊和第1塊是夥伴,第2塊和第3塊是夥伴,但第1塊和第2塊不是夥伴)

夥伴位圖:用一位描述夥伴塊的狀態位碼,稱之為夥伴位碼。比如,bit0為第0塊和第1塊的夥伴位碼,如果bit0為1,表示這兩塊至少有一塊已經分配出去,如果bit0為0,說明兩塊都空閒,還沒分配。

linux2.6為每個管理區使用不同的夥伴系統,核心空間分為三種區,dma,normal,highmem,對於每一種區,都有對於的夥伴演算法,

1. free_area陣列:

1:  struct zone
struct free_area  free_area[max_order]    #max_order 預設值為11

2.  zone_mem_map陣列

free_area陣列中,第k個元素,它標識所有大小為2^k的空閒塊,所有空閒快由free_list指向的雙向迴圈鍊錶組織起來。其中的nr_free,它指定了對應空間剩餘塊的個數。

整個分配圖示,大概如下:

比如,我要分配4(2^2)頁(16k)的記憶體空間,演算法會先從free_area[2]中檢視nr_free是否為空,如果有空閒塊,則從中分配,如果沒有空閒塊,就從它的上一級free_area[3](每塊32k)中分配出16k,並將多餘的記憶體(16k)加入到free_area[2]中去。如果free_area[3]也沒有空閒,則從更上一級申請空間,依次遞推,直到free_area[max_order],如果頂級都沒有空間,那麼就報告分配失敗。

釋放是申請的逆過程,當釋放乙個記憶體塊時,先在其對於的free_area鍊錶中查詢是否有夥伴存在,如果沒有夥伴塊,直接將釋放的塊插入煉表頭。如果有或板塊的存在,則將其從鍊錶摘下,合併成乙個大塊,然後繼續查詢合併後的塊在更大一級鍊錶中是否有夥伴的存在,直至不能合併或者已經合併至最大塊2^10為止。

核心試圖將大小為b的一對空閒塊(乙個是現有空閒鍊錶上的,乙個是待**的),合併為乙個大小為2b的單獨塊,如果它成功合併所釋放的塊,它會試圖合併2b大小的塊,

核心使用_rmqueue()函式來在管理區中找到乙個空閒塊,成功返回第乙個被分配頁框的頁描述符,失敗返回null。

核心使用

__free_pages_bulk()函式按照夥伴系統的策略釋放頁框。它使用3個基本輸入引數: 

page:被釋放塊中所包含的第乙個頁框描述符的位址。 

zone:管理區描述符的位址。 

order:塊大小的對數。

優點:較好的解決外部碎片問題

當需要分配若干個記憶體頁面時,用於dma的記憶體頁面必須連續,夥伴演算法很好的滿足了這個要求

只要請求的塊不超過512個頁面(2k),核心就盡量分配連續的頁面。

針對大記憶體分配設計。

缺點:1. 合併的要求太過嚴格,只能是滿足夥伴關係的塊才能合併,比如第1塊和第2塊就不能合併。

2. 碎片問題:乙個連續的記憶體中僅僅乙個頁面被占用,導致整塊記憶體區都不具備合併的條件

3. 浪費問題:夥伴演算法只能分配2的冪次方記憶體區,當需要8k(2頁)時,好說,當需要9k時,那就需要分配16k(4頁)的記憶體空間,但是實際只用到9k空間,多餘的7k空間就被浪費掉。

4. 演算法的效率問題: 夥伴演算法涉及了比較多的計算還有鍊錶和位圖的操作,開銷還是比較大的,如果每次2^n大小的夥伴塊就會合併到2^(n+1)的鍊錶佇列中,那麼2^n大小鍊錶中的塊就會因為合併操作而減少,但系統隨後立即有可能又有對該大小塊的需求,為此必須再從2^(n+1)大小的鍊錶中拆分,這樣的合併又立即拆分的過程是無效率的。

夥伴系統演算法

buddy夥伴演算法

Linux夥伴演算法

最近 一由於筆者能力有限,文中難免存在不足,如果發現錯誤之處,希望能幫助我及時糾正錯誤之處。1 夥伴演算法的用途 管理物理記憶體,解決外碎片問題。2 滿足以下條件的兩個塊稱為夥伴 l 兩個塊具有相同的大小,記作b l 它們的實體地址是連續的 l 第一塊的第乙個頁框的實體地址是2 b 2 12 的倍數...

linux記憶體管理 夥伴系統演算法

分配記憶體 釋放記憶體 兩個塊的大小相同 兩個塊的位址連續 兩個塊必須是從同乙個大塊分離出來的 linux把每個zone分成max order個free area,每個free are的大小是2的冪次方。max order的值為11,第0組大小為2 0個頁,第1組大小為2 1個頁,依次類推,最大的是...

夥伴系統演算法

如有問題,歡迎一起討論 struct free area static struct page rmqueue struct zone zone,unsigned int order return null define mark used index,order,area change bit i...