繁体   English   中英

第 9 频道对任务与线程的解释是否正确?

[英]Is the Channel 9 explanation of Tasks vs. Threads correct?

有一个Channel 9 Video试图解释线程和任务之间的区别。 我通常喜欢第 9 频道的视频,因为它们的技术准确性,但据我所知,这个视频的一些关键陈述是错误的。

以下是声明:

  1. @~1:48 到 ~2:30:线程在内存和时间上都很昂贵。 每个线程获得 1 MB 的用户模式堆栈。
  2. @~2:30 到 2:37:创建线程也需要时间。 是时候分配数据结构并初始化它们了。
  3. @~2:38 到 2:45:上下文切换也需要时间。
  4. @~2:58 到 3:23 和 3:48 到:任务使用多核系统 [...] 因此,当您进行计算时,您使用的是多核。
  5. @~5:02 到 5:30:线程在单核上运行,上下文切换发生很多。
  6. @~5:40 到 5:51:线程有不同的执行方式。 它们在多个内核上执行。
  7. @~6:20 到 6:30:正如您在图中看到的,线程处理有开销。

以下是我想确认或否定的想法:

  1. 调用堆栈的数量是可配置的。 这样,对于 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

    堆栈大小也在.NET线程构造函数中公开

  2. 任务依赖于线程作为基础。 那些线程是从线程池中取出来的,但是,线程池的线程需要先创建后才能使用。 AFAIK,Mark Russinovich 在 Windows Internals 一书中也解释过,内核结构( _ETHREAD )保存在内存中以供重用。 这最大限度地减少了分配的开销并将其减少到初始化。

    我没有找到我正在寻找的确切位置,但在 Windows Internals 6,第 1 部分中,它在第 417 页上说:

    [...] 执行线程对象可能会或可能不会被释放。

  3. 由于 Task 依赖于线程作为技术实现,因此无论如何都会发生上下文切换。

  4. 如果我有 2 个线程,它们也可以在不同的处理器上执行。 恕我直言,这就是它的全部想法。

  5. 演讲者正在讨论单核系统上的线程。 恕我直言,在这种情况下,任务也几乎没有任何好处。 见 4。)

  6. 见 4. 和 5。)

  7. 幻灯片可能是正确的,但它没有显示出真正的原因。 该幻灯片缺少导致上下文切换的 ~15 ms 时间片。 如果线程需要等待结果,则只能使用任务来减少开销。

    在这种情况下,幻灯片的下半部分也不正确,因为工作 1 的第一部分似乎被阻塞,在这种情况下,工作 2 只能执行。 当工作 2 完成时,可能满足继续工作 1 的条件。 只有当所有这些都发生在一个时间片内时,任务才有好处。

    无论如何,任务也迟早会发生上下文切换。

我已经尝试在 SO 上的这些问题的帮助下确认我的理解

以上可能看起来像是 7 个单独的问题。 我在一处询问了他们,​​因为

  • 在一个视频中都有他们的来源
  • 有些问题相互依赖
  • 恕我直言,在一个地方找到信息比遵循一次提出一个问题的 SO 规则更重要。

注意:还没有观看视频,纯粹基于 OP 中的信息。

调用堆栈的数量是可配置的。

可能,但不是真正相关,除非我们进入非常详细的细节。

对于 .NET 任务依赖于线程作为基础。 那些线程是从线程池中取出来的,但是,线程池的线程需要先创建后才能使用。

有点正确……尽管我们需要在抽象和实现之间保持非常清晰的界限。 任务可以使用.Net中的Threadpool来执行更正确。

任务代表了一个自包含代码段的想法,它(通常)可以与其他代码并发运行。 线程是类似性质的操作系统实现。

由于 Task 依赖于线程作为技术实现,因此无论如何都会发生上下文切换。

不正确。 虽然任务可以在线程上运行,并且可以发生上下文切换,但任务包含一个提供更多灵活性的抽象层。

例如,要在线程之间交换执行,必须在硬件中进行上下文切换。 要在任务之间交换执行,不必发生此类硬件上下文切换。 任务可以在不同线程之间移动、休眠和恢复,无需单个硬件上下文切换。

如果我有 2 个线程,它们也可以在不同的处理器上执行。 恕我直言,这就是它的全部想法。

正确的。

演讲者正在谈论单核系统上的线程。 恕我直言,在这种情况下,任务也几乎没有任何好处。

不正确。 任务在单线程系统上运行良好,因为它们只是一个抽象。 此外,您可以在单个线程中运行多个任务,而无需任何硬件上下文切换,这可能会提高性能。


这里的主要概念问题似乎是 Task = Thread 的想法。 不是这种情况。 任务是分解工作的概念方式。 线程是具有某些行为特征的类似想法的实现。 虽然任务可以在幕后线程上运行(不一定),但抽象允许它们以与硬件线程非常不同的方式运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM