【问题标题】:What's the memory overhead for a single windows threads?单个 Windows 线程的内存开销是多少?
【发布时间】:2010-04-30 12:25:38
【问题描述】:

每个线程有 1 Mb 的堆栈吗?还是只是 CLR 线程?

我想通过任务管理器查看本地 Windows 线程 (c++) 和 CLR 线程的头顶内存。

谢谢

【问题讨论】:

    标签: c# c++ multithreading


    【解决方案1】:

    nativeCLR 线程的默认值为 1 MB。您可以更改它,尽管这通常是个坏主意。

    【讨论】:

    • 它只保留1MB。在使用之前,它确实得到了物理支持。为什么你说改变它是一个坏主意?堆栈通常可以超出初始保留,如果 1MB 对于简单线程来说是多余的,那么你只是在分割你的地址空间。
    • 我没说这是个坏主意。我说这通常是个坏主意。创建数以亿计的线程通常是解决问题的错误方法,因此减少堆栈大小以创建数以亿计的线程几乎肯定是错误的。是的,在某些情况下调整堆栈大小可以产生收益,但这只能由真正知道自己在做什么的人来做。另外,我不确定您所说的“堆栈通常可以超出初始储备”是什么意思。 AFAIK,没有用于增长堆栈的 API。
    • @Adrian 这是一个常见的误解。 The CLR actually commits 1MB of RAM per thread for the stack.
    • @romkyns:你是对的。谢谢你教我一些新东西。您的链接已损坏,因此我在 MSDN 上找到了信息。 msdn.microsoft.com/en-us/library/ms686774%28VS.85%29.aspx
    • @Adrian 叹息,在我发布该链接后不到 1 小时,该网站已关闭:/ 这是它的 google 缓存版本:The CLR commits the whole stack
    【解决方案2】:

    请参阅 Mark Russinovich 关于 win32 内核 limits 的博客,了解单个线程有多大,以及使用了多少开销。

    .NET 线程使用多少资源很难预测。我猜,不多。

    【讨论】:

      【解决方案3】:

      内存开销(在 RAM 中)将是一个内存页。所以(取决于您的平台)这可能是 4KB。

      两者的默认堆栈大小均为 1MB。然而,这只是虚拟内存,所以除非使用它,否则没有 RAM 开销。

      【讨论】:

      • 托管代码并非如此。 CLR 总是预先提交托管线程的线程堆栈,因此对于 CLR 线程,堆栈是根据提交限制计算的。当然,在被触摸之前,这仍然不是物理内存。
      • 这就是我写的(或想写的)。我澄清了答案以明确它描述的是 RAM 开销。
      【解决方案4】:

      根据前面的答案,基本开销是每个线程 1MB。我不会讨论各种细微差别 - 其他答案已经涵盖了它们。

      对于 Microsoft Visual C/C++ 线程,您还拥有按需分配(并使用线程本地存储 TlsAlloc() 存储)的任何 C 运行时工作区的每个线程开销,以执行诸如 sprintf()、scanf( )、strtol() 等。我没有任何确切的数字 - 您需要将源扫描到 Microsoft CRT 来计算。

      对于其他 C/C++ 运行时 (gcc/g++/borland/digital mars),可能会或可能不会保存类似的每线程数据,这是一个实现细节。

      我们都不知道 .Net 执行引擎的内部结构,但那里可能也存储了一些每个线程的数据。不过很难弄清楚开销是多少。

      【讨论】:

        猜你喜欢
        • 2014-02-14
        • 2016-04-15
        • 1970-01-01
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 2017-02-20
        • 2015-05-22
        相关资源
        最近更新 更多