多线程:与内核相比,多线程的意义何在?

我认为多核计算机的意义在于它可以同时运行多个线程。 在这种情况下,如果你有一台四核机器,一次运行4个以上的线程有什么意义? 他们不是在偷对方的时间吗?


仅仅因为线程存在并不总是意味着它正在运行。 线程的许多应用程序都涉及一些线程进入休眠状态,直到他们需要做某些事情 - 例如,用户输入触发线程唤醒,进行一些处理并重新进入睡眠状态。

实质上,线程是可以独立运行的独立任务,无需了解其他任务的进度。 这很有可能比你有能力同时运行更多。 即使他们有时必须排队等候,他们仍然对方便有用。


答案围绕线程的目的进行,这是并行性的:一次运行多个独立的执行线。 在一个'理想'系统中,每个核心可以执行一个线程:不中断。 实际情况并非如此。 即使你有四个内核和四个工作线程,你的进程和它的线程也会不断被切换到其他进程和线程。 如果你正在运行任何现代操作系统,每个进程至少有一个线程,而且有更多。 所有这些进程一次运行。 你现在可能有几百个线程都在你的机器上运行。 你永远不会得到一个线程运行没有时间'偷'的情况。 (好吧,如果你正在使用实时操作系统,或者即使在Windows上,也可以使用实时线程优先级,但如果它实时运行的话,你可能会遇到这种情况,但这很少见。)

以此为背景,答案是肯定的,一台真正的四核机器上有四个以上的线程可能会给你一个'彼此窃取时间'的情况, 但前提是每个线程都需要100%的CPU 。 如果一个线程不能正常工作(因为UI线程可能不是,或者一个线程正在做少量工作或等待其他事情),那么正在调度的另一个线程实际上是一个好的情况。

这实际上比这更复杂:

  • 如果你有五项工作需要一次完成,那该怎么办? 一次运行它们比运行其中的四个更有意义,然后再运行第五个。

  • 一线程真的需要100%的CPU很少见。 例如,它使用磁盘或网络I / O时,可能会花费时间等待没有用处。 这是一个非常普遍的情况。

  • 如果你有需要运行的工作,一个共同的机制是使用一个线程池。 线程数量与内核数量相同似乎有意义,但.Net线程池每个处理器最多有250个线程可用。 我不确定他们为什么要这样做,但我的猜测是要处理在线程上运行的任务的大小。

  • 因此:窃取时间并不是一件坏事(也不是真正的盗窃行为,也就是说系统应该如何工作)。根据线程将执行的工作类型编写多线程程序,这可能不是CPU -界。 根据性能分析和测量结果计算出您需要的线程数量。 你可能会发现从任务或工作而不是线索的角度思考更有用:编写工作对象并将它们提供给池来运行。 最后,除非你的程序是真正关键性能的,否则不要太担心:)


    重点在于,尽管在线程数超过内核数时没有得到任何实际的加速,但您可以使用线程来分离不应该相互依赖的逻辑块。

    在一个中等复杂的应用程序中,使用单个线程尽可能快地完成所有代码的'流'散列。 单线程花费大部分时间来轮询,检查它,根据需要有条件地调用例程,除了细节之外,很难看到任何东西。

    将此与您可以将线程专用于任务的情况相对比,以便查看任何单个线程时,您可以看到该线程正在执行的操作。 例如,一个线程可能会阻塞等待来自套接字的输入,将该流解析为消息,过滤消息,并在有效消息出现时将其传递给其他工作线程。 工作者线程可以处理来自许多其他来源的输入。 它们中的每一个的代码将展现出一个干净而有意义的流程,而不必进行明确的检查,以确定没有其他事情要做。

    通过这种方式对工作进行分区,您的应用程序可以依靠操作系统来安排CPU的下一步工作,因此您无需在应用程序的任何地方进行明确的条件检查,以了解哪些内容可能会被阻止,哪些内容可以处理。

    链接地址: http://www.djcxy.com/p/36867.html

    上一篇: Multithreading: What is the point of more threads than cores?

    下一篇: How do SMP cores, processes, and threads work together exactly?