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

标签 c# multithreading

我们都知道 Task.RunParallel.ForEach 等方法。 它们中的每一个都创建任务,这些任务根据单独线程中的选项或线程池中的线程中的选项运行。但是,他们的堆栈在哪里?在某些代堆中还是有专门的地方放它们?

例如,我可以创建 1000 个任务,它们的堆栈位于何处?如果我调用 GC.Collect(),他们的物理地址会在某个时候移动吗?

最佳答案

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

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

它在创建后永远不会移动,GC 不会修补它。它确实需要了解它,对象根可以存储在堆栈中。因此,可靠的堆栈遍历是 .NET 的硬性要求,也是当程序因未处理的异常而死时 CLR 始终可以生成良好堆栈跟踪的基本原因。堆栈空间用完是一个严重的问题,处理器无法继续执行代码。严重到可以用那个问题来命名程序员的网站 :)

关于c# - C#中的任务栈分配在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38788238/

相关文章:

Java:定期从线程向主类发送数据

c# - 不断检查服务器是否正在使用C#监听给定的端口

c++ - 如何在单个客户端上同时在 UDP 套接字上接收和发送数据

c# - Monotouch SplitView 改变细节 View

c# - 混淆硬编码的许可证 key

c# - 用于 Linux 的 PInvoke GetWindowRect 等效项

c# - 如何在C#中将所有Excel工作表导入DataSet

Java 线程开销。我应该使用套接字还是套接字 channel ?

java - 如何获取线程的堆栈跟踪

c# - 连接两个整数