Linux中进程地址空间模型

古典的malloc

  • 使用free list来管理空闲内存
  • 整个进程只使用一个heap
  • 使用malloc的时候,管理区域会使用多个allocate,并且将头部追加到管理区域(如果某个地方没有管理区域,那么在free的时候将不知道需要释放的size)
  • 分配策略是first fit

malloc的算法

  1. 首先,从列表头获取头指针
  2. 检查可用空间是否足够
  3. 指针前进到列表的下一个节点
  4. 检查可用空间是否足够
  5. 再次将指针前进到列表的下一个节点
  6. 再次,检查可用空间

此时,满足条件

  1. 将空闲区域分成两部分
  2. 更新list head

此时first list的head:

最终搜索失败的地方(分配内存的前一个节点)

实际情况

实际上会寻找一个更合适的区域

free的算法

  1. 从free list head获取第一个指针
  2. 获取第一个节点的下一个指针(next = p->s.ptr)
  3. 由于p<bp<next 不成立,进入下一步
  1. p前进到下一个节点
  2. 获取下一个指针
  3. p<bp<next成立
  4. p和bp不相邻( p + p->size != bp)
  5. 因为bp和p->s.ptr相邻(bp + bp->s.size == next),合并
  1. free list head现在指向释放掉的节点