夥伴演算法例子

dongyu2013發表於2014-03-26
二進位制地址為011011110000,大小為4(10進位制數)和16(10進位制數)塊的夥伴地址分別為:?
地址011011110000,可以被2^(2+1)整除,所以夥伴地址是其下半部,加4就行,所以答案是011011110100;
16大小時,不能被2^(4+1)整除,所以夥伴地址是其上半部,地址減去16,結果為0110 1110 0000。至於為什麼這樣整除決定,請檢視夥伴地址定義

1.原理

       Linux的夥伴演算法把所有的空閒頁面分為10個塊組,每組中塊的大小是2次方頁面,例如,第0組中塊的大小都為21個頁面),第1組中塊的大小為都為212個頁面),第9組中塊的大小都為29512個頁面)。也就是說,每一組中塊的大小是相同的,且這同樣大小的塊形成一個連結串列。

   我們通過一個簡單的例子來說明該演算法的工作原理。

   假設要求分配的塊其大小128個頁面(由多個頁面組成的塊我們就叫做頁面塊)。該演算法先在塊大小為128個頁面的連結串列中查詢,看是否有這樣一個空閒塊。如果有,就直接分配;如果沒有,該演算法會查詢下一個更大的塊,具體地說,就是在塊大小為256個頁面的連結串列中查詢一個空閒塊。如果存在這樣的空閒塊,核心就把這256個頁面分為兩等份,一份分配出去,另一份插入到塊大小為128個頁面的連結串列中。如果在塊大小為256個頁面的連結串列中也沒有找到空閒頁塊,就繼續找更大的塊,即512個頁面的塊。如果存在這樣的塊,核心就從512個頁面的塊中分出128個頁面滿足請求,然後從384個頁面中取出256個頁面插入到塊大小為256個頁面的連結串列中。然後把剩餘的128個頁面插入到塊大小為128個頁面的連結串列中。如果512個頁面的連結串列中還沒有空閒塊,該演算法就放棄分配,併發出出錯訊號。

       以上過程的逆過程就是塊的釋放過程,這也是該演算法名字的來由。滿足以下條件的兩個塊稱為夥伴:

·      兩個塊的大小相同

·      兩個塊的實體地址連續

夥伴演算法把滿足以上條件的兩個塊合併為一個塊,該演算法是迭代演算法,如果合併後的塊還可以跟相鄰的塊進行合併,那麼該演算法就繼續合併。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1130187/,如需轉載,請註明出處,否則將追究法律責任。

相關文章