多线程和多核差异

时间:2012-08-06 19:58:21

标签: c++ multithreading multicore

我有几个小问题。

首先,多线程和多核之间有区别吗?它们是两个完全不同的东西,还是多线程在需要时使用多个核心?

其次大多数核心都有两个线程,但在分析我的应用程序时,我注意到许多不同的线程,从线程128到线程3460.什么决定了你的计算机有多少线程?

由于

4 个答案:

答案 0 :(得分:56)

  

首先,多线程和多核之间存在差异吗?

多线程和多核是适用于不同计算领域的不同术语。

  • 多核是指具有多个逻辑CPU核心并且可以同时物理执行多个指令的计算机或处理器。计算机的“核心数”是计算机拥有的核心总数:计算机可能有多个处理器,每个处理器可能有多个核心;核心数是所有处理器上的核心总数。

  • 多线程是指一种程序,它可以通过同时运行多个核心来利用多核计算机。通常,两倍的内核等于计算能力的两倍(对于支持多线程的程序),尽管有些问题受CPU使用率以外的因素限制;这些问题不会带来多线程带来的巨大收益。

    重要的是要注意性能不是程序使用多个线程的唯一原因。稍后会详细介绍。

  

它们是两个完全不同的东西,还是多线程在需要时使用多个核心?

他们是相关的,但是是分开的。

支持多线程的程序可以使用多个核心(如果有多个核心可用)。

  

大多数核心都有两个线程,但在分析我的应用程序时,我注意到许多不同的线程,从线程128到线程3460.

操作系统会分配线程编号,以便跟踪它们。

您将运行的大多数程序不需要同时运行3400个线程。此外,正在运行的线程将消耗所有核心。 CPU始终以100%运行的唯一原因是操作系统知道如何暂停处理器,这基本上使它停止所有事情并等到事情发生(例如IO事件或时钟滴答)。一次只能在核心上运行一个线程。运行的不同线程实际上只是线程跳转到CPU并在短时间内运行,然后与其他需要运行的线程一起切换。

  

什么决定了您的计算机有多少个线程?

所有进程中的线程总数。此外,大多数操作系统都会施加硬限制,即无法超越的现有线程的最大数量。

进程是一个程序(你可能知道这个)。多线程是每个进程拥有多个线程的过程(许多进程不会生成多个线程,因为它们不需要)。 Windows对你可以创建的线程数量没有硬性限制(至少,不是自XP以来。不会对w98和之前的内容有任何说法),但当然你可以制作的线程数量受到多少内存的限制你有。

  

你说有些程序使用多个线程是出于性能以外的原因。

有时很高兴能够进行多任务,即使不是同时进行。

有时程序需要在特定时间执行特定的操作。通常引用的示例是具有可见窗口的程序。该程序可能正在进行强烈的背景数字处理,但如果它仍然可以响应用户事件,例如单击按钮并调整其大小,则会受益。这可以通过异步处理来完成,这将需要您的一个线程重复检查GUI工作是否需要间隔执行,暂停它正在执行的操作以及处理GUI一段时间。很多事情都是这样做的。

另一种可能更好的处理方式是使用线程。您的程序不必担心在数字运算和GUI管理之间来回切换,操作系统将为您管理。即使您只有一个核心,您仍然可以运行多个线程,并且您的操作系统将尽最大努力确保所有正在运行的进程中的所有正在运行的线程都能获得相当大的CPU时间。

答案 1 :(得分:6)

核心数和线程数是分离的。您可以在单个核心上运行许多线程,并且您可以在尽管存在更多核心的情况下只运行一个线程的情况(尽管我无法想到会发生这种情况的真实场景)。假设多核是硬件特性,而线程数是操作系统领域及其上运行的进程。

当然,对于单核,您不能有多个并发运行的线程。操作系统必须不断在线程之间来回切换。

答案 2 :(得分:4)

在单个核心上进行线程处理通常意味着您可以创建x个线程,并且每个线程都将被赋予设定的运行时间(线程量程)。当线程被切换时,这被称为上下文切换,所有这些都需要一些时间,因此需要进行一些基准测试以找到每个核心的理想线程数。

如果大部分工作都是cpu绑定的,那么产生数百个线程几乎没有什么意义,因为这不太可能提高性能(实际上可能会让它更糟糕,记住上下文切换不是免费的)。但是,对于I / O绑定工作这样做可能会有所帮助,因为当系统忙于完成这项工作时,可以给另一个线程提供CPU时间。

拥有物理附加内核意味着可以在硬件级别真正并行运行两件事。

答案 3 :(得分:4)

  

大多数核心都有两个线程

在这里,我认为你混淆了重载的术语“线程”。正如其他答案正确指出的那样,线程通常指的是“软件”概念。但有时它也被用作“硬件”概念。当“核心”有两个“线程”时(就像许多新的英特尔芯片一样),这意味着核心可以运行两个并行线程,就像有两个核心一样。然而,这通常被称为超线程。参见:

http://en.wikipedia.org/wiki/Hyper-threading

因此,如果您有N个线程(我的意思是软件线程,在您的应用程序中创建的线程,或者只是通过同时运行不同的应用程序)和M个处理器(作为核心,或上面解释的硬件线程),会发生以下情况: :

  • N< = M:然后操作系统应该为每个线程分配不同的 处理器。然后应用程序线程真正并行运行。
  • N> M:然后一些线程必须共享处理器。