一、概述
伙伴系统最大限度地解决了内存管理地外碎片问题,但是对于内碎片问题却无能为力。但内核实际使用内存的时候,却大多是小于一个页的单位。为了解决内核自身使用小块内存的碎片问题,Linux引入了基于对象的内存管理(或者叫内存区管理,Memory Area Management),就是SLAB系统算法(比如传统的SLAB、适用于嵌入式的SLOB、适用于大规模系统的SLUB,这里主要介绍SLUB)。一个对象(内存区)是一个具有任意大小的以字节为单位的连续内存块。基于对象的内存管理还有一个好处,就是尽量减少直接调用伙伴系统的API,因而对硬件高速缓存更加友好。
SLAB/SULB是建立在伙伴系统(页面分配器)的基础上的,其的组织结构可以分为三层:对象Object,slab(因为对象有不同的类型所以slab也有不同的类型),快速缓存(Cache,这里的快速缓存是一个纯软件的概念与CPU的硬件高速缓存完全不同。快速缓存也具有不同的类型,所有不同类型的快速缓存组织在一个名为slab_caches的双向链表中)。

与伙伴系统类似,SLUB的每个快速缓存都包括一个per CPU本地slab和一个全局slab链表。分配对象时,首先选择本地slab中分配;如果本地slab已经用完,再从全局slab链表里分配。值得注意的是,如果是多节点的NUMA系统,“全局slab链表”实际上是一个数组,也就意味着每个NUMA节点有一个slab链表
















