【问题标题】:Why a tcache bin is associated with an arena?为什么 tcache bin 与 arena 相关联?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 哇,我真的从没想过tcache 拥有来自多个领域的块,但是是的,这确实是有道理的。谢谢!
    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2019-02-07
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多