对于slab对象分配和释放的理解

是时候该写下一些东西了,虽然接触的时间不长,可帮助别人讲解有助于理清思路,而且把好的东西拿出来与人分享也是一件愉快的事,我写的东西完全不同于书本,引文都是我的理解和感受不会照书抄,写的不对的地方希望有人指点,固步自封是对技术进步的最大阻力。

分析slab 源码也有几天了,更深层次的东西我还摸不出来,但一些框架和思想我却有了自己的理解。长话短说,这不是一篇介绍源码的博文,只是一些思想,有助于你在看书时理清思路,避免被书中的繁琐的步骤搞晕。

在多cpu系统里,如果多个cpu 对一块高速缓存争用是件很麻烦的事情,要不停得上锁释放锁,还要排队,很浪费时间,因此一块缓冲区中划分了多个小的区域,每一个区域属于一个cpu所有——本地高速缓存。而且还单独划分一个区域,所有cpu可以共享的区域,叫做共享本地高速缓存。而且把每个cpu 所属的高速缓存中的三种中slab(free ,partial_free,full)链接起来,形成3个链表。

当分配器接到分配对象的请求时,先从本地高速缓存分配对象,如果本地高速缓存空闲对象为0,那么就要从共享本地高速缓存中分配,如果这个缓存空闲对象还是为0,那么就要从partial_full 和free 链表中查找空闲对象,如果不存在这样的链表,就要利用伙伴系统从内存中分配若干页框,创建一个slab ,然后分配对象。

 

当分配器接收到释放对象的请求时,要遵循原则——属于哪个slab 的对象就归还给哪个slab 。所以在归还时要选择归还在本地缓存的slab中,如果空闲对象已达到上限,那么就要腾空batchconut 个对象给共享本地高速缓存,达到可以把对象归还到本地缓存中的目的 ,如果共享本地高速缓存空闲对象也达到上限,那么就要把一些slab从本地缓存中拿走(可能是一个,可能是多个。)归还给分配器,分配器如何对待,要看具体情况。如果释放了batchcount 个对象后:

  1. 整个slab 中所有对象都空闲,而且cachep->list.free_bojects > cachep_free_limit 就销毁这个slab ,把页框归还给内存。

  2. 整个slab 中所有对象都空闲,但是cachep->list.free_bojects < cachep_free_limit 就把该slab 加入到cachep->lists.slabs_free中,

  3. 整个slab 中有一些对象被使用,那么就加入到cache->lists.slabs_partial链表中。

有人可能会疑惑,此时slab 属于哪个缓存,我也不知道,只知道被加入了slab 分配器管辖的链表中。

在slab 分配器内请求和释放的层次:

请求:本地高速缓存——共享本地高速缓存————slab分配器(slab分配器主管3个链表)——伙伴系统分配页框

释放:本地高速缓存——腾空batchcount个空闲对象(不成功)————slab分配器

下面这张图对于分配和释放过程描述的已经很详尽了,毕竟我不能把所有东西都讲出来,因为大家不是小学生,有些东西要靠自己动脑去思考

130043_oy14_1375613.png

转载于:https://my.oschina.net/u/1375613/blog/475115

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值