pthread_create的实际内存使用量是多少

问题描述 投票:0回答:1

我写了一个简单的程序

#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 系统上每个线程的系统开销?

ubuntu memory pthreads system valgrind
1个回答
0
投票

这完全取决于 pthread 堆栈的分配方式。我没看过源码。如果它是使用

mmap()
分配的(最有可能),那么 Massif 在正常操作中不会看到它,因为它只寻找对
malloc()
operator new
等的调用。

当您指定

--pages-as-heap=yes
时,它将基于
mmap()
进行测量,因此它应该看到内核之外尽可能最低级别的所有分配。

您可以使用

pthread_attr()
更改 pthread 堆栈大小。如果您不这样做,则大小取决于 RLIMIT_STACK。如果是
unlimited
那么你的堆栈大小可能是 2Mb。

© www.soinside.com 2019 - 2024. All rights reserved.