Linux Slub分配器(一)--概述
Slab分配器一直处于内核内存管理的核心地位,尽管如此,它还是拥有自身的缺点,最明显的两点就是复杂性和过多的管理数据造成的内存上的开销。针对这些问题,linux引入了slub分配器,slub分配器保留了slab分配器的所有接口,实际上slub分配器的模型和slab分配的模型是基本一致的,只不过在一些地方进行了精简,这也使得slub分配器工作起来更为游刃有余。两者主要的区别如下:
- slab分配器为了增加分配速度,引入了一些管理数组,如slab管理区中的kmem_bufctl数组和紧随本地CPU结构后面的用来跟踪最热空闲对象的数组,这些结构虽然加快了分配对象的速度,但也增加了一定的复杂性,而且随着系统变得庞大,其对内存的开销也越明显。而slub分配器则完全摒弃了这些管理数据,个人觉得这也是slub分配器最精髓的地方,至于slub分配器的具体做法是怎样的,后面再做分析;
- slab分配器针对每个缓存,根据slab的状态划分了3个链表--full,partial和free. slub分配器做了简化,去掉了free链表,对于空闲的slab,slub分配器选择直接将其释放;
- slub分配器摒弃了slab分配器中的着色概念,在slab分配器中,由于颜色的个数有限,因此着色也无法完全解决slab之间的缓存行冲突问题,考虑到着色造成了内存上的浪费,slub分配器没有引入着色;
- 在NUMA架构的支持上,slub分配器也较slab分配器做了简化。
下面来看slub分配器涉及到的主要数据结构
缓存描述结构:
节点的slab信息描述结构:
本地CPU的slab信息描述结构:
用下图可以描述这些slub分配器的核心数据结构之间的关系
至此已大概介绍了slub分配器的一些概念和涉及到的核心数据结构,具体的实现细节和原理在后面分析各个部分的代码时再做交代