buddy allocator 与伙伴系统分配

这页讲的是:内核不只是要分小对象,也必须能从更底层把物理页按块拿出来,供应页表、页缓存、DMA 缓冲和上层分配器继续使用。学这页的重点,是理解 buddy allocator 更像“按 2 的幂组织物理页块的底层仓库”,它解决的是页级供应与合并回收问题。

这块是什么

buddy allocator 与伙伴系统分配,讲的是 Linux 怎样把物理内存页按不同阶数组织成可拆分、可合并的页块池,让系统能比较高效地拿到 1 页、2 页、4 页乃至更大的连续物理页。它关注的是“底层物理页块怎么供应和回收”,而不是直接面向业务对象的高频小块分配。

可以把它理解成:仓库里不是只有散装零件,而是把箱子按 1 箱、2 箱、4 箱、8 箱这种规格分层摆放。谁来要几箱,就先找最接近的整箱,不够合适时再拆;归还时如果隔壁那箱也空了,就再合并回更大的箱。

它负责什么

供应页级内存块

  • 给上层页分配需求提供基础页块
  • 支持不同大小的连续物理页申请
  • 让页缓存、页表和很多内核路径都有底层页来源
  • 把物理页供应做成正式体系

在拆分与合并中控制碎片

  • 大块不够合适时可以往下拆
  • 空闲相邻页块可以往上合并
  • 尽量维持未来还能拿到较大连续块的机会
  • 让物理页管理不至于越来越零碎

为更上层分配器兜底

  • slab/slub、页缓存和很多映射路径最终都要向它要页
  • 它决定系统还能不能拿出合适页块继续运转
  • 底层供给紧张会往上层一路传导
  • 让“缺页块”成为系统级资源问题而不是局部小事

为什么它不是“把内存随便切一切”

如果想得太简单会怎样真正关键在哪
觉得页分配只是拿几页出来会忽略连续物理页大小和碎片压力。底层难点是既要能拿,又要尽量别把未来的大块机会切没。
把它和 slab/slub 当成同一层会混淆页块供应和对象分配。伙伴系统更底层,先解决页从哪里来。
只看申请成功一次会漏掉长期运行后外部碎片越来越严重的问题。它真正面对的是系统长期供应能力。
觉得释放就是原样放回会低估合并策略对未来大块分配成功率的重要性。回收阶段同样在决定内存版图会不会继续变坏。

关键概念

概念现在怎么理解
buddy allocator按 2 的幂阶数管理连续物理页块的底层分配体系。
order页块大小层级;order 越高,代表连续页块越大。
拆分大页块不必整块都给出去,可以往下拆成更小伙伴块使用。
合并相邻且同阶的空闲伙伴块有机会重新拼成更大页块。
外部碎片总空闲量也许还够,但足够大的连续页块已经很难凑出来。

为什么重要

常见误解

它不负责什么

和其他模块的关系

相关模块关系
slab / slub很多对象分配最终要先从伙伴系统拿页,再在页内继续切对象槽位。
页缓存与回收回收效果和页块能否重新整理出更大连续块,常会影响底层供应质量。
DMA / CMA需要连续物理内存的路径会更直接感受到高阶页块和碎片压力。
vmalloc当物理连续难拿时,vmalloc 则是在虚拟地址层绕开这件事的另一种思路。

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

后面适合继续问:高阶页失败最容易和“内存不够”混在哪?外部碎片为什么会让很多问题看起来像随机失败?如果对象不需要物理连续,为什么还要费力拿高阶页?