C#中任务栈分配在哪里?

eoc*_*ron 5 c# multithreading

我们都知道Task.Run或Parallel.ForEach等方法 它们中的每一个都会创建根据单独线程或线程池中的线程中的选项运行的任务。但是,他们的堆栈位于哪里?在某些生成堆中或者有特殊的地方适合它们?

例如,我可以创建 1000 个任务,它们的堆栈驻留在哪里?如果我调用 GC.Collect(),它们的物理地址会在某个时刻移动吗?

Han*_*ant 5

堆栈是纯粹的非托管实现细节。处理器需要一个堆栈来完成任何事情,没有它就无法有意义地执行任何代码。它与线程紧密相关,这是普通 CLR 主机上的另一个纯粹的非托管细节。

它位于操作系统内核在创建线程时决定分配它的内存中,它是随机的。为了让恶意软件难以应对,堆栈是故意随机的,是将数据转化为恶意代码的一种有吸引力的方式。不仅位置是随机的,堆栈开始的堆栈段内的确切偏移量也是随机的。

它在创建后就不再移动,GC 不会修改它。它确实需要知道这一点,对象根可以存储在堆栈上。因此,可靠的堆栈遍历是 .NET 的硬性要求,也是当程序因未处理的异常而终止时 CLR 始终能够生成良好堆栈跟踪的基本原因。堆栈空间耗尽是一个严重的问题,处理器无法继续执行代码。严重到可以在这个问题之后命名一个程序员的网站:)