@CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~
Author: WenHui, WuHan University,2012-5-12
Version:v1.0
Last Modified Time: 2012-5-20
SLOB(Simple List Of Blocks)分配器,是一個在SLAB分配器類層之中的傳統K&R/UNIX堆分配器。它比LINUX原slab分配器代碼更小短小,且更有效率。但它比SLAB更容易產生內存碎片問題,僅應用於小系統,特別是嵌入式系統。
SLOB分配器總共只有三條半滿空閒鏈(partial free list),free_slab_large、free_slab_medium和free_slab_small。每條鏈都由已被分配給SLOB的page元素構成。free_slab_small鏈只分配小於256字節的塊,free_slab_medium只分配小於1024字節的塊,而free_slab_large只分配小於PAGE_SIZE的塊。
若通過SLOB分配器分配大於一頁的對象,則SLOB分配器直接調用zone mem allocator (alloc_pages)分配連續頁(compound pages)並返回。並修改相應首page結構體的flags字段,private字段中保存該塊大小。
由於SLOB分配器需要重用page結構體中SLAB相關字段,為避免不必要的混淆,SLOB利用C語言union結構體特性將page重新封裝成slab_page。在slab_page中,幾個關鍵字段含義如下:
slobidx_t _units
在slob page中剩余空閒單元數。此處unit,等同於 slobidx_t、slob_block(其大小視PAGE_SIZE而定,當PAGE_SIZE=4KB時,為16bits)。SLOB將一頁內存劃分成slobidx_t個大小的單元。
slob_t *free
SLOB分配器將slob page內存中的空閒塊按線性地址升序方式組織成空閒塊鏈,由page中free字段指向鏈首元素。
list_head list
在空閒slob page鏈表中指向下一個slob page
SLOB分配器數據結構如下圖所示: