當使用者態程序需要額外記憶體的時候,可以從核心所維護的空閒頁幀鍊錶中獲取頁,該鍊錶通常由頁替換演算法來更新,這些頁幀通常分散在物理記憶體當中,如果使用者只需要乙個位元組的記憶體,那麼會產生記憶體碎片,這是因為程序會得到整個頁幀
核心記憶體的分配通常是從空閒記憶體池中獲取的,而並不是從滿足普通使用者模式程序的記憶體鍊錶中獲取的,主要有兩個原因
linux原來使用的是buddy系統來分配核心記憶體的buddy系統從物理連續的大小固定的段上進行分配。記憶體按2的冪的大小來進行分配,就比如說4kb、8kb、16kb等。如果請求大小不為2的冪,那麼需要調整到下乙個更大的2的冪,就比如說請求大小為11kb,那麼就會按照16kb來請求,這樣的話就會造成空間的浪費
所以linux的核心版本從2.2開始使用slab分配器slab是乙個或多個物理上的連續的頁的組成的,每個核心資料結構都有乙個cache,比如說程序描述符、檔案物件、訊號量等,每個cache都含有核心資料結構的物件例項,就比如說訊號量cache儲存著訊號量物件,程序描述符cache存放著程序描述符物件,而每個cache都是由若干個slab組成的,而每個slab又分為若干個與物件大小相同的部分,所以當核心請求物件記憶體的時候,slab分配器可以返回剛好可以表示物件的所需的記憶體
當建立cache的時候,起初包含了若干標記為空閒的物件,物件的數量與slab的大小有關,開始,所有的物件都標記為空閒。當需要核心資料結構的物件時,可以從cache上直接獲取,並將該物件標記為使用
在linux系統當中,程序描述類的型別是struct_task_struct,其大小約為1.7kb。當linux核心建立新任務時,它會從cache中獲得struct task_struct物件所需要的記憶體。cache上會有已分配好的並標記為空閒的struct task_struct物件來滿足請求linux的slab可有三種狀態:
slab分配器首先從部分空閒的slab進行分配,如果沒有的話就從空的slab進行分配,如果沒有空的slab,那麼就從物理連續頁上分配新的slab,並且把它賦值給乙個cache,然後再從新的slab分配空間當核心請求物件記憶體的時候,slab分配器可以返回剛好表示物件的所需的記憶體,slab分配器對於經常需要不斷分配記憶體、釋放記憶體來說特別有效,因為物件預先建立,所以可以從cache上快速分配,另外,當用完物件釋放的時候,只需要標記為空閒並且返回給cache,以便下次呼叫
linux核心記憶體分配
核心中的記憶體分配通常通過kmalloc kfree來進行,但是也有其它的方式來獲取記憶體,所有這些方式共同提供了核心中分配 釋放記憶體的介面。類似於標準c中的malloc free,kmalloc kfree是核心中的用於常規記憶體分配的介面。kmalloc kfree是工作在slab分配器的基礎...
Linux核心記憶體分配
函式有 kmalloc get free page get free pages get free page vmalloc kmem cache kmem cache alloclinux記憶體分為3中,dma 可以直接訪問 normal memory,high memory 一般記憶體中,前16...
Linux核心記憶體分配機制
現象 1 壓力測試過程中,發現被測物件效能不夠理想,具體表現為 程序的系統態cpu消耗20,使用者態cpu消耗10,系統idle大約70 2 用ps o majflt,minflt c program命令檢視,發現majflt每秒增量為0,而minflt每秒增量大於10000。初步分析 majflt...