伙伴分配Buddy allocation

按 2 的幂管理内存块,按需拆分并合并伙伴。

核心约束
只有同阶且满足条件的伙伴块可合并。
适用问题
连续物理页分配与空闲块管理。
边界与取舍
块大小约束导致内部碎片;可用内存不等于可用连续大块。

常见操作#

G 为可用阶数范围;order 为请求的 2 的幂次页数。

操作时间复杂度条件与说明
分配一块O(G)O(G)按阶寻找空闲块,必要时逐级拆分;这里仅计伙伴链表路径。
释放并合并O(G)O(G)每阶只检查相应 buddy,满足同阶且空闲等条件时向上合并。
触发页回收 / 内存规整由扫描、迁移和等待决定这属于完整页分配路径,不能被伙伴算法的阶数界覆盖。

时间与空间#

时间复杂度
拆分 / 合并 O(G)O(G),系统慢路径另计
辅助空间
各阶空闲链表 + 页状态元数据

按 2 的幂分配可能造成内部碎片;空闲页总量足够也不代表存在所需连续块。

工程中的应用#

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

Linux 6.12 · Page allocatorexpand、__rmqueue_smallest 和 __free_one_page 的逐阶拆分 / 合并。

4 个概念