免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2504 | 回复: 6
打印 上一主题 下一主题

[交流]Slab的简单解释 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-12 22:21 |只看该作者 |倒序浏览
Slab allocator简解

如果把page allocator当成memory space的一级代理商,那么slab allocator就是二级代理商。由此,
用户想要"拿货"(申请内存),可以从一级代理商拿,也可以从二代拿,当然也可以从其他的代理商那里拿,
"退货"(释放内存)当然得到对应的代理商那里,同样C库的malloc内存分配也是个内存代理商(应该也是二级)。

上述的意思是说,对于内存的管理在不同的层级或区域提供了不同内存粒度的管理机制,对于使用者,则须根据
实际情况从特定的管理机制进行内存的申请和释放。

由于只是对slab做top level的了解,没有深入到具体的细节,只是了解到slab allocator的管理方式是怎么
组织管理的。这里对其主要的数据结构的组织做勾勒,其实也就是给出了slab的组织结构图,至于slab的全貌,
这里就不另辟"奇文"给大家了(能力有限,也辟不出来),还是多看看ULK等相关书中的章节比较好。
因为对于概念的描述,逻辑的表达,这些书籍(原版)毕竟是大师级典著,会更准确细致。只看一遍,我是觉得不好懂,
但是再多看却更觉得恰到好处,这样的书才真值。当然源码定是不可以偏废的。

管中窥豹,只见一斑,要是对各位有所帮助,那就皆大欢喜了。没有"奇文",大家也不要吝啬,疑义相与析。

Slab同page allocator交互(申请和归还)是以slab为单位的,一个slab是2的n次幂连续页。
拿到页内存后,就对其宰割了,作cache-object的管理,大抵有以下几个组织特征:
1)object是组织在slab中;
2)slab中的空闲的object是通过object控制区来记录空闲号做跟踪;
3)同一cache组内的object的大小是相同的,一个cache组可以有多个slab;
4)同一cache组内的slab是通过将slab描述符组织为链表;
5)不同的cache组则通过cache描述符组织为链表;

其他2个效率上的特征:
1)每一cpu的缓存数组及所有cpu的共享缓存;
2)为配合硬件上的高速缓存(cache line)做的着色区处理;

Ref:
M. Tim Jones.Anatomy of the Linux slab allocator(Linux slab 分配器剖析).
Jeff Bonwick .The Slab Allocator_An Object-Caching Kernel Memory Allocator(1994).
Daniel P. Bovet, Marco Cesati. Understanding the Linux Kernel 3rd,Section 8.2.

[ 本帖最后由 foonix 于 2009-9-14 14:11 编辑 ]

slab_scheme.pdf

141.62 KB, 下载次数: 113

论坛徽章:
0
2 [报告]
发表于 2009-09-13 10:03 |只看该作者
内存最终都是由伙伴系统管理的,slab也是向其所要页面来做小碎片的管理
slab分专用和通用两种。通过kmem_cache_create定义一种类型,然后通过kmem_cache_alloc申请的内存就是专用slab;而malloc使用的是通用slab,他申请出来的内存一定是2的n次字节,并且有上限和下限。

假设用kmalloc申请33个字节,那么他必定会去分配一个64字节的空间给你,也就是说浪费了31字节,而如果用kmem_cache_create定义了一个33字节的专用slab类型,再通过kmem_cache_alloc申请内存就不会出现浪费的现象了。

论坛徽章:
0
3 [报告]
发表于 2009-09-13 12:42 |只看该作者
比喻很是恰当

论坛徽章:
0
4 [报告]
发表于 2009-09-13 15:11 |只看该作者
恩,不错,真的希望坛子里这种总结性的自我感受的文章越来越多。
顶楼主。

论坛徽章:
0
5 [报告]
发表于 2009-09-13 17:30 |只看该作者
恩,我的表述是有些问题,不过页框分配器也是从伙伴系统中拿内存的哦,所以“最终”二字应该是准确的。

ULK我也认真看过一遍呢,这样的帖子确实很好,希望可以多讨论讨论。
timeboy 该用户已被删除
6 [报告]
发表于 2009-09-14 08:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2009-09-14 14:52 |只看该作者
原帖由 timeboy 于 2009-9-14 08:59 发表
malloc是从page allocator那分配内存的(缺页中断),一般用户层只是将brk加上要分配的内存大小而已

>>在GNU libc中的malloc包,brk指向堆空间的最大地址处,加大brk应是指堆空间的大小增加。用户层需要从堆中分配内存,
>>当前堆有足够内存分配,就不需要加大brk。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP