多线程和多核的区别

63

我有几个小问题。

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

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

谢谢


57
你不小心问了一个很大的问题。 - Wug
13
据我所知,只有微软Outlook具备完全独占PC所有线程的能力...这将使其他所有操作变得无效。 - Inisheer
8
@JTA:你的评论很有趣,但是错误。Internet Explorer 也可以做到这一点。 - Wug
1
线程是关于编程的;核心是关于硬件的。你正在比较苹果和野兔。 - Kerrek SB
请查看这篇 Stack Overflow 帖子(点击第一个答案中的链接以阅读文章)https://dev59.com/wHRA5IYBdhLWcg3w1BqW - Miek
4个回答

100

首先,多线程和多核之间有什么区别吗?

有区别。

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

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

  • 多线程指能够利用多核计算机同时运行在多个内核上的程序。通常而言,两倍于核心数等于两倍于计算能力(对于支持多线程的程序),尽管某些问题受到除CPU使用率以外其他因素的限制;这些问题不会像多线程那样获得如此显著的增益。

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

它们是两种完全不同的东西,还是多线程需要多个核心才能工作?

它们是相关但不同的概念。

支持多线程的程序可以利用多个可用的核心。

大多数内核有两个线程,但在分析我的应用程序时,我发现了许多不同的线程,从第128线程到第3460线程。

操作系统分配线程号码以便于跟踪它们。

大多数程序不需要同时运行3400个线程。另外,正在运行的线程将消耗一个核心的所有资源。你的CPU之所以不会一直运行到100%是因为操作系统知道如何暂停处理器,使其停止一切并等待某些事件发生(例如IO事件或时钟滴答声)。每次只能在一个核心上运行一个线程。实际上,不同的线程运行只是线程短时间跳转到CPU上运行,然后被其他需要运行的线程替换。

是什么决定了计算机有多少线程?

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

进程是一个程序(您可能已经知道了)。多线程是指每个进程有多个线程(许多进程不会使用多个线程,因为它们没有必要)。Windows没有线程数量的硬性限制,你可以创建的线程数受到可用内存的限制。

你说有些程序使用多个线程的原因并非出于性能考虑?

有时候即使不是同时进行,也可以同时进行多项任务。

有时候程序需要在特定的时间做特定的事情。一个常见的例子是带有可见窗口的程序。那个程序可能在进行强烈的后台数字计算,但如果它仍然可以响应用户事件,如点击按钮和调整大小,那么它会受益。这可以通过异步处理来实现,需要你的一个线程在间隔一段时间后反复检查GUI工作,暂停正在进行的工作,并处理GUI一段时间。许多东西都是这样做的。

处理这个问题的另一种可能更好的方式是使用线程。你的程序不必担心在数值计算和GUI管理之间来回切换,操作系统会为你管理它。即使你只有一个核心,你仍然可以运行多个线程,你的操作系统会尽力确保所有正在运行的进程中的所有运行线程都能公平获得CPU时间。


多线程即使没有多个核心仍然很方便,而且(我相信)多个核心即使没有多个线程也很方便。你的回答暗示了相反的情况。此外,提到多任务可能也不错。 - Mooing Duck
最后一位涵盖了没有多个核心的多个线程。没有多个线程的多个核心并不方便,事实上是完全无用的。值得庆幸的是,现代操作系统有足够的任务来忙碌自己,从来没有只有一个进程和一个线程在运行,如果有的话,一个核心将被使用,其他所有核心都将闲置。 - Wug
1
每个核心都可以运行一个单独的进程,还是它们都绑定在同一个进程上? - Mooing Duck
1
他们可以,但如果只有一个线程(在整个系统中总共),其他核心只是昂贵的加热器。 :) - Wug
假设我从“主线程”创建了另一个“新线程”来执行某些操作。并且假设我们的机器有2个核心(CPU)。我们能保证主线程在核心1上运行,而新线程在核心2上运行吗? - Jin Lim
显示剩余2条评论

12
大多数内核都有两个线程。
在这里,我认为您混淆了过载的术语“线程”。正如其他答案所指出的一样,线程通常是一个“软件”概念。但有时它也被用作“硬件”概念。当一个“内核”具有两个“线程”(就像许多新的英特尔芯片一样)时,这意味着该内核可以运行两个并行线程,就像有两个内核一样。然而,这通常被称为超线程。请参见: http://en.wikipedia.org/wiki/Hyper-threading 因此,如果您有N个线程(我的意思是软件线程,这些线程在应用程序内部创建,或者仅通过同时运行不同应用程序来创建),以及M个处理器(即内核或上面解释的硬件线程),则会发生以下情况:
- N ≤ M:那么操作系统应该为每个线程分配不同的处理器。然后应用程序线程真正并行运行。 - N > M:那么一些线程必须共享一个处理器。

在相关背景下,可以查看https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html,其中vCPU代表超线程核心,使得该功能能够在EC2中实现。 - codarrior

12

核心数和线程数是解耦的。你可以在单个核心上运行许多线程,也可能出现只有一个线程运行的情况,尽管我想不到这种情况会在现实生活中发生。可以说多核是硬件特性,而线程数是操作系统及其运行的进程领域内的内容。

当然,在单个核心上你不能同时运行多个线程。操作系统必须不断地在线程之间切换。


5
补充一点,一个核心可以运行多个线程,这些线程似乎是同时运行的。然而,正如 juanchopanza 所述,CPU 实际上是在不断地在多个线程之间快速切换。这使得一切看起来都在并发运行。 - Inisheer
3
严谨地说,并发和并行是两个不同的概念。因此,在单个核心上可以同时运行多个线程。 - Jesse Good
此外,超线程允许两个线程(进程?)在单个核心中以非常细微的方式交替运行。 - Mooing Duck
你可以并发运行它,但不能并行运行。 - Ηλεκτρολόγος Μηχανικός

5
在单核处理器上进行多线程操作通常意味着您可以创建x个线程,并且它们每个都将被分配一定的运行时间(线程时间片)。当线程切换时,这被称为上下文切换,所有这些操作都需要一些时间,因此需要进行一些基准测试以找到每个核心的理想线程数。
如果大部分工作是CPU密集型,则没有必要产生数百个线程,因为这不太可能提高性能(实际上可能会使其变差,记住上下文切换并不是免费的)。但是,对于I/O密集型工作,这样做可能会有所帮助,因为在系统忙于执行此任务时,可以给另一个线程分配CPU时间。
拥有物理额外的核心意味着两个任务可以在硬件级别真正并行运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接