堆扩展

因为堆并不是无限的,有时会出现空间不足的情况

这时候,我们会使用brk系统调用来扩展heap区域,brk是一个用来更改heap结尾地址的API

增加的区域分成两部分,前面一部分返回给用户,剩下的追加到free list中

简单的brk实现

  1. data段包括静态数据和stack
  2. 当前大小以及增量(内核中)malloc
  3. 复制到新内存中
  4. 对旧的数据进行mfree
  5. stack复制到内存末尾
  6. stack和静态数据之间的数据清零

也就是说

  • 内核brk很慢
  • 为了尽量少的调用brk,用户空间存在一种”尽量少使用brk,一次性获取足够需求”的方针
  • 这被实现为一种价值观

那么:

  • 实际上,现代Linux中brk已经变得很快速。但是暂时先不考虑这个。
  • 现在我们以brk很慢为前提,来考虑如何提高malloc的速度