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

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

现在,在多核CPU上:

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

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


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

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

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

    现在针对您的具体问题:

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

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


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


    @BjoernD,你提到过..

    ..如果你的应用程序只包含一个线程,那么你的整个多CPU系统将无法为你提供多少帮助,因为它仍然只能为你的应用程序使用一个CPU。

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

    链接地址: http://www.djcxy.com/p/36865.html

    上一篇: How do SMP cores, processes, and threads work together exactly?

    下一篇: On which operationg system is threaded programming sufficient to utilize multiple cores?