一个用纯 C 实现的 伙伴系统(Buddy System)内存分配器,用于学习与演示经典的动态内存管理算法。
- 4 MB 内存池,最小分配单元 4 KB,共 1024 个最小单元。
- 11 个阶(order 0–10):阶 N 的块大小为
4 KB << N,单次最大可分配 4 MB。 - 侵入式空闲链表:空闲块直接把自身开头当作链表节点,无额外元数据开销。
- 分配时自动分裂(split)、释放时自动合并(merge)。
- 内置一致性自检(
bsa_verify),每次操作都用assert校验内部状态。
伙伴系统把内存按 2 的幂划分:
| 阶 (order) | 块大小 | 数量 |
|---|---|---|
| 0 | 4 KB | 1024 |
| 1 | 8 KB | 512 |
| ... | ... | ... |
| 10 | 4 MB | 1 |
- 分配:把请求大小向上取整到最近的 2 的幂,从对应阶的空闲链表取一块;若该阶为空,就从更高阶借一块并对半分裂,把“伙伴”那一半挂回低阶链表。
- 释放:把块挂回空闲链表;若它的伙伴也空闲,就合并成更大的一块,继续向上尝试合并。
- 伙伴索引:同一阶的两个伙伴,索引只差一位,由
index ^ (1 << order)得到。
make # 编译生成可执行文件 buddy
make run # 编译并运行
make clean # 清理产物默认入口是 testra()——一个无限循环的随机压力测试(每 100 轮休眠 1 秒),需用 Ctrl-C 终止。切换其它测试见 buddy.c 末尾 main() 里的 #if 0 段。
| 文件 | 说明 |
|---|---|
buddy.c |
分配器的全部实现,以及内联的测试函数 |
list.h |
Linux 内核风格的双向链表(struct list_head 及配套宏) |
Makefile |
构建 / 运行 / 清理 |
采用 MIT License 授权。