【问题标题】:Why does the memory consumption grows when using more threads on Linux? (C++)为什么在 Linux 上使用更多线程时内存消耗会增加? (C++)
【发布时间】:2012-08-10 13:36:29
【问题描述】:

计划:

我为大量数据创建了一个 C++ 计算程序,它可以在 1 个或多个线程上运行。 (通过配置文件)

程序环境如下:C++、OpenMp、Redhat-x64、malloc/free

Linux 上的结果:

  • 当我在 1 个线程上运行它时,进程大小为 177 MB。
  • 当我在 2 个线程上运行它时,进程大小为 317 MB。
  • 当我在 4 个线程上运行它时,进程大小为 600 MB。

Windows 上的结果:

  • 无论使用多少线程,进程大小仍然相同,为 110MB。

问题:

为什么在 Linux 上使用更多线程时内存消耗会增加?

【问题讨论】:

  • 哪个内存,虚拟的,驻留的,共享的?
  • 每个线程都有自己的栈?
  • 我只是使用标准的c++ malloc分配器,我不知道之后linux是如何工作的。
  • 这是真的吗,或者您是否以某种方式看到每个线程报告的内存相同,因为它们都共享一个内存空间,因此将实际内存需求乘以线程数?你用什么来确定大小?

标签: c++ linux multithreading memory openmp


【解决方案1】:

一个合理的猜测是,Linux 中的delete 将缓存已释放的内存以供将来的new 请求使用,就像在 Windows 上一样,但 Linux 每个线程都有一个缓存,而 Windows 每个进程都有一个缓存。

(更准确地说,是 C++ 运行时库决定了这种缓存的工作方式)。

【讨论】:

  • 我没有找到关于这个缓存的任何信息,有它的名字吗?
  • 它被认为是一个实现细节,没有明确的名称。这也有点抽象。我相信一些实现会有多个池或缓存,以保持相同大小的释放块组合在一起。
【解决方案2】:

使用/proc/<PID>/maps,或者更好的pmap(1),找出页面的去向。

【讨论】:

    【解决方案3】:

    您启动的每个线程都需要分配一个堆栈来运行它,并为任何线程局部变量分配内存。我不完全确定每个线程 150Mb 看起来是否合理,但线程本地数组可能会导致类似的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多