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