Я использую Ubuntu 18.04 с glibc-2.27
, дистрибутивом, в котором развернута система перераспределения tcache
. При отладке некоторого изображения с помощью gdb
+ gef
(он же расширенные возможности GDB ) я заметил, что корзина tcache
связана с ареной.
универсальный c Вывод команды 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
(по крайней мере так, как я понял) заключалась в том, чтобы избежать гонки между потоками, которая была вызвана блокировкой арен.
Я провел некоторое исследование Mallo c Internals на glib c вики, и я нашел то, что я уже знал:
Каждый поток имеет кэш для каждого потока (называемый tcache), содержащий небольшую коллекцию блоков, к которым можно получить доступ без необходимости блокировать арену.
Итак, какова связь между аренами и tcache
корзинами? если я могу получить доступ к tcache
без блокировки арены, почему gef
распечатать арену (адрес)? Спасибо за любые разъяснения!