当使用new或malloc分配内存时,分配器可能需要保护自己免受重入攻击。我看到有两种方法可以做到这一点:
- 使用一个大的互斥锁。这种解决方案很简单,但性能较差。
- 为每个线程保留一个内存池。性能很高,但是内存池的大小可能难以评估。
我认为大多数分配器使用第二种方法,但我找不到证明。
您知道哪些分配器使用哪种方法吗?是否有任何标准规定?
当使用new或malloc分配内存时,分配器可能需要保护自己免受重入攻击。我看到有两种方法可以做到这一点:
我认为大多数分配器使用第二种方法,但我找不到证明。
您知道哪些分配器使用哪种方法吗?是否有任何标准规定?
Google perf tools提供了一个名为TCMalloc的分配器。该分配器为每个线程使用一组内存池(即“线程缓存系统”)。文档显示相对于glibc 2.3有性能改进测量。
自glibc 2.16以来,Glibc也使用每个线程的内存池。
因此,现在已经没有性能差异:
Fedora [我们]曾经一段时间使用tcmalloc来为QEMU分配内存。然后我们再次检查性能,发现与glibc的本地malloc相比的差距基本上已经消失了
还要注意C++ new
操作符调用由libc
(大多数情况下是glibc malloc)提供的malloc
函数。
所以:
C++17 开始在多线程应用程序中指定分配器的行为:
glibc
为每个线程提供了一个内存池:http://patchwork.sourceware.org/patch/19042/ - Jérôme Pouiller