3

使用 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

4

1 回答 1

3

在这里找到了答案,它per thread arena主要用于malloc的reduce lock。

线程:在 linux 早期,dlmalloc 被用作默认的内存分配器。但后来由于 ptmalloc2 的线程支持,它成为了 linux 的默认内存分配器。线程支持有助于提高内存分配器性能,从而提高应用程序性能。在 dlmalloc 中,当两个线程同时调用 malloc 时,只有一个线程可以进入临界区,因为 freelist 数据结构在所有可用线程之间共享。因此,内存分配在多线程应用程序中需要时间,从而导致性能下降。在 ptmalloc2 中,当两个线程同时调用 malloc 时,会立即分配内存,因为每个线程都维护一个单独的堆段,因此维护这些堆的 freelist 数据结构也是独立的。

于 2017-11-30T22:00:18.383 回答