歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

深入理解Linux內核之SLOB分配器

@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概述

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分配器數據結構如下圖所示:

Copyright © Linux教程網 All Rights Reserved