堆扩展
因为堆并不是无限的,有时会出现空间不足的情况
这时候,我们会使用brk系统调用来扩展heap区域,brk是一个用来更改heap结尾地址的API
增加的区域分成两部分,前面一部分返回给用户,剩下的追加到free list中
简单的brk实现
- data段包括静态数据和stack
- 当前大小以及增量(内核中)malloc
- 复制到新内存中
- 对旧的数据进行mfree
- stack复制到内存末尾
- stack和静态数据之间的数据清零
也就是说
- 内核brk很慢
- 为了尽量少的调用brk,用户空间存在一种”尽量少使用brk,一次性获取足够需求”的方针
- 这被实现为一种价值观
那么:
- 实际上,现代Linux中brk已经变得很快速。但是暂时先不考虑这个。
- 现在我们以brk很慢为前提,来考虑如何提高malloc的速度