Почему бин tcache связан с ареной? - PullRequest
1 голос
/ 01 марта 2020

Я использую 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 распечатать арену (адрес)? Спасибо за любые разъяснения!

1 Ответ

1 голос
/ 06 апреля 2020

Это похоже на проблему презентации в плагине GDB. Экземпляры tcache связаны с потоками, а не с аренами. Один экземпляр tcache может содержать выделения из нескольких разных арен, а не только арены, в настоящее время связанной с потоком, к которому принадлежит tcache.

...