linux slab的含義 與 kmalloc的關係__linux

來源:互聯網
上載者:User

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分配模式的實現比較複雜,我們不準備對其進行詳細的分析,只對主要內容給予描述。




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.