日期:2014-05-16  浏览次数:20678 次

Linux Slub分配器(二)--初始化

       和slab分配器一样,分配器的初始化工作主要是初始化用于kmalloc的gerneral cache,Slub分配器的gerneral cache定义如下:


SLUB_PAGE_SHIFT的值为14,也就是说Slub分配器拥有14个gerneral cache,这14个gerneral cache的作用分别是什么呢?在NUMA架构下,下标为0的gc是用来存节点slab信息描述符的,也就是struct kmem_cache_node,UMA架构下,下标为0的gc被废弃。然后从下标为3的gc开始,缓存的对象大小从KMALLOC_MIN_SIZE开始按2的指数幂增长。那么下标为1和2的gc是用来做什么的呢?这两个gc是用来增加缓存的粒度的,下标为1的gc对应的缓存大小为96,下标为2的gc对应的缓存大小为192。当用kmalloc分配192字节以下的对象时,size_index数组用来选择在哪个gc中进行分配。


size_index数组中存储的是gc的编号,要根据对象大小来定位gc的方法很简单,直接用size/8 - 1即可。如要分配大小为48的对象,那么48/8 - 1=5,而size_index数组中下标5对应的偏移为6,在kmalloc_caches数组中,下标6对应的gc的对象大小为64,因此就找到了一个合理的gc,当然,以上的讨论都是基于KMALLOC_MIN_SIZES为8的情况下的。那么可想而知,gc的初始化工作主要就是创建gc以及建立size_index数组到gc之间的映射。