『阿男的Linux內核世界』*Kernel的動態內存管理Slab Allocator*

『阿男的Linux內核世界』*Kernel的動態內存管理Slab Allocator*bash

Linux Kernel有本身的動態內存管理機制,叫作Slab Allocator,它能夠預先把計算機的實際內存空間給劃分紅固定大小的區塊,而後把這些區塊分配給請求內存的各個Process使用。less

咱們能夠經過/proc/slabinfo來看到Kernel此時把內存劃分的區塊:函數

$ sudo cat /proc/slabinfo | less

執行上面代碼獲得結果以下:code

輸入圖片說明

圖片可能看不清楚,簡單摘抄幾行輸出:圖片

slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
nf_conntrack_ffff8800aa860000      0      0    320   51    4 : tunables    0    0    0 : slabdata      0      0      0
buffer_head       412100 459966    104   39    1 : tunables    0    0    0 : slabdata  11794  11794      0
vm_area_struct     20267  20680    184   44    2 : tunables    0    0    0 : slabdata    470    470      0
files_cache          230    230    704   46    8 : tunables    0    0    0 : slabdata      5      5      0
signal_cache         570    570   1088   30    8 : tunables    0    0    0 : slabdata     19     19      0
sighand_cache        312    345   2112   15    8 : tunables    0    0    0 : slabdata     23     23      0
task_struct          364    384   7552    4    8 : tunables    0    0    0 : slabdata     96     96      0

咱們看內存劃分的標題:內存

# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>

能夠看到Kernel把內存劃分紅不一樣的用途,用name來區分,而後是active_objs,從名字應該能夠看出就是正在活躍的區塊,就是已經被請求走,在使用的區塊。num_objs應該就是Kernel已經劃分好的區塊總數。objsize就是這個類型的區塊的塊大小。每種類型的數據可能須要的內存基本單元大小不一樣,所以objsize適合不一樣的內存需求。get

咱們在使用標準C庫提供給咱們的malloc函數請求內存的時候,實際上User Space的malloc封裝的事kmalloc這個Kernel函數,kmalloc最終調用kmem_getpages來從Slab Allocator的內存區塊池裏取得內存。it

相關文章
相關標籤/搜索