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

我很困惑,但接下来的线程清除了我的疑惑:

多处理,multithreading,超线程,多核

但它从硬件的angular度来处理查询。 我想知道这些硬件function如何映射到软件?

有一点很明显,MultiProcessor(= Mutlicpu)和MultiCore之间没有区别,除了多核以外,所有的cpus都驻留在一个芯片上(die),在多处理器中,所有的cpu都在自己的芯片上并连接在一起。

因此,mutlicore / multiprocessor系统能够在“sametime”执行多个进程(firefox,mediaplayer,googletalk)(不同于在单个处理器系统上切换这些进程的上下文)。

如果它正确。 我很清楚。 但是当multithreading出现时,会出现混乱。

  1. multithreading“是为了”并行处理。 对?

  2. 什么是在cpumultithreading中涉及的元素? 图? 对于我来说,利用并行处理两个独立任务的能力,CPU的要求是什么呢?

  3. 当人们说线程的上下文切换时。 我真的不明白。 因为如果它的线程的上下文切换,那么它不会并行处理。 线程必须“同时”执行。 对?

    我的multithreading概念是:考虑一个单CPU的系统。 当进程是上下文切换到Firefox。 (假设)firefox的每个标签都是一个线程,所有线程都严格同时执行。 不像一个线程已经执行了一段时间,然后又一个线程已经采取,直到上下文切换时间到达。

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

  5. 如果一切都很好,现在问题是多less线程? 我想呢,它必须受硬件限制? 如果硬件只能支持2个线程,并在我的进程中启动10个线程。 CPU将如何处理? 优点缺点? 从软件工程的angular度来看,在开发用户在各种系统中使用的软件的同时,如何决定是否应该去multithreading? 如果是这样,有多less个线程?

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

  1. 是的,多处理或multithreading是并行处理。 更确切地说,要利用线程级并行性。

  2. 好的,multithreading可能意味着硬件multithreading (一个例子是超线程)。 但是,我认为你只是说在软件multithreading。 在这个意义上,CPU应该支持上下文切换。

  3. 即使在物理上单个核心按时间分割也需要上下文切换来实现多任务处理

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

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

强烈build议你先学习操作系统的基础知识。 然后继续multithreading问题。 似乎你还不清楚关键的概念,如上下文切换和调度。 这将需要几个月,但如果你真的想成为计算机软件的专家,那么你应该知道这样的基本概念。 请采取任何操作系统的书籍和演讲幻灯片。

在同一个内核上运行的线程在技术上并不平行。 他们似乎只是并行执行,因为CPU之间切换非常快(对我们来说,人类)。 这个开关就是所谓的上下文切换。 现在,在不同内核上执行的线程并行执行。 大多数现代CPU都有一些内核,然而,大多数现代操作系统(windows,linux和friends)通常执行更多的线程,这仍然会导致上下文切换。 即使没有用户程序被执行,操作系统本身仍然执行上下文切换以进行维护工作。
这应该回答1-3。

关于4:基本上,每个处理器都可以使用线程。 它更是一个操作系统的特点。 线程基本上是:内存(可选),堆栈和寄存器,一旦被replace,你在另一个线程。

5:线程数量很高,受OS的限制。 通常它比普通程序员能够成功处理的更高:)线程的数量由程序决定:

是IO绑定?

  • 这个任务可以分成几个较小的任务吗?
  • 这个任务有多小? 任务可能太小,根本不值得产生线程。
  • 同步:如果需要广泛的同步,惩罚可能太重,你应该减less线程的数量。

多个线程在一个进程内是独立的命令链。 从CPU的angular度来看,线程或多或less就像进程一样。 每个线程都有自己的一套寄存器和自己的堆栈。

你可以拥有比CPU更多的线程的原因是大多数线程并不需要CPU。 线程可以等待用户input,从网上下载或写入磁盘。 虽然这样做,它不需要CPU,所以CPU可以自由执行其他线程。

