这篇文章单独记录 Malloc Lab。它是 CSAPP 里最能训练 C 指针、堆布局和内存管理的一组实验。
0. 目标
Malloc Lab 要自己实现:
1 | void *malloc(size_t size); |
核心目标:
- 正确性
- 空间利用率
- 吞吐量
1. 堆块布局
一个最基本的 block 通常包含:
1 | header |
header 里通常记录:
- block 大小
- 是否已分配
因为对齐要求,block size 通常是 8 或 16 的倍数。
2. 隐式空闲链表
最简单的实现是 implicit free list:
1 | 从堆开头一路扫描 block |
优点:
- 思路简单
- 适合入门
缺点:
- 每次分配都可能扫很久
- 吞吐量差
3. 显式空闲链表
explicit free list 只把空闲块串起来:
1 | free block -> free block -> free block |
优点:
- 查找更快
- 性能更好
代价:
- 指针操作更复杂
- 更容易写出内存破坏 bug
4. 嵌入式关联
Malloc Lab 对嵌入式的价值:
- 理解堆碎片
- 理解长期运行程序为什么会内存退化
- 理解内存池设计
- 理解 RTOS / 裸机里为什么常常限制动态分配
- 更容易排查 double free、use-after-free、越界写
5. 复盘重点
学完后要能回答:
malloc返回的是 block 的哪一部分?- 为什么需要对齐?
- 内部碎片和外部碎片有什么区别?
free后相邻空闲块为什么要合并?- 隐式链表和显式链表的权衡是什么?