Skip to content
This repository was archived by the owner on Jun 22, 2026. It is now read-only.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Buddy Allocator

一个用纯 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 授权。

About

C 语言实现的伙伴系统内存分配器

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages