Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145660
  • 博文数量: 38
  • 博客积分: 1315
  • 博客等级: 准尉
  • 技术积分: 850
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-06 16:19
文章分类

全部博文(38)

文章存档

2011年(38)

分类: LINUX

2011-04-22 16:47:36

    前面介绍了Slab分配器,通过代码分析,我们可以发现它有如下的不足:

1)        模型比较复杂。Slab三链、local cacheshared 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

阅读(4348) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~