我写了一个简单的程序
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void *thread(void *arg) {
printf("thread() entered with argument '%s'\n", arg);
pthread_exit((void*)"success");
}
main() {
pthread_t thid;
void *ret;
if (pthread_create(&thid, NULL, thread, (void*)"thread 1") != 0) {
perror("pthread_create() error");
exit(1);
}
if (pthread_join(thid, &ret) != 0) {
perror("pthread_create() error");
exit(3);
}
printf("thread exited with '%s'\n", ret);
}
并在我的 Ubuntu 24.04 上将其编译成一个名为“thread”的可执行文件。当我运行它时
valgrind --tool=massif ./thread
并生成我得到的报告
->04.78% (272B) 0x40145AB: _dl_allocate_tls (in /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2)
| ->04.78% (272B) 0x48F4606: pthread_create (in /usr/lib/x86_64-linux-gnu/libc.so.6)
| ->04.78% (272B) 0x10927F: main (in /home/sameer/profile/thread)
这表明pthread_create的内存使用量只有272字节。但是,当我运行它时:
valgrind --tool=massif --pages-as-heap=yes ./thread
报告显示
->05.70% (8,392,704B) 0x48E3526: pthread_create (in /usr/lib/x86_64-linux-gnu/libc.so.6)
| ->05.70% (8,392,704B) 0x10927F: main (in /home/sameer/profile/thread)
表示内存使用量在8MB左右。系统上 pthread_create 的实际内存使用量是多少?我有兴趣了解总内存使用情况,包括系统开销等。valgrind 文档指出,简单的 valgrind (较早的命令)可能不包括 mmap 等内存。它还指出,pages-as-heap=yes 将显示内存使用情况,包括系统开销。这是否意味着我可以放心地假设 8MB 是典型 Ubuntu 系统上每个线程的系统开销?
这完全取决于 pthread 堆栈的分配方式。我没看过源码。如果它是使用
mmap()
分配的(最有可能),那么 Massif 在正常操作中不会看到它,因为它只寻找对 malloc()
、operator new
等的调用。
当您指定
--pages-as-heap=yes
时,它将基于 mmap()
进行测量,因此它应该看到内核之外尽可能最低级别的所有分配。
您可以使用
pthread_attr()
更改 pthread 堆栈大小。如果您不这样做,则大小取决于 RLIMIT_STACK。如果是 unlimited
那么你的堆栈大小可能是 2Mb。