创建线程时,使用pthread_create函数,通过top和ps命令可以看到内存地址空间显著增长,如下所示:
线程的堆栈大小已经明确设置,因此这很好,在pmap中可以看到。
但我无法解释的是65404 KB的增加量? 这是Linux内核映射还是什么?
线程的detachstate属性也被设置,即使它在<1秒内完成,内存映射仍然存在于pmap中。
这是否仅仅是Linux内存管理的一部分,一旦映射就可以重新使用?可以调整65M的增加量吗?这是单线程情况,当同时创建多个线程时,报告的进程地址空间占用量急剧增加。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
现在有两个堆栈和65M的区域,这两个都增加了报告的虚拟地址空间。
编辑: 环境:glibc: ldd(Ubuntu EGLIBC 2.19-0ubuntu6.6)2.19和内核为4.4.103
strace
可能是确定这些映射是如何产生的有用工具。您还应该指定您正在使用的确切内核和 glibc 版本(如果您正在使用已修补它们的硬化发行版,则几乎肯定与正在发生的事情相关)。 - R.. GitHub STOP HELPING ICE