夥伴演算法例子
地址011011110000,可以被2^(2+1)整除,所以夥伴地址是其下半部,加4就行,所以答案是011011110100; 16大小時,不能被2^(4+1)整除,所以夥伴地址是其上半部,地址減去16,結果為0110 1110 0000。至於為什麼這樣整除決定,請檢視夥伴地址定義
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個頁面的連結串列中還沒有空閒塊,該演算法就放棄分配,併發出出錯訊號。
以上過程的逆過程就是塊的釋放過程,這也是該演算法名字的來由。滿足以下條件的兩個塊稱為夥伴:
· 兩個塊的大小相同
· 兩個塊的實體地址連續
夥伴演算法把滿足以上條件的兩個塊合併為一個塊,該演算法是迭代演算法,如果合併後的塊還可以跟相鄰的塊進行合併,那麼該演算法就繼續合併。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1130187/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 來個懂演算法的前端小夥伴演算法前端
- LRU演算法簡單例子演算法單例
- random_shuffle演算法小例子random演算法
- linux 頁框管理(二) 夥伴系統演算法Linux演算法
- 演算法測試例子特殊輸入形式演算法
- 遊戲中的夥伴遊戲
- 【python小例子】小例子拾憶Python
- split 例子
- 有在天津的小夥伴嗎
- (二)區塊鏈的共識演算法:PoS 及其 例子 程式碼 實現區塊鏈演算法
- java socket例子Java
- go channel例子Go
- oracle plsql例子OracleSQL
- Javacc的例子Java
- sqlldr的例子SQL
- 有做網路的小夥伴嗎
- [小夥伴們]知識管理藝術
- python基礎之 python實現PID演算法及測試的例子Python演算法
- 招募小夥伴和技術合夥人
- [小夥伴們]找工作這件事(背景篇)
- 夥伴系統和slab分配器
- 夥伴匹配系統踩坑日記2
- 尋找模擬面試夥伴,共同成長面試
- CSS 權值例子CSS
- mybatis小例子2MyBatis
- Websocket簡單例子Web單例
- sax解析例子演示
- oracle 寫declare例子Oracle
- JSONP的例子JSON
- Redis 實際例子Redis
- webpack 入門例子Web
- websocket使用小例子Web
- java反射小例子Java反射
- Oracle審計例子Oracle
- DBMS_SQL例子SQL
- JNI 簡單例子單例
- forward_list例子Forward
- GetMemory的典型例子