Slub 分配器 -- Linux 内核对 Slab 的优化

1996 年在 Linux 2.0 版本中引入了 slab allocator 之后, 逐渐暴露出一些问题. 因此在 2.6.22 版本对原有的算法进行了简化, 得到 Slub.

  • 深入理解 Linux 内存管理(八)slab,slob 和 slub 介绍
  1. 每个 node 节点有三个链表,分别记录空闲 slab、部分空闲 slab 和非空闲 slab。当回收操作来不及时,三个链表记录的页框会较长时间停留到 slab 管理器中,不利于提高内存的使用率。针对这点,slub 只保留了一个链表,就是部分空闲 slub。
  2. 每个 cpu 私有数据记录的是 object 的地址,这些 object 可能来自不同的 slab,那么不利于 slab 的回收。slub 改成记录一个实际可用的 slub,不会影响其他 slub 的回收。
  3. shared 共享链表可能导致一个 slab 持有较多 slab,无法即使释放给伙伴系统。slub 去掉了该链表。可见,slub 出现的主要目的是为了减少 slab 的数量,提高内存的使用率。同时,出于对内存使用率的极致追求,slub 去除了 slab 的着色做法,取而代之是 slub 复用,通过 slub 复用减轻 cache 冲突的情况。