为什么在 Linux 上使用更多线程时内存消耗会增加?(C++)
Why does the memory consumption grows when using more threads on Linux? (C++)
Program:
我为大量数据创建了一个C++计算程序,该程序可以在一个或多个线程上运行。(通过配置文件)
程序环境如下:C++,OpenMp,Redhat-x64,malloc/free
Linux上的结果:
- 当我在 1 个线程上运行它时,进程大小为 177 MB。
- 当我在 2 个线程上运行它时,进程大小为 317 MB。
- 当我在 4 个线程上运行它时,进程大小为 600 MB。
视窗上的结果:
- 无论使用的线程数如何,进程大小仍然相同,均为 110MB。
问题:
为什么在 Linux 上使用更多线程时内存消耗会增加?
一个合理的猜测是,Linux 中的delete
将缓存释放的内存以供将来的new
请求使用,就像在 Windows 上一样,但 Linux 的每个线程都有一个缓存,而 Windows 的每个进程都有一个缓存。
(更准确地说,确定此类缓存如何工作的C++运行时库)。
使用/proc/<PID>/maps
,或者更好的pmap(1)
,来确定页面的位置。
您启动的每个线程都需要分配一个堆栈来运行它,以及任何线程局部变量的内存。我不完全确定每个线程 150Mb 看起来是否合理,但线程本地数组可能会导致类似的事情。
相关文章:
- 数组索引的值没有增加
- 为什么我的代码在输出中增加了93天
- 有效地使用std::unordered_map来插入或增加键的值
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 为什么要增加导致崩溃的指针
- 增加传递地址的值
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为什么"i"在循环的每次迭代中都没有增加?(C++)
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 将一对插入地图并增加计数?
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- 琐碎并发代码的吞吐量不会随着线程数量的增加而增加
- C++:功能在输出前自动使用50减/增加输入数
- 追加位以增加字符的大小
- 为什么在C++中增加指针后打印了一个值而不是 NULL/0?
- 内存增加和字符串流?
- 如何增加使用 CUDA 实现的 FLOPS