Malloc功能中的竞技场

Vai*_*hav 5 c++

我正在使用malloc_stats()来打印malloc相关的统计数据,其中我找到了一些程序的"Arena 0"和其他一些程序的"Arena 0和Arena 1".

这些竞技场代表什么?

Vai*_*hav 5

堆代码驻留在glibc组件内,并打包在libc.so.x共享库中.堆的当前实现使用称为arenas的多个独立子堆.每个竞技场都有自己的互斥锁用于并发保护.因此,如果进程堆中有足够的场所,并且有一种机制可以在它们之间均匀地分配线程的堆访问,那么互斥体争用的可能性应该是最小的.事实证明,这适用于分配.在malloc()中,进行测试以查看当前线程的当前目标竞技场的互斥锁是否是空闲的(trylock).如果是这样,那么竞技场现在被锁定并且分配继续进行.如果互斥锁正忙,则依次尝试每个剩余的竞技场并在互斥锁不忙时使用.如果没有阻挡,没有竞技场可以被锁定,创造了一个全新的竞技场.根据定义,此竞技场尚未锁定,因此现在可以在不阻止的情况下继续进行分配.最后,线程最后使用的竞技场的ID保留在线程本地存储中,随后在该线程接下来调用malloc()时用作第一个竞技场.因此,对malloc()的所有调用都将在不阻塞的情况下继续.


dim*_*mba 2

请参阅链接文本。看起来堆是一个竞技场(“子堆”)的集合,用于处理多个线程之间的内存分配,从而减少争用。