前面分析了伙伴管理演算法的初始化,在切入分析代碼實現之前,例行先分析一下其實現原理。 伙伴管理演算法(也稱之為Buddy演算法),該演算法將所有空閑的頁面分組劃分為MAX_ORDER個頁面塊鏈表進行管理,其中MAX_ORDER定義: 通常該值都是定義為11,而CONFIG_FORCE_MAX_ZONEORD ...
前面分析了伙伴管理演算法的初始化,在切入分析代碼實現之前,例行先分析一下其實現原理。
伙伴管理演算法(也稱之為Buddy演算法),該演算法將所有空閑的頁面分組劃分為MAX_ORDER個頁面塊鏈表進行管理,其中MAX_ORDER定義:
【file:/include/linux/mmzone.h】
#ifndef CONFIG_FORCE_MAX_ZONEORDER
#define MAX_ORDER 11
#else
#define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
#endif
通常該值都是定義為11,而CONFIG_FORCE_MAX_ZONEORDER定義:
【file:/arch/tile/include/asm/page.h】
/*
* If the Kconfig doesn't specify, set a maximum zone order that
* is enough so that we can create huge pages from small pages given
* the respective sizes of the two page types. See <linux/mmzone.h>.
*/
#ifndef CONFIG_FORCE_MAX_ZONEORDER
#define CONFIG_FORCE_MAX_ZONEORDER (HPAGE_SHIFT - PAGE_SHIFT + 1)
#endif
該值具體多少沒細入分析。其中tile是指Tilera處理器,順帶介紹一下:Tilera公司是位於矽谷的新創無晶圓半導體公司,該公司創始人之一是麻省理工學院(MIT)教授阿南特·阿加瓦爾(Anant Agarwal),他在2004年創建了該公司,因為在多核技術方面擁有獨家的先進技術,該公司曾被美國知名媒體EETIMES評為全球最有希望的60家新興企業之一。該公司的處理器功耗據說很低,但是性能卻是杠杠滴。迄今為止本人還沒接觸過該公司的處理器,慚愧慚愧,路漫漫其修遠兮。
接著,基於MAX_ORDER為11的情況,伙伴管理演算法每個頁面塊鏈表分別包含了:1、2、4、8、16、32、64、128、256、512、1024個連續的頁面,每個頁面塊的第一個頁面的物理地址是該塊大小的整數倍。假設連續的物理記憶體,各頁面塊左右的頁面,要麼是等同大小,要麼就是整數倍,而且還是偶數,形同伙伴。
其管理起來如圖:
伙伴管理演算法的釋放過程是,滿足條件的兩個頁面塊稱之為伙伴:兩個頁面塊的大小相同且兩者的物理地址連續。當某塊頁面被釋放時,且其存在空閑的伙伴頁面塊,則演算法會將其兩者合併為一個大的頁面塊,合併後的頁面塊如果還可以找到伙伴頁面塊,則將會繼續與相鄰的塊進行合併,直至到大小為2^MAX_ORDER個頁面為止。
釋放如圖:
而伙伴管理演算法的申請過程則相反,如果申請指定大小的頁面在其頁面塊鏈表中不存在,則會往高階的頁面塊鏈表進行查找,如果依舊沒找到,則繼續往高階進行查找,直到找到為止,否則就是申請失敗了。如果在高階的頁面塊鏈表找到空閑的頁面塊,則會將其拆分為兩塊,如果拆分後仍比需要的大,那麼繼續拆分,直至到大小剛好為止,這樣避免了資源浪費。
具體的申請如圖: