线程和进程与多线程和多核/多处理器:它们是如何映射的?

54

我很困惑,但是下面的讨论解决了我的疑惑:

多进程,多线程,超线程,多核

但它从硬件角度回答了问题。我想知道这些硬件特性如何映射到软件上?

一个显而易见的事情是,MultiProcessor(= Mutlicpu)和MultiCore之间没有区别,除了在多核系统中,所有CPU都驻留在一个芯片(Die)上,而在Multiprocessor中,所有CPU都在自己的芯片上,并相互连接。

因此,mutlicore/multiprocessor系统能够同时执行多个进程(火狐浏览器、mediaplayer、googletalk)(与在单处理器系统上进行上下文切换不同)。对吗?

如果正确,到目前为止我就清楚了。但当多线程出现时,就会产生困惑。

  1. 多线程是用于并行处理的。对吗?

  2. 在 CPU 内部,哪些元素涉及到多线程?有没有图示?为了利用两个独立任务的并行处理能力,CPU 需要满足什么要求?

  3. 当人们说线程的上下文切换时,我不太明白。因为如果是线程的上下文切换,那就不是并行处理了。线程必须“严格同时”执行。对吗?

    我对多线程的理解是: 考虑一个只有单个 CPU 的系统。当进程上下文切换到 Firefox(假设)时,Firefox 中的每个选项卡都是一个线程,并且所有线程都在严格同时执行。不像一个线程执行了一段时间,然后另一个线程再执行,直到到达上下文切换时间。

  4. 如果我在无法处理线程的处理器上运行多线程软件会发生什么?我的意思是,CPU 如何处理这样的软件?

  5. 如果一切顺利,现在的问题是:有多少个线程?我猜这必须受硬件的限制,对吗?如果硬件只支持 2 个线程,而我启动 10 个线程在我的进程中,CPU 会如何处理它?优缺点是什么?从软件工程的角度考虑,当开发将由用户在各种系统中使用的软件时,我该如何决定是否采用多线程?如果是,要有多少个线程?

7个回答

55

首先,尝试理解“进程”和“线程”的概念。线程是执行的基本单元:线程由操作系统调度并由CPU执行。进程是一种容器,可以持有多个线程。

  1. 是的,无论是多处理或多线程都是为了并行处理。更确切地说,是为了利用线程级并行性。

  2. 好的,多线程可能意味着硬件多线程(一个例子是HyperThreading)。但是,我假设你只是在软件中说多线程。在这种情况下,CPU应支持上下文切换。

  3. 即使在物理上单核心的情况下,实现多任务处理也需要上下文切换。

  4. 假设有两个物理内核和四个非常繁忙的线程。在这种情况下,有两个线程正在等待机会使用CPU。请阅读一些与抢占式OS调度相关的文章。

  5. 物理并发运行的线程数量与逻辑处理器的数量相同。您正在询问OS文献中的一般线程调度问题,例如循环调度。

强烈建议您首先学习操作系统的基础知识。然后再研究多线程问题。看起来您仍然不清楚关键概念,如上下文切换和调度。这可能需要几个月的时间,但如果您真的想成为计算机软件方面的专家,那么您应该了解这些非常基本的概念。请参考任何有关操作系统的书籍和讲义。


8
好的,我将尽力以最简明扼要的方式翻译以下内容,保持原意不变。+1 但是有一个语义问题:“5. The number of... concurrent is just identical to # of logical processors." 应该改为“_simultaneously_”。当存在切换时,多个线程在单个逻辑处理器上执行并发。 - Steven Evers
2
@StevenEvers:可以同时运行的线程数量与物理核心数相同。假设我们的处理器只有2个核心,每个核心有2个线程(超线程)。因此,总共有2个物理核心或4个逻辑核心。与非超线程相比,这种架构利用率更高,速度也更快,但至少在核心方面并不真正“同时”。 - Chau Pham
在每个核心中,它确实有2条管线,每条管线都为1个线程。这2个线程可以同时进入2条管线,但在执行时(例如,等待其核心上的数学处理器运行),这2个线程必须等待自己的轮次。 - Chau Pham
请澄清一下,如果我有两个逻辑核心,那么有两种情况可以使两个核心最大化利用,对吗?A)两个单线程进程,B)一个进程有两个线程。 A和B等同于核心吗? - zzzzzzz

17

在同一核心上运行的线程并不是技术上的并行。它们只是看起来同时执行,因为CPU在它们之间非常快地切换(对于人类而言)。这种切换被称为上下文切换。

现在,在不同核心上执行的线程是并行执行的。大多数现代CPU都有许多个核心,然而,大多数现代操作系统(如Windows、Linux以及其他操作系统)通常执行更多数量的线程,这仍然会导致上下文切换。

即使没有执行用户程序,操作系统本身也会执行维护工作的上下文切换。
这应该回答了1-3的问题。

关于第4点:基本上,每个处理器都可以处理线程。这更多地是操作系统的特性。线程基本上包括:内存(可选)、堆栈和寄存器,一旦这些内容被替换,您就在另一个线程中了。

第5点:线程数量相当高,并且由操作系统限制。通常比普通程序员能够成功处理的数量要高 :) 线程的数量取决于您的程序:

它是否受I/O的限制?

  • 任务是否可以分解成许多较小的任务?
  • 任务有多小?任务可能太小而不值得创建线程。
  • 同步:如果需要大量的同步,则惩罚可能太重,您应该减少线程数。

线程数量非常高,受操作系统限制。通常比普通程序员可以成功处理的要高:D :D - Laxmikant Ratnaparkhi

6
多线程是一个进程中独立的“命令链”。从CPU的角度来看,线程就像进程一样。每个线程都有自己独立的寄存器集和堆栈。
之所以可以拥有更多线程而不需要更多CPU,是因为大多数线程并不总是需要CPU。线程可能在等待用户输入、从网络下载或写入硬盘。当它在执行这些操作时,并不需要CPU,所以CPU可以用来执行其他线程。
在Firefox浏览器中,每个选项卡可能会拥有几个线程甚至共享一些线程。例如,你需要一个线程进行下载、一个线程渲染页面、一个消息循环线程(处理用户输入),也许还需要一个线程来运行JavaScript。这些线程不能轻易地合并,因为在下载时仍需要响应用户的输入。但是,下载线程大部分时间都在睡眠状态,即使在下载时也只需要偶尔使用CPU,而消息循环线程只在按下按钮时才会唤醒。
如果你打开任务管理器,你会发现尽管有这些线程,CPU的使用率仍然很低。
当然,如果所有线程都执行一些需要大量计算的任务,那么你不应该创建太多线程,因为你不会得到性能上的好处(尽管可能存在架构上的优势!)。但是,如果线程主要受I/O限制,那么应根据你的架构创建尽可能多的线程。如果不了解你的具体任务,则很难给出建议。

3
  1. 大体上来说是可以的,但“并行”可能意味着不同的事情。

  2. 这取决于你想要同时运行哪些任务。

  3. 不一定。有些(甚至大多数)线程会花费大量时间在空闲状态。可以切换到一个想要执行任务的线程。

  4. 操作系统负责线程切换。如果需要,它将委派给不同的核心。如果只有一个核心,则将时间分配给不同的线程和进程。

  5. 线程的数量受软件和硬件的限制。线程消耗处理器和内存,在执行任务时消耗的资源程度不同。线程管理软件也可能会强加自己的限制。


3
重要的是要记住逻辑/虚拟并行和实际/硬件并行之间的分离。在您平均的操作系统中,会执行系统调用来生成一个新线程。它实际发生的事情(无论是映射到不同的核心、相同核心上的不同硬件线程,还是排队到软件线程池中)取决于操作系统。
1. 并行处理使用所有方法,而不仅仅是多线程。 2. 一般来说,如果您想进行真正的并行处理,需要在硬件上执行。以Niagara为例,它有高达8个内核,每个内核都能够在硬件上执行4个线程。 3. 当线程数超过硬件并行能力时,需要进行上下文切换。即使在串行执行时(在一个线程之间切换到下一个线程),它们也被认为是并发的,因为切换的顺序没有保证。所以,它可能是T0、T1、T2、T1、T3、T0、T2等。就所有目的而言,这些线程都是并行的。 4. 时间片轮转。 5. 那将取决于操作系统。

3
多线程是指同时执行多个线程。它可以在单核处理器和多核处理器系统上发生。对于单处理器系统,上下文切换会影响它。看!在这种计算环境中,上下文切换是指操作系统进行时间片分配。因此不要混淆。操作系统控制其他程序的执行,并允许一个程序在 CPU 上执行。但是线程在 CPU 中的切换频率决定了系统所展示的并行性的透明度。
在多核环境中,每个核心执行一个线程时就会出现多线程。虽然在多核环境中,单个核心中也可能发生上下文切换。

2
我认为目前的答案基本上都很到位,给了你一个很好的基本背景。实际上,假设你有四核处理器,但每个核心都能够执行两个并行线程。
请注意,如果您在1个核心上运行2个并行线程与垂直运行第1个线程,然后再运行第2个线程相比,速度只会略微增加(或没有增加)。然而,每个物理核心都会为您的一般工作流程增加速度。
现在,假设您的操作系统上正在运行具有多个线程的进程(即需要“并行”运行多个任务),并且具有队列中的某些任务堆栈(或具有优先级规则的其他系统)。然后软件将任务发送到队列,您的处理器尝试尽快执行它们。现在有两种情况:
  1. 如果软件支持多处理,则任务将发送到任何可用处理器(未做任何事情或仅完成某些其他工作并且从软件发送的工作是队列中的第一项)。
  2. 如果您的软件不支持多处理,则所有工作都将以类似的方式完成,但仅由一个核心完成。
我建议阅读维基百科的线程页面。那里的第一张图片已经给你一个很好的了解。 :)

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