【发布时间】:2020-06-14 01:42:03
【问题描述】:
我正在使用带有 glibc-2.27 的 Ubuntu 18.04,这是一个部署了 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 bin 与一个竞技场相关联。这对我来说看起来很奇怪,因为tcache 的整个想法(至少我得到它的方式)是为了避免由锁定竞技场引起的线程之间的竞争。
我在 glibc wiki 上对 Malloc Internals 做了一些研究,发现了我已经知道的:
每个线程都有一个每线程缓存(称为 tcache),其中包含一小部分块,无需锁定 arena 即可访问这些块。
那么,arenas 和tcache bins 是什么关系呢?如果我可以在不锁定竞技场的情况下访问tcache,为什么gef 会打印竞技场(地址)?感谢您的澄清!
【问题讨论】:
标签: c multithreading heap-memory glibc