在你的例子中,Firefox的每个标签可能甚至有几个线程。 或者他们可以分享一些线程。 你需要一个用于下载,一个用于渲染,一个用于消息循环(用户input),或许还有一个运行Javascript。 你不能轻易地将它们组合,因为当你下载你仍然需要对用户的input作出反应。 然而,下载线程大部分时间处于hibernate状态,即使在下载时也只是偶尔需要CPU,而按下button时消息循环线程才会唤醒。

如果你去任务pipe理器,你会看到,尽pipe所有这些线程你的CPU使用率仍然很低。

当然如果你所有的线程都做了一些数字处理的任务,那么你不应该创build太多的线程,因为你没有性能上的好处(尽pipe可能会有体系结构的好处!)。

但是,如果它们主要是I / O绑定,那么可以根据架构的要求创build多个线程。 不知道你的特定任务很难提供build议。

  1. 一般来说,是的,但“并行”可能意味着不同的事情。

  2. 这取决于你想要并行运行的任务。

  3. 不必要。 有些(甚至是大多数)线程花了很多时间无所事事。 不妨从他们转移到想要做某事的线程。

  4. OS处理线程切换。 如果需要的话,它将委托给不同的内核。 如果只有一个核心,它将在不同的线程和进程之间划分时间。

  5. 线程的数量受到软件和硬件的限制。 线程消耗处理器和内存在不同程度上取决于他们在做什么。 线程pipe理软件也可能会施加自己的限制。

要记住的关键是逻辑/虚拟并行性和真实/硬件并行性的分离。 在你的平均操作系统下,系统调用会产生一个新的线程。 实际发生的事情(无论是映射到不同的内核,同一个内核上的不同硬件线程,还是排队进入软件线程池)都取决于操作系统。

  1. 并行处理使用的不仅仅是multithreading的所有方法。
  2. 一般来说,如果你想有真正的并行处理,你需要用硬件来执行。 以Niagara为例,它有多达8个内核,每个内核可以在硬件中执行4线程。
  3. 当有更多的线程能够在硬件中并行执行时,需要上下文切换。 即使这样,当串行执行(在一个线程之间切换)时,它们被认为是并发的,因为不能保证切换的顺序 。 所以可以走T0,T1,T2,T1,T3,T0,T2等。 对于所有的意图和目的,线程是平行的。
  4. 时间切片。
  5. 这将取决于操作系统。

multithreading一次执行多个线程。 它可能发生在单核处理器和多核处理器系统上。 对于单处理器系统,上下文切换会影响它。 看!这个计算环境中的上下文切换是指操作系统的时间分割。 所以不要混淆。 操作系统是控制其他程序执行的操作系统。 它允许一次在CPU中执行一个程序。 但是线程切入和切出CPU的频率决定了系统展现的并行性的透明性。

对于多核环境,当每个内核执行一个线程时会发生multithreading。尽pipe如此,在多核环境中,上下文切换也可能发生在单个内核中。

我认为到目前为止的答案是非常重要的,给你一个很好的基本上下文。 从本质上讲,如果你有四核心处理器,但是每个核心能够执行2个并发线程。

请注意,如果在一个核心上同时运行两个线程,而不是第一个线程,然后第二个线程垂直运行,则只有轻微(或不)增加的速度。 但是,每个物理核心都会为您的常规工作stream程增加速度

现在,假设你有一个在你的OS上运行的进程,这个进程有多个线程(即需要在“并行”中运行多个东西),并且在某个队列(或者其他具有优先级规则的系统)中有某种任务堆栈。 然后软件将任务发送到队列,并且处理器尝试尽可能快地执行它们。 现在你有两个例子:

  1. 如果一个软件支持多处理,那么任务将被发送到任何可用的处理器(即没有做任何事情,或者干脆完成一些其他工作,从软件发送的作业是队列中的第一个)。
  2. 如果您的软件不支持多处理,那么所有的工作都将以类似的方式完成,但只能由您的一个核心完成。

我build议阅读维基百科页面上的线程。 那里的第一张照片已经给你一个很好的见解。 🙂