Как jemalloc и tcmalloc отслеживают потоки? - PullRequest
0 голосов
/ 24 апреля 2019

Сейчас я активно изучаю код менеджеров памяти jemalloc и tcmalloc.Но я не могу понять, как эти два менеджера отслеживают потоки.

Если я правильно понимаю, новый поток может быть обнаружен во время выделения памяти, после чего создается новый кэш потоков.Но как tcmalloc / jemalloc обнаруживает, когда поток уничтожен, и кэш потока, присоединенный к нему, может быть освобожден для будущего использования?

Результаты Google не могут дать даже минимума какой-либо полезной информации.

1 Ответ

0 голосов
/ 24 апреля 2019

Я могу ответить только за jemalloc, но способ, которым он работает, заключается в том, что при создании кеша потока он связывается со специфичными для потока данными для этого потока.

Когда вы создаете данные, специфичные для потока, вы можете присвоить им «деструктор», который вызывается, когда поток уничтожается. Если вы используете pthreads, это подпрограмма pthread_key_create , которая является способом C для создания данных, специфичных для потока.

В случае jemalloc в tcache.h есть немного кода, который перехватывает tcache_thread_cleanup с данными tcache (мой источник jemalloc-3.0.0):

143 malloc_tsd_funcs(JEMALLOC_INLINE, tcache, tcache_t *, NULL,
144     tcache_thread_cleanup)

Итак, когда поток завершается, вызывается деструктор. Он получает указатель на кэш для этого потока и запускает процедуру tcache_thread_cleanup в это время.

...