分类: LINUX
2014-07-11 15:58:07
原文地址:Vi Linux内存 之 Slub分配器(一) 作者:palals
前面介绍了Slab分配器,通过代码分析,我们可以发现它有如下的不足:
1) 模型比较复杂。Slab三链、local cache、shared cache、内置式/外置式slab等。
2) 空间浪费严重。Slab管理对象和染色都浪费了大量宝贵的存储空间。
3) 对NUMA的支持、内存回收、性能调优等都非常复杂。
为了解决上述问题,2.6.22版本的内核引入了slub分配器。由于slub是对slab的改进,保留了slab的基本思想,所以建议先看slab,再看slub,这样更能体会slub的精妙之处。
Slub保留了slab对象块的思想,但是模型大大简化,精简了不必要的数据结构。如图所示:
Slab块的内部组织如图所示:
与slab模型做对比,可见最直观的区别是:
1) Slub只有两条slab链:部分满slab链和满slab链。实际上满slab链只用于调试,仅需要一条部分满slab链即可实现slub的功能。因为slab满了以后,分配对象时涉及不到,释放对象时,通过对象地址可得到slab首页地址,释放后加入部分满slab链,也就不再需要链表来维护满slab了。
2) 去掉了shared cache。
3) Local cache通过一个local slab来实现,slab模型中是从slab三链中提取空闲对象的地址到local cache队列中,而slub模型是提取整个slab块作为local slab,大大简化了管理维护工作。
4) 去掉了slab管理对象,也就无所谓内置/外置式slab了。
5) 去掉了着色区。因为现在的cache越来越大,通过改进算法可以使连续的冲突很少发生。此外,去掉着色区可以节省大量的空间。而且分析slab时提到,着色也不能完全解决冲突问题,所以干脆去掉。
除了上述几点,当然还有很多其他的改进,比如cache复用等。下面就通过代码深入认知slub。