5.5 slab分配器小结

通过阅读上面章节的代码, 我们知道slab系统由slab描述符、slab节点、本地对象缓冲池、共享对象缓冲池、3个slab链表、n个slab,以及众多slab缓存对象组成。如下图:

    那么每个slab由多少个页面组成呢?每个slab由一个或者n个page连续页面组成,是一个连续物理空间。创建slab描述符时会计算一个slab究竟需要占用多少个page页面,即2^gfporder,一个slab里可以有多少个slab对象,以及有多少个cache着色,可以参考上一节的最后一幅图。

    slab需要的物理内存在什么时候分配呢?在创建slab描述符时,不会立即分配2^gfporder个页面,要等到分配slab对象时,发现本地缓冲池和共享缓冲池都是空的,然后查询3大链表中也没有空闲对象,那么只好分配一个slab了。这时才会分配2^gfporder个页面,并且把这个slab挂入slabs_free链表中,

    如果一个slab描述符中有很多空闲对象,那么系统是否要回收一些空闲的缓存对象从而释放内存归还系统呢?这个是必须要考虑的问题,否则系统有大量的slab描述符,每个slab描述符还有大量不用的、空闲的slab对象,这怎么行呢?slab系统有两种方式来回收内存。

  1. 使用kmem_cache_free释放一个对象,当发现本地和共享对象缓冲池中的空闲对象数目ac->avail大于缓冲池的极限值ac->limit时,系统会主动释放bacthcount个对象。当系统所有空闲对象数目大于系统空闲对象数目极限值,并且这个slab没有活跃对象时,那么系统就会销毁这个slab,从而回收内存。

  2. slab系统还注册了一个定时器,定时去扫描所有的slab描述符,回收一部分空闲对象,达到条件的slab也会被销毁,实现函数在cache_reap().

    为什么slab要有一个cache colour着色区?cache colour着色区让每一个slab对应大小不同的cache行,着色区大小的计算为colour_next*colour_off,其中colour_next从0到这个slab描述符中计算出来的colour最大值,colour_off为L1 cache的cache行大小。这样可以使不同slab上同一个相对位置slab对象的起始地址在slab高速缓存中相互错开,有利于改善高速缓存的效率。

    另外一个利用cache的场景是Per-CPU类型的本地对象缓冲池。slab分配器的一个重要目的是提升硬件和cache的使用效率。使用Per-CPU类型的本地对象缓冲池有如下两个好处。

  • 让一个对象尽可能地运行在同一个CPU上,可以让对象尽可能地使用同一个CPU的cache,有助于提升性能。

  • 访问Per-CPU类型的本地对象缓冲池不需要获取额外的自旋锁,因为不会有另外的CPU来访问这些Per-CPU类型的对象缓存池,避免自旋锁的争用。

尽管slab分配器在很多工作负荷下都工作良好,但在一些情况下也无法提供最优的性能,例如微小嵌入式系统或者有大量物理内存的超级计算机。在大内存的超级计算机中,slab系统所需要的元数据占用好几个GB的内存,对于微小嵌入式系统,slab的代码量和复杂性也很高。因此linux内核中提供了另外两种替代品,slob和slub。slob适合微小嵌入式系统,slub分配器在大型系统中能提供比slab更好的性能。

slab工具:

slabtop工具,可以显示每个仓库占用的字节数

怀疑slab吃掉很多内存?用nmon工具看看

使用slub_debug进行内存泄漏检测

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byd yes

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值