gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:01:30 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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