Arena 1M对齐方法图解

想要的是这样的内存

但通过mmap做不到这一点

2倍size的mmap

但是PROT_NONE

RWX权限都没有,这已经不能算内存分配了,可以叫做地址空间

1M对齐的场所中,通过remap对size 1M进行RWX权限分配

剩余的空间进行munmap

总结

  • 小型malloc如果经常出现的话,复杂度是O(n),太糟了
  • 防止碎片化,Huge Block将heap分开是有效的
  • 要提高缓存命中率,引用局部性非常重要
  • 每个线程的数据结构是每个CPU的数据结构的良好近似值

glibc malloc的缺点

  • 由于Huge Block是绝对页对齐的,缓存很容易出现竞争(在HPC领域中通常关闭此机制)
  • 如果是用另一种方式,将不会锁定Arena自身(这就是产生问题的heavy allocation,应用作heap自身管理,很难看到效果)
  • 最新的dlmalloc对large bin的管理已经从列表变成了二叉树来提高速度(尽管利用率太低,效果很微妙)

最终

  • glibc malloc是今天的主要内容,针对int_malloc各个方面将近90页的PPT阅读不容易
  • 源代码中的注释我觉得是在骗我,阅读用了差不多一小时
  • 函数划分用了有两小时
  • 构造体类型与内存上的数据结构对应用三小时
  • 这样看起来Linux 内核还是很容易读的嘛