[英]Is the Channel 9 explanation of Tasks vs. Threads correct?
有一个Channel 9 Video试图解释线程和任务之间的区别。 我通常喜欢第 9 频道的视频,因为它们的技术准确性,但据我所知,这个视频的一些关键陈述是错误的。
以下是声明:
以下是我想确认或否定的想法:
调用堆栈的数量是可配置的。 这样,对于 32 位进程,线程限制不是 ~1300,而是高达 12000。 那些拥有 SysInternals TestLimit 副本的人可以尝试一下:
D:\\>testlimit -t -n 64 Testlimit v5.04 - test Windows limits By Mark Russinovich - www.sysinternals.com Creating threads with 64 KB stacks... Created 12500 threads. Lasterror: 8
任务依赖于线程作为基础。 那些线程是从线程池中取出来的,但是,线程池的线程需要先创建后才能使用。 AFAIK,Mark Russinovich 在 Windows Internals 一书中也解释过,内核结构( _ETHREAD
)保存在内存中以供重用。 这最大限度地减少了分配的开销并将其减少到初始化。
我没有找到我正在寻找的确切位置,但在 Windows Internals 6,第 1 部分中,它在第 417 页上说:
[...] 执行线程对象可能会或可能不会被释放。
由于 Task 依赖于线程作为技术实现,因此无论如何都会发生上下文切换。
如果我有 2 个线程,它们也可以在不同的处理器上执行。 恕我直言,这就是它的全部想法。
演讲者正在讨论单核系统上的线程。 恕我直言,在这种情况下,任务也几乎没有任何好处。 见 4。)
见 4. 和 5。)
幻灯片可能是正确的,但它没有显示出真正的原因。 该幻灯片缺少导致上下文切换的 ~15 ms 时间片。 如果线程需要等待结果,则只能使用任务来减少开销。
在这种情况下,幻灯片的下半部分也不正确,因为工作 1 的第一部分似乎被阻塞,在这种情况下,工作 2 只能执行。 当工作 2 完成时,可能满足继续工作 1 的条件。 只有当所有这些都发生在一个时间片内时,任务才有好处。
无论如何,任务也迟早会发生上下文切换。
我已经尝试在 SO 上的这些问题的帮助下确认我的理解
以上可能看起来像是 7 个单独的问题。 我在一处询问了他们,因为
注意:还没有观看视频,纯粹基于 OP 中的信息。
调用堆栈的数量是可配置的。
可能,但不是真正相关,除非我们进入非常详细的细节。
对于 .NET 任务依赖于线程作为基础。 那些线程是从线程池中取出来的,但是,线程池的线程需要先创建后才能使用。
有点正确……尽管我们需要在抽象和实现之间保持非常清晰的界限。 任务可以使用.Net中的Threadpool来执行更正确。
任务代表了一个自包含代码段的想法,它(通常)可以与其他代码并发运行。 线程是类似性质的操作系统实现。
由于 Task 依赖于线程作为技术实现,因此无论如何都会发生上下文切换。
不正确。 虽然任务可以在线程上运行,并且可以发生上下文切换,但任务包含一个提供更多灵活性的抽象层。
例如,要在线程之间交换执行,必须在硬件中进行上下文切换。 要在任务之间交换执行,不必发生此类硬件上下文切换。 任务可以在不同线程之间移动、休眠和恢复,无需单个硬件上下文切换。
如果我有 2 个线程,它们也可以在不同的处理器上执行。 恕我直言,这就是它的全部想法。
正确的。
演讲者正在谈论单核系统上的线程。 恕我直言,在这种情况下,任务也几乎没有任何好处。
不正确。 任务在单线程系统上运行良好,因为它们只是一个抽象。 此外,您可以在单个线程中运行多个任务,而无需任何硬件上下文切换,这可能会提高性能。
这里的主要概念问题似乎是 Task = Thread 的想法。 不是这种情况。 任务是分解工作的概念方式。 线程是具有某些行为特征的类似想法的实现。 虽然任务可以在幕后线程上运行(不一定),但抽象允许它们以与硬件线程非常不同的方式运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.