Arena生成

main_arena == 之前说明过的heap

Arena生成thread2

thread2被锁定

别的thread如果同时调用malloc,会因为锁(mutex_trylock)而失败

内存中arena结构体(包含bin数组的结构体)

新的自身专用heap通过mmap生成

这个altanative heap的构造被称为arena

记住TLS(thread local strage) 中自慎用arena,除非开辟新thread或者用尽1M内存,否则不要在此触碰它

Arena生成thread3

下一个thread也一样,继续使用main_arena,直到发生锁竞争

如果锁命中。。。

arena list,如果出现所有的锁都取得失败的情况,那么将创建一个新的专用arena

thread不会突然创建arena

这是为了避免结束时专用arena被浪费

这样的结果,thread生成后会在各种arena中发生锁竞争

并且,收束到一个thread,一个arena中

1个thread,一个arena的隐藏优点

  • SMP机器中,从另一个CPU访问的内存不会占用自身CPU的缓存,因此如果只是简单管理上次访问,则不太方便
  • 但是,从用户空间来看,你并不知道运行的是哪个CPU(它会自行改变)
  • 因此,要注意内核线程的CPU亲和性调度,自身CPU访问自身线程数据的概率更高
  • 线程专用内存=缓存命中率大幅UP

顺便说一下

free的时候,如法确定自己的所属arena?