linux中slab与slub的实现区别

本文探讨了Linux内核中的Slab与Slub内存分配器实现,强调了Slub的简洁性以及其在测试和调试方面的优势。文章详细介绍了两者在对象缓存、CPU缓存管理和内存操作上的区别,如对象对齐、色彩着色和内存共享/释放机制。
摘要由CSDN通过智能技术生成

整体上slub的实现比slab更清爽,连带着方便测试和debug

(另:slob分配器因维护困难已从linux代码中删除)

slab 与 slub 实现对比
SLABSLUB
cpu_cache上缓存的对象以slab中的某个对象为单位,批发到cpu_cache上以整个slab为单位装入cpu_cache上
cpu_cache结构struct array_cache

struct kmem_cache_cpu

是否支持着色以cacheline的长度为偏移单位(

colour_off

),在将slab对齐到某个大小时,剩余的大小可以满足的cacheline的数量记为colour。每分配一个同类型的slab,就在对象的偏移上加(n%colour)×colour_off的偏移作为着色。
不支持(可能是认为没有意义)
cpu_cache上是否需要为不同node存一个结构需要不需要
alloc/free一个非本节点的slab分配的对象时的操作

alloc: 尝试从其它 node->shared 数组上划一部分对象装到自己的cpu_cache上。

free: 将非本node的对象放在 本node->alien 上,在flush时还回去

alloc: 直接从其它node分配整个slab

free: slab使用期间即使自己的node有了内存,也不会将slab还回去,要等到slab上对象全释放后才可能还回去

slab的轮转类型

三种:full, partial, free

存在kmem_cache_node上

两种:full, partial

存在存在kmem_cache_node上,另外

kmem_cache_cpu本身上存有freeze的slab(kmem_cache_cpu->partial)

slab管理结构

用一个数组来标记下一个free的节点在哪里,这个数组有三种可能的地方:

CFLGS_OBJFREELIST_SLAB:所有index的长度不到一个对象的长度,随机选一个对象的位置作为freeindex数组的位置

CFLGS_OFF_SLAB:额外分配内存作为free index数组,条件是剩余的大小不能装下整个free index数组

CFLGS_ON_SLAB:取 slab 的前面部分作为free index数组的位置

在个slab对象的后面装一个index。
 
从freelist上取对象的过程数组形式组织直接返回

array_cache->entry[--array_cache->avail]

由于freelist是类似链表的形式,无法保证原子性,可能需要多次尝试无锁地cas 操作(先取一个free object,再更新下一个free的index,cas查看是否更新成功)。
自举初始化过程初始化前后的分配过程写在一起set_up_node逻辑分开写更清晰
cache对象的清理有定时器触发(见:__initcall(cpucache_init))需要手工触发

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值