深入理解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分配器数据结构如下图所示:

clip_image002

  • 1
  • 2
  • 3
  • 4
  • 5
  • 下一页

相关内容