gpt4 book ai didi

c# - 堆栈和堆分配

转载 作者:IT王子 更新时间:2023-10-29 04:20:42 27 4
gpt4 key购买 nike

我正在深入研究内存模型,并且正在努力了解一个进程中存在多少堆。

因此,如果我们有 1 个进程,其中有 5 个线程,我说我们有 5 个堆栈和 1 个堆是否正确?

如果是这样,线程是否可以访问彼此的堆栈(或者这就是为什么它们有单独的堆栈,以防止损坏),如果只有 1 个堆,那么显然它们都访问这个堆,因此需要锁定多线程?我的理解正确吗?

最佳答案

是的,每个线程都有自己的堆栈。这是非常必要的,堆栈会跟踪方法完成后返回的位置,它存储返回地址。由于每个线程都执行自己的代码,因此它们需要自己的堆栈。局部变量和方法参数也存储在那里,使它们(通常)是线程安全的。

堆的数量是一个更复杂的细节。您正在为垃圾收集堆计数 1。从实现的角度来看,这并不完全正确,三代堆加上大对象堆在逻辑上是不同的堆,加起来最多为四。当您分配太多时,此实现细节开始变得重要。

另一个在托管代码中不能完全忽略的是存储静态变量的堆。它与 AppDomain 相关联,只要 AppDomain 存在,静态变量就会存在。在 .NET 文献中通常称为“加载程序堆”。它实际上由 3 个堆(高频堆、低频堆和 stub 堆)组成,其中也存储了 jitted 代码和类型数据,但这已经进入了本质。

在忽略列表的下方是 native 代码使用的堆。从编码(marshal)级很容易看到其中两个。有一个默认进程堆,Windows 从中分配,Marshal.AllocHGlobal() 也是如此。还有一个单独的堆,COM 在其中存储数据,Marshal.AllocCoTaskMem() 从中分配数据。最后,您与之互操作的任何 native 代码都将拥有自己的堆来支持其运行时。此类代码使用的堆数量仅受加载到进程中的 native DLL 数量的限制。所有这些堆都存在,您几乎不会直接处理它们。

因此,最少 10 个堆。

关于c# - 堆栈和堆分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11189932/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com