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?