jemalloc 和 tcmalloc 如何跟踪线程?
How do jemalloc and tcmalloc track threads?
现在正在积极研究内存管理器jemalloc
和tcmalloc
的代码。但是我不明白这两个管理器是如何跟踪线程的。
如果我没理解错的话,内存分配的时候可以检测到一个新的线程,然后创建一个新的线程缓存。但是 tcmalloc
/ jemalloc
如何检测线程何时被销毁以及附加到它的线程缓存可以被释放以供将来使用?
Google 结果连一点有用的信息都没有。
我只能回答 jemalloc,但它的工作方式是当创建线程缓存时,它与该线程的线程特定数据相关联。
当你创建线程特定数据时,你可以给它一个'destructor',当线程被销毁时调用它。如果您使用的是 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
例程。
现在正在积极研究内存管理器jemalloc
和tcmalloc
的代码。但是我不明白这两个管理器是如何跟踪线程的。
如果我没理解错的话,内存分配的时候可以检测到一个新的线程,然后创建一个新的线程缓存。但是 tcmalloc
/ jemalloc
如何检测线程何时被销毁以及附加到它的线程缓存可以被释放以供将来使用?
Google 结果连一点有用的信息都没有。
我只能回答 jemalloc,但它的工作方式是当创建线程缓存时,它与该线程的线程特定数据相关联。
当你创建线程特定数据时,你可以给它一个'destructor',当线程被销毁时调用它。如果您使用的是 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
例程。