slab字面意思是被分割的厚板/石板,類似與buddy演算法的含義(頁可以按照2的次冪組織成一個元素,也可以分離,就像小夥伴一樣,buddy演算法因“時聚時散”這個表現而得名);slab的含義就是把大塊的空間,分解為小塊的空間。slab具體的特性是它包含不同的對象,就像書架一樣,同一類型的對象就放在什麼同一類型的slab(書架)裡,因為一個slab可能裝不下所有的對象,所以有些物件類型會有多個slab。slab並不是一開始就有的演算法,它的出現是為了最佳化buddy演算法,buddy演算法以頁(4096位元組)為單位,進行管理,即使很小的資料修改,也會動用4096位元組,花銷大,而且資料這一塊,那一塊,不好管理。
所以,buddy系統就像一個大的書架,slab就像書架的格子一樣。書架用於管理一個專業領域的書,如C語言/C++/JAVA/C#,而格子用於管理一個小類,C語言放在一個slab,C++放入一個slab....。而組成slab的“對象”就是具體的書本,如《C專家編程》,《C語言陷阱》等就是C語言這個slab 的對象。
因為記憶體初始化的時間比分配和釋放時間長好多,slab增加一個類似對象池的特性,slab會緩衝已經被“釋放”的對象,以便下次重用,不必再初始化。對象用該快取結構kmem_cache描述。通過kmem_cache_create建立。雖然名為快取,但是它不是硬體上的快取,它只是主存上的地區,但是和硬體上的快取高度相關。
注意核心分配記憶體的函數kmalloc使用了__do_kmalloc,這個函數先按照size,找到一個kmem_cache,然後從kmem_cache中分配記憶體對象。這說明,kmalloc是通過快取的大小來構建一個通用記憶體 Clerk的。用cat /proc/slabinfo命令可以查看到kmem_cache的情況,kmalloc會使用kmem_cache_init(預先初始化cache)初始化出來的cache,這個cache是按照size初始化(見紅色字型),而不是按照類型初始化的。可見,kmem_cache既會按類型分,也會按size分。如果你調用函數kmalloc(50,GFP_KERNEL),記憶體開銷是64位元組,同理33-64都是一樣的開銷:64位元組,知道這個有利於在核心開發時最佳化記憶體。
task_struct 356 380 5872 5 8 : tunables 0 0 0 : slabdata 76 76 0
anon_vma 6185 6400 32 128 1 : tunables 0 0 0 : slabdata 50 50 0
shared_policy_node 340 340 48 85 1 : tunables 0 0 0 : slabdata 4 4 0
numa_policy 680 680 24 170 1 : tunables 0 0 0 : slabdata 4 4 0
idr_layer_cache 690 690 544 30 4 : tunables 0 0 0 : slabdata 23 23 0
kmalloc-8192 50 56 8192 4 8 : tunables 0 0 0 : slabdata 14 14 0
kmalloc-4096 139 144 4096 8 8 : tunables 0 0 0 : slabdata 18 18 0
kmalloc-2048 331 352 2048 16 8 : tunables 0 0 0 : slabdata 22 22 0
kmalloc-1024 1339 1376 1024 32 8 : tunables 0 0 0 : slabdata 43 43 0
kmalloc-512 5574 5632 512 32 4 : tunables 0 0 0 : slabdata 176 176 0
kmalloc-256 8141 8864 256 32 2 : tunables 0 0 0 : slabdata 277 277 0
kmalloc-128 844 896 128 32 1 : tunables 0 0 0 : slabdata 28 28 0
kmalloc-64 4820 5440 64 64 1 : tunables 0 0 0 : slabdata 85 85 0
kmalloc-32 4087 4480 32 128 1 : tunables 0 0 0 : slabdata 35 35 0
kmalloc-16 11411 11776 16 256 1 : tunables 0 0 0 : slabdata 46 46 0
kmalloc-8 6078 6144 8 512 1 : tunables 0 0 0 : slabdata 12 12 0
kmalloc-192 3961 4389 192 21 1 : tunables 0 0 0 : slabdata 209 209 0
kmalloc-96 735 756 96 42 1 : tunables 0 0 0 : slabdata 18 18 0
kmem_cache_node 0 0 64 64 1 : tunables 0 0 0 : slabdata 0 0 0
詳細解釋參考
http://oss.org.cn/kernel-book/ch06/6.3.3.htm
Slab分配模式把對象分組放進緩衝區(儘管英文中使用了Cache這個詞,但實際上指的是記憶體中的地區,而不是指硬體快取)。因為緩衝區的組織和管理與硬體快取的命中率密切相關,因此,Slab緩衝區並非由各個對象直接構成,而是由一連串的“大塊(Slab)”構成,而每個大塊中則包含了若干個同種類型的對象,這些對象或已被分配,或空閑,如圖6.12所示。一般而言,對象分兩種,一種是大對象,一種是小對象。所謂小對象,是指在一個頁面中可以容納下好幾個對象的那種。例如,一個inode結構大約佔300多個位元組,因此,一個頁面中可以容納8個以上的inode結構,因此,inode結構就為小對象。Linux核心中把小於512位元組的對象叫做小對象。
圖6.10 Slab的組成
實際上,緩衝區就是主存中的一片地區,把這片地區劃分為多個塊,每塊就是一個Slab,每個Slab由一個或多個頁面組成,每個Slab中存放的就是對象。
因為Slab分配模式的實現比較複雜,我們不準備對其進行詳細的分析,只對主要內容給予描述。