linux記憶體管理之記憶體分配函式區別

2021-09-28 11:31:59 字數 1909 閱讀 8959

使用者/核心

api名稱

物理連續?

大小限制

單位場景

使用者空間

malloc/calloc/realloc/free

不保證堆申請

位元組calloc初始化為0;realloc改變記憶體大小。

alloca

棧申請位元組

向棧申請記憶體

mmap/munmap

將檔案利用虛擬記憶體技術對映到記憶體中去。

brk、sbrk

虛擬記憶體到記憶體的對映。sbrk(0)返回program break位址,sbrk調整對的大小。核心

空間    

vmalloc/vfree

虛擬連續

物理不定

vmalloc區大小限制

頁vmalloc區域

可能睡眠,不能從中斷上下文中呼叫,或其他不允許阻塞情況下呼叫。

vmalloc區域vmalloc_start~vmalloc_end之間,vmalloc比kmalloc慢,適用於分配大記憶體。

slab

kmalloc/kcalloc/krealloc/kfree

物理連續

64b-4mb

(隨slab而變)

2^order位元組

normal區域

大小有限,不如vmalloc/malloc大。

最大/小值由kmalloc_min_size/kmalloc_shift_max,對應64b/4mb。

從/proc/slabinfo中的kmalloc-***x中分配,建立在kmem_cache_create基礎之上。

kmem_cache_create

物理連續

64b-4mb

位元組大小,需對齊

normal區域

便於固定大小資料的頻繁分配和釋放,分配時從快取池中獲取位址,釋放時也不一定真正釋放記憶體。通過slab進行管理。

夥伴系統 

__get_free_page/__get_free_pages

物理連續

4mb(1024頁)

頁normal區域

__get_free_pages基於alloc_pages,申請的大小是一整頁,但是限定不能使用highmem。和kmalloc最終呼叫實現是相同的,只不過在呼叫最終函式時所傳的flag不同

alloc_page/alloc_pages/free_pages

物理連續

4mb 

頁normal/vmalloc都可 

config_force_max_zoneorder定義了最大頁面數2^11,一次能分配到的最大頁面數是1024。

關於kmalloc等實現可以通過網路查詢。

linux記憶體分布如下:

對於提供了mmu(儲存管理器,輔助作業系統進行記憶體管理,提供虛實位址轉換等硬體支援)的處理器而言,linux提供了複雜的儲存管理系統,使得程序所能訪問的記憶體達到4gb。

程序的4gb記憶體空間被人為的分為兩個部分--使用者空間與核心空間。使用者空間位址分布從0到3gb(page_offset,在0x86中它等於0xc0000000),3gb到4gb為核心空間。

核心空間中,從3g到vmalloc_start這段位址是物理記憶體對映區域(該區域中包含了核心映象、物理頁框表mem_map等等),比如我們使用 的 vmware虛擬系統記憶體是160m,那麼3g~3g+160m這片記憶體就應該對映物理記憶體。在物理記憶體對映區之後,就是vmalloc區域。對於 160m的系統而言,vmalloc_start位置應在3g+160m附近(在物理記憶體對映區與vmalloc_start期間還存在乙個8m的gap 來防止躍界),vmalloc_end的位置接近4g(最後位置系統會保留一片128k大小的區域用於專用頁面對映)。

linux記憶體管理之記憶體分配函式區別

使用者 核心 api名稱 物理連續?大小限制 單位場景 使用者空間 malloc calloc realloc free 不保證堆申請 位元組calloc初始化為0 realloc改變記憶體大小。alloca 棧申請位元組 向棧申請記憶體 mmap munmap 將檔案利用虛擬記憶體技術對映到記憶體...

Linux程式設計C 記憶體管理之記憶體分配詳解

程式設計師們經常編寫記憶體管理程式,往往提心吊膽。如果不想觸雷,唯一的解決辦法就是發現所有潛伏的地雷並且排除它們,躲是躲不了的。本文的內容比一般教科書的要深入得多,讀者需細心閱讀,做到真正地通曉記憶體管理。記憶體分配方式 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好...

Linux程式設計C 記憶體管理之記憶體分配詳解

程式設計師們經常編寫記憶體管理程式,往往提心吊膽。如果不想觸雷,唯一的解決辦法就是發現所有潛伏的地雷並且排除它們,躲是躲不了的。本文的內容比一般教科書的要深入得多,讀者需細心閱讀,做到真正地通曉記憶體管理。記憶體分配方式 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好...