Slab 对象分配Slab allocation
把内存页划成适合某类对象的槽位,以空闲对象结构循环分配和复用。
- 核心约束
- 槽位归属、空闲状态和对象生命周期必须一致,并满足对应同步规则。
- 适用问题
- 内核对象、固定规格高频分配与分级对象缓存。
- 边界与取舍
- 部分填充 slab 与每 CPU 缓存占用空间;实现不同,不应把 Slab 一概称为无锁。
常见操作#
以 Linux 6.12 SLUB 为例,缓存面向特定对象大小或类型。
| 操作 | 时间成本 | 条件与说明 |
|---|---|---|
| 本地 freelist 分配 / 释放 | 固定数量的指针 / 原子操作,可能重试 | CPU 本地状态可用且不走调试或特殊配置路径;CAS 失败可重试。 |
| 补充对象缓存 | 取得部分 slab 或向页分配器申请 | 涉及锁、NUMA、页分配或初始化,不属于本地快速路径。 |
| 回收空 slab | 空闲统计 + 同步 + 释放页 | 何时回收、保留多少空 slab 取决于实现和压力策略。 |
时间与空间#
- 时间成本
- 按本地命中、补充和回收路径分别分析
- 空间成本
- 对象槽位 + slab 元数据 + 部分使用 slab 的浪费
复用对象存储降低频繁通用分配的成本,但不会自动消除构造、清零、同步和碎片。
工程中的应用#
1 个案例 · 附源码Linux SLUB 将同类对象组织在 slab 中,并用 per-CPU freelist 满足常见分配,避免每次都访问集中管理的部分空闲 slab 列表。
附源码片段 · 内存管理
基础原理参考资料
Linux 6.12 · SLUB allocator锁规则、每 CPU 状态以及快慢路径配置。
Linux 6.12 · SLUB allocation path__slab_alloc_node 的 freelist 与补充处理。