免费注册 查看新帖 |

Chinaunix

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

Slab 分配器详解 【总结转帖】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-14 23:54 |只看该作者 |倒序浏览

                一、内存管理的目标
用最小的时间开销换最大的可用内存资源。
当然两个目标本身是矛盾的。时间与空间永远是敌人。
二、堆分配的利弊
这种基于堆的分配策略的根本问题是碎片(fragmentation)。当内存块被分配后,它们会以不同的顺序在不同的时间返回。这样会在堆中留下一些洞,需要花一些时间才能有效地管理空闲内存。这种算法通常具有较高的内存使用效率(分配需要的内存),但是却需要花费更多时间来对堆进行管理。
三、SLAB机制
Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff
的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分配大量内存。Jeff
发现对内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间。因此他的结论是不应该将内存释放回一个全局的内存池,而是将内存保持为针
对特定目而初始化的状态。例如,如果内存被分配给了一个互斥锁,那么只需在为互斥锁首次分配内存时执行一次互斥锁初始化函数(mutex_init)即可。后续的内存分配不需要执行这个初始化函数,因为从上次释放和调用析构之后,它已经处于所需的状态中了。
            
Linux slab 分配器使用了这种思想和其他一些思想来构建一个在空间和时间上都具有高效性的内存分配器。
链接路径:
kmcache --->  slabs_full(empty,partial) --->slab -->page --->object
slab 列表中的每个 slab 都是一个连续的内存块(一个或多个连续页),它们被划分成一个个对象。这些对象是从特定缓存中进行分配和释放的基本元素。
slabs_full,slabs_partial,slabs_empty是用来组织不同空间占用量的slab结构,提高查找速度的。
四、slab机制的优点
首先,内核通常依赖于对小对象的分配,它们会在系统生命周期内进行无数次分配。slab
缓存分配器通过对类似大小的对象进行缓存而提供这种功能,从而避免了常见的碎片问题。slab
分配器还支持通用对象的初始化,从而避免了为同一目而对一个对象重复进行初始化。最后,slab
分配器还可以支持硬件缓存对齐和着色,这允许不同缓存中的对象占用相同的缓存行,从而提高缓存的利用率并获得更好的性能。
五、SLAB的API及应用
创建slab结构:
struct struct kmem_cache *my_cachep;
分配slab:
struct kmem_cache *
kmem_cache_create( const char *name, size_t size, size_t align,
                       unsigned long flags;
                       void (*ctor)(void*, struct kmem_cache *, unsigned long));
name 参数定义了缓存名称,proc 文件系统(在 /proc/slabinfo 中)使用它标识这个缓存。
        size 参数指定了为这个缓存创建的对象的大小, align 参数定义了每个对象必需的对齐。
从一个命名的缓存中分配一个对象:
void kmem_cache_alloc( struct kmem_cache *cachep, gfp_t flags );
void *kmalloc( size_t size, int flags );
void kfree( const void *objp );
在 kmalloc 中,惟一两个参数是要分配的对象的大小和一组标志。但是 kmalloc 和 kfree 使用了类似于前面
定义的函数的 slab 缓存。kmalloc 没有为要从中分配对象的某个 slab 缓存命名,而是循环遍历可用缓存来查
找可以满足大小限制的缓存。找到之后,就(使用__kmem_cache_alloc)分配一个对象。要使用 kfree 释放对
象,从中分配对象的缓存可以通过调用 virt_to_cache 确定。这个函数会返回一个缓存引用,然后在
__cache_free 调用中使用该引用释放对象。void kfree( const void *objp );
flags 参数指定了为缓存启用的选项。
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/23052/showart_321644.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP