创建线程时,使用pthread_create,报告的内存地址空间(通过top和ps)显着增长,如下所示:
线程的堆栈大小是明确设置的,所以很好,我可以看到它在pmap中弹出。
但我无法解释的是65404 KB命中率? 这是一个linux内核映射还是究竟是什么?
还为线程设置了detachstate属性,即使它以< 1s结束,内存映射仍然存在于pmap中。
这一般只是linux内存管理的一部分,一旦映射然后可以重用吗?可以调整65M的命中率,因为这是一个单线程情况,并且当同时创建多个线程时,VSZ报告的速度非常快。 报告了10个线程,650M在进程地址空间中膨胀。
...shared libs
...shared libs
2adf40000000 (132 KB) rw-p (00:00 0) <--- stack size for the thread.
2adf40021000 (65404 KB) ---p (00:00 0) <--- what is this?
7ffcb8bed000 (128 KB) rwxp (00:00 0) [stack]
7ffcb8c0d000 (4 KB) rw-p (00:00 0)
7ffcb8dc6000 (8 KB) r--p (00:00 0) [vvar]
7ffcb8dc8000 (8 KB) r-xp (00:00 0) [vdso]
ffffffffff600000 (4 KB) r-xp (00:00 0) [vsyscall]
mapped: 116172 KB writable/private: 1140 KB shared: 0 KB
谢谢你。
编辑:
所以我添加了第二个线程,pmap现在显示:
2adf40000000 (132 KB) rw-p (00:00 0)
2adf40021000 (65404 KB) ---p (00:00 0)
2adf44000000 (132 KB) rw-p (00:00 0)
2adf44021000 (65404 KB) ---p (00:00 0)
7ffcb8bed000 (128 KB) rwxp (00:00 0) [stack]
7ffcb8c0d000 (4 KB) rw-p (00:00 0)
7ffcb8dc6000 (8 KB) r--p (00:00 0) [vvar]
7ffcb8dc8000 (8 KB) r-xp (00:00 0) [vdso]
ffffffffff600000 (4 KB) r-xp (00:00 0) [vsyscall]
mapped: 181840 KB writable/private: 1400 KB shared: 0 KB
所以现在有2个堆栈和65M区域。 据报道,这两方面也提到了虚拟地址空间。
编辑: 环境:glibc:ldd(Ubuntu EGLIBC 2.19-0ubuntu6.6)2.19,内核是4.4.103
答案 0 :(得分:0)
找到答案here,它是per thread arena
,主要用于减少malloc的锁定。
线程:在linux的早期,dlmalloc被用作默认的内存分配器。但后来由于ptmalloc2的线程支持,它成为了linux的默认内存分配器。线程支持有助于提高内存分配器性能,从而提高应用程序性能。在dlmalloc中,当两个线程同时调用malloc时,只有一个线程可以进入临界区,因为freelist数据结构在所有可用线程之间共享。因此,内存分配在多线程应用程序中需要时间,从而导致性能下降。在ptmalloc2中,当两个线程同时调用malloc时,会立即分配内存,因为每个线程都维护一个单独的堆段,因此维护这些堆的空列表数据结构也是分开的。每个线程都会调用为每个线程维护单独的堆和空闲列表数据结构的行为。