是时候该写下一些东西了,虽然接触的时间不长,可帮助别人讲解有助于理清思路,并且把好的东西拿出来与人分享也是一件愉快的事,我写的东西彻底不一样于书本,引文都是个人理解和感觉不会照书抄,写的不对的地方但愿有人指点,固步自封是对技术进步的最大阻力。缓存
分析slab 源码也有几天了,更深层次的东西我还摸不出来,但一些框架和思想我却有了本身的理解。长话短说,这不是一篇介绍源码的博文,只是一些思想,有助于你在看书时理清思路,避免被书中的繁琐的步骤搞晕。框架
在多cpu系统里,若是多个cpu 对一块高速缓存争用是件很麻烦的事情,要不停得上锁释放锁,还要排队,很浪费时间,所以一块缓冲区中划分了多个小的区域,每个区域属于一个cpu全部——本地高速缓存。并且还单独划分一个区域,全部cpu能够共享的区域,叫作共享本地高速缓存。并且把每一个cpu 所属的高速缓存中的三种中slab(free ,partial_free,full)连接起来,造成3个链表。对象
当分配器接到分配对象的请求时,先从本地高速缓存分配对象,若是本地高速缓存空闲对象为0,那么就要从共享本地高速缓存中分配,若是这个缓存空闲对象仍是为0,那么就要从partial_full 和free 链表中查找空闲对象,若是不存在这样的链表,就要利用伙伴系统从内存中分配若干页框,建立一个slab ,而后分配对象。内存
当分配器接收到释放对象的请求时,要遵循原则——属于哪一个slab 的对象就归还给哪一个slab 。因此在归还时要选择归还在本地缓存的slab中,若是空闲对象已达到上限,那么就要腾空batchconut 个对象给共享本地高速缓存,达到能够把对象归还到本地缓存中的目的 ,若是共享本地高速缓存空闲对象也达到上限,那么就要把一些slab从本地缓存中拿走(多是一个,多是多个。)归还给分配器,分配器如何对待,要看具体状况。若是释放了batchcount 个对象后:源码
整个slab 中全部对象都空闲,并且cachep->list.free_bojects > cachep_free_limit 就销毁这个slab ,把页框归还给内存。it
整个slab 中全部对象都空闲,可是cachep->list.free_bojects < cachep_free_limit 就把该slab 加入到cachep->lists.slabs_free中,请求
整个slab 中有一些对象被使用,那么就加入到cache->lists.slabs_partial链表中。im
有人可能会疑惑,此时slab 属于哪一个缓存,我也不知道,只知道被加入了slab 分配器管辖的链表中。技术
在slab 分配器内请求和释放的层次:链表
请求:本地高速缓存——共享本地高速缓存————slab分配器(slab分配器主管3个链表)——伙伴系统分配页框
释放:本地高速缓存——腾空batchcount个空闲对象(不成功)————slab分配器
下面这张图对于分配和释放过程描述的已经很详尽了,毕竟我不能把全部东西都讲出来,由于你们不是小学生,有些东西要靠本身动脑去思考