三 頁的alloc與free、Buddy算法以及CMA

整體目錄

一 linux虛擬內存、MMU、分頁的基本原理
二 OOM打分因子、oom_adj以及oom_score
三 頁的alloc與free、Buddy算法以及CMA
四 page_fault、內存IO交互、VSS、LRU
五 DMA及Cache一致性

=================================================================================

頁的alloc與free

轉載自深入淺出內存管理–alloc_pages與free_page分析(框圖)
alloc_pages用於連續物理內存的分配,它的實現如下圖所示
在這裏插入圖片描述
從這個流程圖來分析,函數是一步一步調用到buffered_rmqueue的,alloc_pages是頁分配器的對外接口,系統中很多模塊和驅動可以直接調用它申請到內存,而buffered_rmqueue是底層夥伴系統算法的實現。它的流程圖如下所示:
在這裏插入圖片描述
這裏框圖介紹了buffered_rmqueue的實現,從它的命名可以看出,它是帶有buffer功能的,爲什麼要這麼操作呢,我們知道夥伴系統這一套算法是有一定複雜度的,如果每次申請都要執行算法掃描一下系統中的內存,那麼將會比較耗時,所以加上per cpu高速緩存,當我們申請單個page時,優先從緩存中獲取,這樣就提升了效率,同時作爲per cpu的緩衝,也將提升CPU效率,因爲不用頻繁進行cache的切換,提升cache命中的概率。
free page是釋放page的接口,它的實現如下圖:
在這裏插入圖片描述
釋放過程是申請的逆過程,當釋放單個page時,優先釋放給per cpu高速緩衝區管理,如果高速緩存內的內存大小超出一個設定值,那麼高速緩存也會釋放一部分給到夥伴系統,而夥伴系統通過循環執行__free_one_page來釋放內存到對應的空閒free_area。

=============================================================

Buddy算法

在這裏插入圖片描述
在這裏插入圖片描述
buddy算法的具體內容可以查看Linux內存管理—buddy算法

=============================================================

連續內存分配器(CMA)

CMA,Contiguous Memory Allocator,是內存管理子系統中的一個模塊,負責物理地址連續的內存分配。一般系統會在啓動過程中,從整個memory中配置一段連續內存用於CMA,然後內核其他的模塊可以通過CMA的接口API進行連續內存的分配。CMA的核心並不是設計精巧的算法來管理地址連續的內存塊,實際上它的底層還是依賴內核夥伴系統這樣的內存管理機制,或者說CMA是處於需要連續內存塊的其他內核模塊(例如DMA mapping framework)和內存管理模塊之間的一箇中間層模塊,主要功能包括:
1、解析DTS或者命令行中的參數,確定CMA內存的區域,這樣的區域我們定義爲CMA area。
2、提供cma_alloc和cma_release兩個接口函數用於分配和釋放CMA pages
3、記錄和跟蹤CMA area中各個pages的狀態
4、調用夥伴系統接口,進行真正的內存分配。
CMA時平時將內存分配給應用層使用,當DMA申請連續內存時,則進行頁面拷貝,在內存中尋找空閒頁面,將DMA zone中應用層申請的頁拷貝至其它空閒頁,然後就可以整理出一片連續的物理內存。
可以查看蝸窩科技的CMA模塊學習筆記

發佈了6 篇原創文章 · 獲贊 1 · 訪問量 7736
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章