SMP核心,进程和线程如何一起工作?

在单个核心CPU上,每个进程在OS中运行,CPU从一个进程跳转到另一个进程,以充分利用自身。 一个进程可以有很multithreading,在这种情况下,当CPU在相应的进程上运行时,CPU通过这些线程运行。

现在,在多核CPU上:

  • 核心是否在每个进程中一起运行,或者核心可以在特定的时间点在不同的进程中分别运行? 例如,你有程序A运行两个线程。 双核CPU能运行这个程序的两个线程吗? 我认为如果我们使用像OpenMP这样的答案应该是。 但是,当核心运行在OpenMPembedded式过程中时,其中一个内核是否可以简单地切换到其他进程?

  • 对于为单核创build的程序,当以100%运行时,为什么每个核心的CPU利用率分布? (例如80%和20%的双核CPU,在这种情况下,所有内核的利用率总是达到100%)。内核是否试图通过以某种方式运行每个进程的每个线程来相互帮助?

内核 (或CPU)是执行代码的计算机的物理元素。 通常,每个内核都具有执行计算,寄存器文件,中断线等所有必要的元素。

大多数操作系统将应用程序表示为进程 这意味着应用程序拥有自己的地址空间(==内存视图),操作系统可以确保该视图及其内容与其他应用程序隔离。

一个进程由一个或多个线程组成 ,这些线程通过在CPU上执行机器代码来执行应用程序的实际工作。 操作系统确定哪个线程在哪个CPU上执行(通过巧妙的启发式方法来改善负载均衡,能耗等)。 如果您的应用程序只包含一个线程,那么您的整个多CPU系统将不会有多大的帮助,因为它只能为您的应用程序使用一个CPU。 (但是,由于操作系统将在其他CPU上运行其他应用程序,所以它们不会与第一个应用程序混合在一起),总体性能仍可能会提高。

现在到您的具体问题:

1)操作系统通常允许你至less提供一些关于你想要执行某些线程的内核的提示。 OpenMP所做的就是生成一些代码,这些代码会生成一定数量的线程,从multithreading中的程序循环中分发共享的计算工作。 它可以使用操作系统的提示机制(请参阅:线程关联)来执行此操作。 但是,OpenMP应用程序仍然可以同时运行,因此操作系统可以自由地中断其中一个线程,并在CPU上安排其他(可能不相关的)工作。 实际上,根据您的情况,您可能需要应用许多不同的调度scheme,但这是非常具体的,大多数情况下,您应该能够相信自己的操作系统为您做了正确的事情。

2)即使您在多核CPU上运行单线程应用程序,也会注意到其他CPU也在运行。 这是来自操作系统同时工作的原因,b)由于你的应用程序永远不能单独运行,每个运行系统都由一大堆并发执行的任务组成。 检查Windows的任务pipe理器(或Linux上的ps / top ),检查运行的是什么。

还要注意,操作系统并不在意线程来自哪个进程。 它通常将线程调度到处理器/内核,而不pipe线程来自哪个进程。 这可能导致一个进程同时运行四个线程,就像同时运行四个进程的一个线程一样容易。

@BjoernD,你提到

..如果你的应用程序只包含一个线程,那么你的整个多CPU系统将不会有多大的帮助,因为它只能为你的应用程序使用一个CPU。

我认为,即使它是一个单线程应用程序,该应用程序线程可能会在其生命周期内的不同核心上执行。 在每个抢占和稍后分配给CPU时,可以将不同的内核分配给该线程。

是的,线程和进程可以在多核CPU上同时运行,所以这个工作就像你描述的一样(不pipe你如何创build那些线程和进程,OpenMP或其他)。 一个进程或线程一次只能在一个内核上运行。 如果有更多的线程要求CPU时间比可用内核(通常情况下)多,则操作系统调度程序将根据需要将线程移入或移出内核。

单线程进程在多个CPU或核心上运行的原因与您的操作系统有关,而不是硬件的任何特性。 一些操作系统没有“线程亲和性”的感觉 – 他们不关心线程运行在哪个处理器上 – 所以当重新评估正在使用的资源(至less每秒几次)的时候,将一个线程/进程从一个核心/ CPU移动到另一个核心/ CPU。 除了导致caching未命中之外,这通常不会影响进程的性能。

如果有一个具有10个线程的线程应用程序,则最初将在相同的CPU /核心上启动。由于Linux中的负载平衡器,一段时间内多个线程将被分配到其他核心/ CPU。 如果有多个这样的线程应用程序在那里,我认为所有的应用程序线程大多运行在相同的核心/ CPU上,因为线程的本地/全局variables在它们正在运行的核心的l1 / l2caching中是可用的。如果线程需要在不同的内核中运行,我认为必须向线程提供关联信息。