1.原理
linux的夥伴演算法把所有的空閒頁面分為10個塊組,每組中塊的大小是2的冪次方個頁面,例如,第0組中塊的大小都為20
(1個頁面),第1組中塊的大小為都為21
(2個頁面),第9組中塊的大小都為29
(512個頁面)。也就是說,每一組中塊的大小是相同的,且這同樣大小的塊形成乙個鍊錶
。我們通過乙個簡單的例子來說明該演算法的工作原理。
假設要求分配的塊其大小為128個頁面(由多個頁面組成的塊我們就叫做頁面塊)。該演算法先在塊大小為128個頁面的鍊錶中查詢,看是否有這樣乙個空閒塊。如果有,就直接分配;如果沒有,該演算法會查詢下乙個更大的塊,具體地說,就是在塊大小為256個頁面的鍊錶中查詢乙個空閒塊。如果存在這樣的空閒塊,核心就把這256個頁面分為兩等份,乙份分配出去,另乙份插入到塊大小為128個頁面的鍊錶中。如果在塊大小為256個頁面的鍊錶中也沒有找到空閒頁塊,就繼續找更大的塊,即512個頁面的塊。如果存在這樣的塊,核心就從512個頁面的塊中分出128個頁面滿足請求,然後從384個頁面中取出256個頁面插入到塊大小為256個頁面的鍊錶中。然後把剩餘的128個頁面插入到塊大小為128個頁面的鍊錶中。如果
512個頁面的鍊錶中還沒有空閒塊,該演算法就放棄分配,並發出出錯訊號。
以上過程的逆過程就是塊的釋放過程,這也是該演算法名字的來由。滿足以下條件的兩個塊稱為夥伴:
· 兩個塊的大小相同
· 兩個塊的實體地址連續
夥伴演算法把滿足以上條件的兩個塊合併為乙個塊,該演算法是迭代演算法,如果合併後的塊還可以跟相鄰的塊進行合併,那麼該演算法就繼續合併。
2.資料結構在
管理區資料結構struct zone_struct中,涉及到空閒區資料結構:
free_area_t free_area[max_order];
我們再次對free_area_t給予較詳細的描述。
#difine max_order 10
type struct free_area_struct free_area_t
其中list_head域是乙個通用的雙向鍊錶結構,鍊錶中元素的型別將為mem_map_t(即struct page結構)。map域指向乙個位圖,其大小取決於現有的頁面數。free_area第k項位圖的每一位,描述的就是大小為2k
個頁面的兩個夥伴塊的狀態。如果點陣圖的某位為0,表示一對兄弟塊中或者兩個都空閒,或者兩個都被分配,如果為1,肯定有一塊已被分配。當兄弟塊都空閒時,核心把它們當作乙個大小為2k+1
的單獨快來處理。如圖6.9給出該資料結構的示意圖:
圖6.9 夥伴系統使用的資料結構
圖6.9中,free_aea陣列的元素0包含了乙個空閒頁(頁面編號為0);而元素2則包含了兩個以4個頁面為大小的空閒頁面塊,第乙個頁面塊的起始編號為4,而第二個頁面塊的起始編號為56。
我們曾提到,當需要分配若干個記憶體頁面時,用於dma的記憶體頁面必須是連續的。其實為了便於管理,從夥伴演算法可以看出,只要請求分配的塊大小不超過512個頁面(2kb),核心就盡量分配連續的頁面。
夥伴系統演算法
如有問題,歡迎一起討論 struct free area static struct page rmqueue struct zone zone,unsigned int order return null define mark used index,order,area change bit i...
linux記憶體管理 夥伴系統演算法
分配記憶體 釋放記憶體 兩個塊的大小相同 兩個塊的位址連續 兩個塊必須是從同乙個大塊分離出來的 linux把每個zone分成max order個free area,每個free are的大小是2的冪次方。max order的值為11,第0組大小為2 0個頁,第1組大小為2 1個頁,依次類推,最大的是...
Linux夥伴系統
夥伴系統的概述 linux核心記憶體管理的一項重要工作就是如何在頻繁申請釋放記憶體的情況下,避免碎片的產生。linux採用夥伴系統解決外部碎片的問題,採用slab解決內部碎片的問題,在這裡我們先討論外部碎片問題。避免外部碎片的方法有兩種 一種是之前介紹過的利用非連續記憶體的分配 另外一種則是用一種有...