Slab 对象分配Slab allocation

把内存页划成适合某类对象的槽位,以空闲对象结构循环分配和复用。

核心约束
槽位归属、空闲状态和对象生命周期必须一致,并满足对应同步规则。
适用问题
内核对象、固定规格高频分配与分级对象缓存。
边界与取舍
部分填充 slab 与每 CPU 缓存占用空间;实现不同,不应把 Slab 一概称为无锁。

常见操作#

以 Linux 6.12 SLUB 为例,缓存面向特定对象大小或类型。

操作时间成本条件与说明
本地 freelist 分配 / 释放固定数量的指针 / 原子操作,可能重试CPU 本地状态可用且不走调试或特殊配置路径;CAS 失败可重试。
补充对象缓存取得部分 slab 或向页分配器申请涉及锁、NUMA、页分配或初始化,不属于本地快速路径。
回收空 slab空闲统计 + 同步 + 释放页何时回收、保留多少空 slab 取决于实现和压力策略。

时间与空间#

时间成本
按本地命中、补充和回收路径分别分析
空间成本
对象槽位 + slab 元数据 + 部分使用 slab 的浪费

复用对象存储降低频繁通用分配的成本,但不会自动消除构造、清零、同步和碎片。

工程中的应用#

1 个案例 · 附源码
基础原理参考资料

Linux 6.12 · SLUB allocator锁规则、每 CPU 状态以及快慢路径配置。

Linux 6.12 · SLUB allocation path__slab_alloc_node 的 freelist 与补充处理。

4 个概念