slab、slub 与内核内存分配

这页讲的是:内核不是每次都拿整页内存再手工切小块来用,它需要一套更高效、可复用、适合高频分配释放的对象分配机制。学这页的重点,是理解“内核怎么要内存”不只关乎容量,还关乎对象大小、分配频率、碎片、缓存复用和上下文限制。

这块是什么

slab、slub 与内核内存分配,讲的是 Linux 内核怎样为大量小对象和中等大小对象提供高效分配能力。相比“直接要一大块页再自己管”,这套机制会围绕对象尺寸、CPU 本地性、频繁创建销毁和缓存复用做优化,让内核能更自然地管理各种内部对象。

可以把它理解成:仓库不是每来一个螺丝就临时锯一块钢板,而是会提前准备好不同规格的收纳格和零件盒,谁来取什么大小的零件,就去合适那格拿,归还时也按规格放回。

它负责什么

高效分配小对象

  • 适合频繁申请和释放的小块内存
  • 减少每次都从底层页分配重新折腾的成本
  • 提升常见对象创建销毁路径的效率
  • 让很多内核对象能更顺手地被管理

控制碎片与复用

  • 按对象大小分组管理
  • 尽量复用已准备好的对象槽位
  • 降低碎片化和反复初始化的代价
  • 让内存使用更贴近对象实际形态

适应运行上下文

  • 不同分配时机和上下文限制不一样
  • 有些路径能睡眠等待,有些不能
  • 分配策略要配合中断、原子上下文和性能要求
  • 让“要内存”本身也遵守系统运行规则

为什么它不是“反正 malloc 一下”

如果想得太简单会怎样真正关键在哪
把内核分配想成用户态 malloc会忽略内核对象生命周期、上下文限制和页级管理差别。内核分配常常受上下文、并发和底层页供应一起约束。
觉得所有大小的对象都一样分会错过页分配和对象缓存分配的层次区别。不同粒度对象更适合不同管理方式。
只关心能不能分配成功容易忽略碎片、局部性和频繁分配释放带来的长期成本。性能和可持续运行常和分配策略深度绑定。
觉得 free 掉就万事大吉会忽略缓存复用、延后回收和调试检测的复杂性。对象死后的去向也会影响后续性能与问题定位。

关键概念

概念现在怎么理解
kmalloc内核里常见的一类通用动态分配入口,适合很多常规大小对象。
kfree把之前分配到的对象交回内核分配体系。
slab / slub围绕对象缓存和小块分配效率组织起来的分配思路与实现体系。
对象缓存按大小或类型准备好的可复用槽位,让对象分配释放更高效。
分配上下文当前路径能不能睡、能不能等待、对时延多敏感,这些会影响分配方式。

为什么重要

常见误解

它不负责什么

和其他模块的关系

相关模块关系
内存管理这是内存主题往下细拆的一层,专门看对象和缓存怎样被高频分配释放。
kref / 生命周期对象什么时候分配、什么时候能安全释放,常和引用关系紧密相连。
并发控制 / RCU对象何时能真正回收,常与同步时序和读者是否离开旧视图绑在一起。
驱动 / 网络 / 文件系统这些子系统里大量常见对象都会深受分配策略和上下文限制影响。

读完这页后,你应该能回答

后面适合继续问:页级分配和对象缓存分配最容易混在哪?为什么中断上下文会让分配问题变得更敏感?对象复用和调试检测之间通常有哪些张力?