『阿男的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