在进程描述符的调度中,涉及到slab的原理,但从其根本上说其是一个内存的分配机制。
先试探其来源、发展的历史,然后从其功能、优点、缺点等作笼统性的概括,最后以一个linux的实例来分析它。
linux的slab机制从sun的sun os5.4继承过来和发展的。
linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色的目的。
分
配和释放数据结构是所有内核中最普遍的操作之一。为了便于数据的频繁分配和回收,编程者常常会用到一个空闲链表。该空闲链表包含可供使用的、已经分配好的
数据结构块。当代码需要一个新的数据结构实例时,就可以从空闲链表中抓去一个,而不需要分配内存、再把数据放进去。以后,当不再需要这个数据结构的实例
时,就把它放回空闲链表、而不是释放掉它。从这个意义上说,空闲链表相当于对象高速缓存以便快速存储频繁使用的对象类型。
在内核中,空闲
链表面临的主要问题之一就是不能全局控制。当内存变的紧缺时,内核无法通知每个空闲链表,让其收缩缓存大小以便释放出一些内存来。实际上,内核根本就不知
道存在任何空闲链表。为了弥补这一缺陷,也为了使代码更加稳固,linux内核提供了slab层。slab分配器扮演了通用数据结构缓存层的角色。
slab试图在几个基本原则之间寻求一种平衡:
频繁使用的数据结构也会频繁分配和释放,因此应当缓存它们。
频繁分配和回收必然会导致内存碎片。
回收的对象可以立即投入下一次分配。
如果让部分缓存专属于单个处理器,那么,分配和释放就可以在不加SMP锁的情况下进行。
对存放的对象进行着色,以防止多个对象映射到相同的高速缓存行。
1、不同的数据类型用不同的方法分配内存可能提高效率。比如需要初始化的数据结构,释放后可以暂存着,再分配时就不必初始化了
2、内核的函数常常重复地使用同一类型的内存区,缓存最近释放的对象可以加速分配和释放对内存的请求可以按照请求频率来分类,频繁使用的类型使用专门的缓存,很少使用的可以使用类似2.0中的取整到2的幂次的通用缓存
3、使用2的幂次大小的内存区域时高速缓存冲突的概率较大,有可能通过仔细安排内存区域的起始地址来减少高速缓存冲突缓存一定数量的对象可以减少对buddy系统的调用,从而节省时间并减少由此引起的高速缓存污染
Slab分配器把存储器区看作对象(object)
Slab分配器把对象按照类型分组成不同
每个Slab由一个或多个连续的页框组成,这些页框中包含已分配的对象,也包含空闲的对象
Slab分配器通过伙伴系统分配页框
阅读(3539) | 评论(0) | 转发(0) |