使用者/核心
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大小的區域用於專用頁面對映)。
核下記憶體
分配函式kmalloc、kzalloc、vmalloc的使用與區別
linux記憶體管理之記憶體分配函式區別
使用者 核心 api名稱 物理連續?大小限制 單位場景 使用者空間 malloc calloc realloc free 不保證堆申請 位元組calloc初始化為0 realloc改變記憶體大小。alloca 棧申請位元組 向棧申請記憶體 mmap munmap 將檔案利用虛擬記憶體技術對映到記憶體...
Linux程式設計C 記憶體管理之記憶體分配詳解
程式設計師們經常編寫記憶體管理程式,往往提心吊膽。如果不想觸雷,唯一的解決辦法就是發現所有潛伏的地雷並且排除它們,躲是躲不了的。本文的內容比一般教科書的要深入得多,讀者需細心閱讀,做到真正地通曉記憶體管理。記憶體分配方式 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好...
Linux程式設計C 記憶體管理之記憶體分配詳解
程式設計師們經常編寫記憶體管理程式,往往提心吊膽。如果不想觸雷,唯一的解決辦法就是發現所有潛伏的地雷並且排除它們,躲是躲不了的。本文的內容比一般教科書的要深入得多,讀者需細心閱讀,做到真正地通曉記憶體管理。記憶體分配方式 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好...