Linux內存管理---內存分配函數的選擇

內存分配函數的選擇

 

如果你需要連續的物理頁,就可以使用某個低級頁分配器或者kmalloc()。這是內核中內存分配的常用方式,也是大多數情況下你自己應該使用的內存分配方式。傳遞給這些函數最常用的兩個標誌是GFP_AUTOMICGFP_KERNELGFP_AUTOMIC表示進行不睡眠的高優先級分配。這是中斷程序和其他不能睡眠的代碼段的需要。對於可以睡眠的代碼,比如沒有持自旋鎖的進程上下文代碼,則應該使用GFP_KERNEL獲取所需內存。這個標誌表示,如果有必要,分配時可以睡眠。

 

如果想從高端內存進行分配,就使用alloc_pages()alloc_pages()函數返回一個指向struct page結構的指針,而不是指向某個邏輯地址的指針。因爲高端內存很有可能並沒有被映射,因此訪問它的唯一方式是通過相應的struct page結構。爲了獲得真正的指針,應噶調用kmap(),把高端內存映射到內核的邏輯地址空間。

 

如果你不需要物理上連續的頁,而僅僅需要虛擬地址上連續的頁, 那麼就使用vmalloc()(不過要記住vmalloc()相對kmalloc()有一定的性能損失)vmalloc()分配的內存虛擬地址式是連續的,但它本身並不能保證物理上的連續。這與用戶空間的分配非常類似,它也是把物理內存塊映射到連續的邏輯地址空間上。

 

如果你要創建和銷燬很多較大的數據結構,那麼應該考慮建立slab高速緩存。Slab層會給每個處理器維持一個對象高速緩存(空閒鏈表),這種高速緩存會極大的提高對象分配和回收的性能。Slab層不是頻繁地分配和釋放內存,而是爲你把事先分配好的對象存放到高速緩存中,當你需要一塊新的內存來存放數據結構時,slab層一般無需另外去分配內存,而只需從高速緩存中得到一個對象就可以了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章