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

时间:2009-11-11 07:11:02

标签: multithreading process multicore

我很困惑,但以下帖子清除了我的怀疑:

Multiprocessing, Multithreading,HyperThreading, Multi-core

但它从硬件角度解决了查询问题。我想知道这些硬件功能如何映射到软件?

显而易见的一点是MultiProcessor(= Mutlicpu)和MultiCore之间没有区别,除了多核中所有cpus都驻留在一个芯片(芯片)上,而在多处理器中,所有cpus都在它们自己的芯片和芯片上。连在一起。

因此,mutlicore /多处理器系统能够在“同一时间”执行多个进程(firefox,mediaplayer,googletalk)(与在单个处理器系统上切换这些进程的上下文不同)对吗?

如果正确的话。到目前为止我很清楚。但是当多线程出现时会出现混乱。

  1. MultiThreading“用于”并行处理。右

  2. cpu中多线程涉及哪些元素?图?对于我来说,利用并行处理两个独立任务的能力,CPU的要求应该是什么?

  3. 当人们说线程的上下文切换时。我真的不明白。因为如果它的上下文切换线程然后它不是并行处理。线程必须“同时执行”。正确?

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

  4. 如果我在无法处理线程的处理器上运行多线程软件会怎样?我的意思是cpu如何处理这样的软件?

  5. 如果到目前为止一切都很好,现在问题是多少线程?它必须受硬件限制,我想?如果硬件只支持2个线程,我在我的进程中启动10个线程。 cpu如何处理它?优点缺点?从软件工程的角度来看,在开发将由各种系统中的用户使用的软件时,那么我如何决定是否应该进行多线程处理?如果有,有多少线程?

7 个答案:

答案 0 :(得分:43)

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

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

  2. 好的,多线程可能意味着硬件多线程(一个例子就是超线程)。但是,我假设您只是说软件中的多线程。从这个意义上说,CPU应该支持上下文切换。

  3. 需要通过时间划分实现多任务的上下文切换,即使在物理上单一的核心。

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

  5. 可以在并发中物理运行的线程数与逻辑处理器的#相同。您正在询问操作系统文献中的一般线程调度问题,例如round-robin ..

  6. 强烈建议您先学习操作系统的基础知识。然后继续讨论多线程问题。对于诸如上下文切换和调度等关键概念,您似乎仍然不清楚。这需要几个月,但如果你真的想成为计算机软件专家,那么你应该知道这些非常基本的概念。请参考任何操作系统书籍和演讲幻灯片。

答案 1 :(得分:12)

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

大约4:基本上,每个处理器都可以使用线程。它更像是操作系统的一个特征。线程基本上是:内存(可选),堆栈和寄存器,一旦被替换,你就在另一个线程中。

5:线程数量非常高,受OS限制。通常它高于普通程序员可以成功处理:) 线程数由您的程序决定:

是IO绑定的吗?

  • 可以将任务划分为许多较小的任务吗?
  • 任务有多小?任务可能太小,根本无法产生线程。
  • 同步:如果需要广泛的同步,惩罚可能太大,你应该减少线程数。

答案 2 :(得分:3)

多个线程在一个进程中是命令的独立“链”。从CPU的角度来看,线程或多或少类似于进程。每个线程都有自己的寄存器集和自己的堆栈。

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

在您的示例中,Firefox的每个选项卡甚至可能包含多个线程。或者他们可以共享一些线程。你需要一个下载,一个用于渲染,一个用于消息循环(用户输入),也许一个用于运行Javascript。您无法轻松组合它们,因为在下载时您仍需要对用户的输入作出反应。但是,下载线程大多数时间都处于休眠状态,即使在下载时它只是偶尔需要CPU,而只有按下按钮时才会唤醒消息循环线程。

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

当然,如果您的所有线程都执行了一些数字运算任务,那么您不应该创建太多的线程,因为您没有获得任何性能优势(尽管可能有架构优势!)。

但是,如果它们主要是I / O绑定,那么创建与您的体系结构所指示的一样多的线程。在不了解您的特定任务的情况下提供建议很难。

答案 3 :(得分:1)

  1. 从广义上讲,是的,但“平行”可能意味着不同的事情。

  2. 这取决于您希望并行执行哪些任务。

  3. 不一定。一些(实际上大多数)线程花费大量时间无所事事。不妨切换到想要做某事的线程。

  4. 操作系统处理线程切换。如果愿意,它将委托给不同的核心。如果只有一个核心,它将在不同的线程和进程之间划分时间。

  5. 线程数受软件和硬件限制。线程在不同程度上消耗处理器和内存,具体取决于它们正在做什么。线程管理软件也可以施加自己的限制。

答案 4 :(得分:1)

要记住的关键是逻辑/虚拟并行与真实/硬件并行之间的分离。使用平均操作系统,将执行系统调用以生成新线程。实际发生的事情(无论是映射到不同的核心,同一核心上的不同硬件线程,还是排队到软件线程池中)都取决于操作系统。

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

答案 5 :(得分:1)

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

对于多核环境,当每个核执行一个线程时会发生多线程。但是,再次在多核中,可以在各个核中进行上下文切换。

答案 6 :(得分:0)

我认为到目前为止的答案非常重要,并为您提供了良好的基本背景。实质上,假设您有四核处理器,但每个核心都能够执行2个并发线程。

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

现在,假设你的操作系统上有一个进程,它有多个线程(即需要在" parallel"中运行多个东西)并且在队列中有某种堆栈的任务(或其他一些)具有优先权规则的系统)。然后,软件将任务发送到队列,您的处理器会尽可能快地执行它们。现在你有2个案例:

  1. 如果软件支持多处理,那么任务将被发送到任何可用的处理器(没有做任何事情或只是完成了其他工作,并且从您的软件发送的作业在队列中排在第1位。)
  2. 如果您的软件不支持多处理,那么您的所有工作都将以类似的方式完成,但只能由您的一个核心完成。
  3. 我建议在线程上阅读Wikipedia page。第一张图片已经为您提供了很好的见解。 :)