为什么 tcache bin 与 arena 相关联?

Why a tcache bin is associated with an arena?

我正在使用 Ubuntu 18.04 和 glibc-2.27,一个部署了 tcache 重新分配系统的发行版。在使用 gdb + gef(又名 GDB Enhanced Features)调试一些图像时,我注意到 tcache bin 与竞技场相关联。

通用 heap bins 命令输出如下所示:

gef➤  heap bins
───────────── Tcachebins for arena 0x7ffff7dcfc40 ───────────────────────────────────────────────────────────────────────────────────────
Tcachebins[idx=0, size=0x10] count=1  ←  Chunk(addr=0x555555756260, size=0x20, flags=PREV_INUSE) 

从输出中可以看出,tcache 垃圾箱与竞技场相关联。这对我来说看起来很奇怪,因为 tcache 的整个想法(至少我得到它的方式)是为了避免由锁定竞技场引起的线程之间的竞争。

我在 glibc wiki 上做了一些 Malloc Internals 的研究,我发现了我已经知道的东西:

Each thread has a per-thread cache (called the tcache) containing a small collection of chunks which can be accessed without needing to lock an arena.

那么,arenas和tcache bins是什么关系呢?如果我可以在不锁定竞技场的情况下访问 tcache 为什么 gef 打印竞技场(地址)?感谢您的澄清!

这似乎是 GDB 插件中的演示问题。 tcache 的实例与线程相关联,而不是与竞技场相关联。一个 tcache 实例可以包含来自多个不同领域的分配,而不仅仅是当前与 tcache 所属线程关联的领域。