一文搞懂linux頁框分配與釋放
頁的分配
1.1 Alloc fast path alloc_pages--->alloc_pages_node--->__alloc_pages_node --->__alloc_pages--->
__alloc_pages_nodemask--->get_page_from_freelist
1.1.1從選定內(nèi)存域分配頁

1,如果oder為0表示分配單頁,這個時候就從pcplist中分配(冷熱頁)
2,如果設(shè)置了ALLOC_HARDER表示一次高優(yōu)先級的分配,就從前一類型為MIGRATE_HIGHATOMIC的鏈表中分配。MIGRATE_HIGHATOMIC類型的頁用于一些緊急情況下的內(nèi)存分配。
3,如果都不是前面的情況就嘗試從指定遷移類型migratetype的鏈表中去分配
4,如果在指定遷移類型鏈表中沒有仍然沒有分配到就嘗試從其他遷移類型的鏈表中去偷取
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ?


分配冷熱頁

到指定遷移類型的伙伴系統(tǒng)鏈表中分配頁
函數(shù)__rmqueue_smallest從指定遷移類型migratetype中去分配order階的頁塊。如果order階對應(yīng)的鏈表沒有空閑塊就從更大階的鏈表中去分配,將更大的頁塊拆解將剩余部分掛到對應(yīng)order的鏈表中去。
low:為希望分配的階,high:實際發(fā)現(xiàn)有空閑頁的階;area:為high對應(yīng)的free_area;migratetype:指定的遷移類型
1.1.2 Alloc Fallbacks
查找備用遷移類型
備用遷移類型fallbacks是一個二維數(shù)組,表示如果指定遷移類型分配失敗,其他可用的遷移類型列表
1.1.3聯(lián)合頁
前面講解了通過調(diào)用函數(shù)rmqueue來做頁分配,如果分配成功,在返回頁之前要對頁做一些預(yù)處理,比如分配標(biāo)志gfp_flags中設(shè)置了__GFP_COMP請求多個頁,就需要將分配到的多個頁組合成復(fù)合頁。第一頁稱為首頁,其余頁都是尾頁,具體組合邏輯如下:
1.2 Alloc slowpath
前面快速分配內(nèi)存沒有成功下面通過各種途徑嘗試分配到所需內(nèi)存,慢速分配步驟如下: 降低水印ALLOC_WMARK_MIN,如果設(shè)置了__GFP_KSWAPD_RECLAIM就喚醒交換線程; 調(diào)用get_page_from_freelist嘗試重新分配; 如果分配的頁階大于0嘗試內(nèi)存壓縮,通過內(nèi)存遷移合并出較大的內(nèi)存塊,然后嘗試內(nèi)存分配; 如果設(shè)置了__GFP_KSWAPD_RECLAIM再次喚醒交換線程,確保交換線程不會意外睡去; 直接進行內(nèi)存回收之后嘗試分配; 如果內(nèi)存回收沒有分配到所需內(nèi)存,就直接進行內(nèi)存壓縮之后嘗試分配; 檢查分配標(biāo)志是否存在一些潛在可調(diào)的空間,然后再次調(diào)用get_page_from_freelist嘗試份分配; 如果沒有回收到足夠的內(nèi)存就嘗試殺死一些進程然后嘗試分配內(nèi)存; 如果仍然沒有分配到內(nèi)存,分配標(biāo)志中設(shè)置了__GFP_NOFAIL就設(shè)置ALLOC_HARDER嘗試做內(nèi)存分配。
頁的釋放

函數(shù)free_pages用于釋放內(nèi)存頁,傳入的參數(shù)是頁虛擬地址和order。首先函數(shù)會根據(jù)虛擬地址得到對應(yīng)的page結(jié)構(gòu),然后判斷order是否為0,如果為0就釋放到per cpu lists中去。如果per cpu lists中緩存的頁數(shù)大于了其上限pcp->high就釋放一批pcp->batch到伙伴系統(tǒng)中去。如果order大于0就直接釋放到伙伴系統(tǒng)中。
下面是從per cpu lists中釋放一批pcp->batch頁到伙伴系統(tǒng)中的實現(xiàn):
伙伴系統(tǒng)
cat /proc/buddyinfo可以看到伙伴系統(tǒng)所有內(nèi)存域每個階剩余的頁塊信息:

cat /proc/pagetypeinfo可以看到每個頁階中所有遷移類型中的頁塊數(shù):

函數(shù)__free_one_page中實現(xiàn)了伙伴系統(tǒng)的核心邏輯:
