SMP核心,进程和线程如何协同工作?

时间:2010-06-07 03:31:50

标签: multithreading operating-system multiprocessing multicore cpu-architecture

在单核CPU上,每个进程都在OS中运行,并且CPU从一个进程跳转到另一个进程以最好地利用自身。进程可以有许多线程,在这种情况下,CPU在相应进程上运行时会运行这些线程。

现在,在多核CPU上:

  • 核心是否在每个进程中一起运行,或者核心是否可以在一个特定时间点在不同进程中单独运行?例如,您有程序A运行两个线程。双核CPU可以运行这个程序的两个线程吗?如果我们使用类似OpenMP的内容,我认为答案应该是肯定的。但是,虽然内核在这个嵌入OpenMP的进程中运行,但其中一个内核是否可以简单地切换到其他进程?

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

5 个答案:

答案 0 :(得分:48)

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

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

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

现在提出您的具体问题:

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

2)即使您在多核CPU上运行单线程应用程序,您也会注意到其他CPU正在运行。这来自于操作系统在此期间完成其工作,以及b)从您的应用程序永远不会单独运行的事实 - 每个运行的系统由一大堆并发执行的任务组成。检查Windows的任务管理器(或Linux上的 ps / top )以检查正在运行的内容。

答案 1 :(得分:11)

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

答案 2 :(得分:9)

@BjoernD,你提到了..

  

..如果您的应用程序只包含一个线程,那么您的   整个多CPU系统对你来说仍然只会使用,因此不会对你有所帮助   一个CPU为您的应用程序...

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

答案 3 :(得分:6)

是的,线程和进程可以在多核CPU上并发运行,因此这可以按照您的描述工作(无论您如何创建这些线程和进程,OpenMP或其他方式)。单个进程或线程一次只能在一个核心上运行。如果有更多线程请求CPU时间而不是可用内核(通常是这种情况),操作系统调度程序将根据需要在线程上打开和关闭线程。

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

答案 4 :(得分:0)

如果有一个线程应用程序说有10个线程,那么最初它将在相同的CPU /核心上启动。在一段时间内,由于Linux中的负载平衡器,多个线程将被分发到其他核心/ cpus。如果有多个这样的线程应用程序,我认为所有的应用程序线程大多数运行在相同的核心/ cpu上,因为线程的locals / globals可以在它们运行的​​核心的l1 / l2缓存中随时可用。它们离开核心比执行时间耗时。如果线程需要在不同的核心运行。我认为必须向线程提供亲和力信息。