我正在使用malloc_stats()来打印malloc相关的统计数据,其中我找到了某些程序的“Arena 0”和其他一些程序的“Arena 0和Arena 1”。
这些竞技场代表什么?
答案 0 :(得分:5)
堆代码驻留在glibc组件中,并打包在libc.so.x共享库中。堆的当前实现使用称为arenas的多个独立子堆。每个竞技场都有自己的互斥锁用于并发保护。因此,如果进程堆中有足够的场所,并且有一种机制可以在它们之间均匀地分配线程的堆访问,那么互斥体争用的可能性应该是最小的。事实证明,这适用于分配。在malloc()中,进行测试以查看当前线程的当前目标竞技场的互斥锁是否是空闲的(trylock)。如果是这样,那么竞技场现在被锁定并且分配继续进行。如果互斥锁正忙,则依次尝试每个剩余的竞技场并在互斥锁不忙时使用。如果没有阻挡可以锁定竞技场,则会创建一个全新的竞技场。根据定义,此竞技场尚未锁定,因此现在可以在不阻止的情况下继续进行分配。最后,线程最后使用的竞技场的ID保留在线程本地存储中,随后在该线程接下来调用malloc()时用作第一个竞技场。因此,对malloc()的所有调用都将在不阻塞的情况下继续。
答案 1 :(得分:2)
见link text。看起来堆是一个竞技场(“子堆”)的集合,用于处理多个线程之间的内存分配,从而减少争用。
答案 2 :(得分:2)
在某些malloc实现中,“arena”是一个内存池,从中可以进行单独的分配。确定使用哪个竞技场的算法在实现之间会有所不同,因此我们无法解释您看到差异的原因。一个常见因素是分配大小。
答案 3 :(得分:0)
一切都在那里:http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html
int arena
这是malloc用sbrk分配的内存总大小(以字节为单位)。