Kar*_*arl 52 multithreading operating-system multicore cpu-architecture multiprocessing
在单核CPU上,每个进程都在OS中运行,并且CPU从一个进程跳转到另一个进程以最好地利用自身.进程可以有多个线程,在这种情况下,CPU在相应进程上运行时会运行这些线程.
现在,在多核CPU上:
核心是否在每个进程中一起运行,或者核心是否可以在一个特定时间点在不同进程中单独运行?例如,您有程序A运行两个线程.双核CPU可以运行这个程序的两个线程吗?如果我们使用像OpenMP这样的东西,我认为答案应该是肯定的.但是,虽然内核在这个OpenMP嵌入式进程中运行,但其中一个内核是否可以简单地切换到其他进程?
对于为单核创建的程序,当以100%运行时,为什么分配每个核的CPU利用率?(例如,80%和20%的双核CPU.在这种情况下,所有核心的利用率总是高达100%.)核心是否通过以某种方式运行每个进程的每个线程来帮助彼此帮助?
Bjo*_*rnD 48
核心(或CPU)是执行代码的计算机的物理元素.通常,每个核心都具有执行计算,寄存器文件,中断线等所有必需的元素.
大多数操作系统代表应用程序的过程.这意味着应用程序有自己的地址空间(==内存视图),操作系统确保此视图及其内容与其他应用程序隔离.
进程由一个或多个线程组成,这些线程通过在CPU上执行机器代码来执行应用程序的实际工作.操作系统确定哪个线程在哪个CPU上执行(通过使用巧妙的启发式方法来改善负载平衡,能耗等).如果您的应用程序只包含一个线程,那么您的整个多CPU系统将无法帮助您,因为它仍然只能为您的应用程序使用一个CPU.(但是,整体性能可能仍会提高,因为操作系统将在其他CPU上运行其他应用程序,因此它们不会与第一个应用程序混合).
现在来看你的具体问题:
1)操作系统通常允许您至少提供有关您要执行某些线程的核心的提示.OpenMP所做的是生成生成一定数量线程的代码,以便在多个线程中从程序循环中分配共享计算工作.它可以使用操作系统的提示机制(请参阅:线程关联)来执行此操作.但是,OpenMP应用程序仍将同时运行到其他应用程序,因此操作系统可以自由地中断其中一个线程并安排CPU上的其他(可能不相关的)工作.在现实中,有可能是您想根据自己的情况申请许多不同的调度方案,但是这是非常具体的,大多数时候,你应该能够相信你的操作系统做正确的事情你.
2)即使您在多核CPU上运行单线程应用程序,您也会注意到其他CPU也在运行.这从OS在此期间做的工作而来的)和b)的事实,应用程序就不会单独运行-每个运行的系统包括一大堆的同时执行任务.检查Windows的任务管理器(或Linux上的ps/top)以检查正在运行的内容.
Joh*_*ers 11
另请注意,操作系统并不关心线程来自哪个进程.它通常会将线程调度到处理器/核心,而不管线程来自哪个进程.这可能导致一个进程同时运行四个线程,就像同时运行四个进程的一个线程一样容易.
@BjoernD,你提到过......
..如果您的应用程序只包含一个线程,那么您的整个多CPU系统将无法帮助您,因为它仍然只能为您的应用程序使用一个CPU ...
我认为即使它是一个单线程应用程序,该应用程序线程也可能在其生命周期内在不同的核心上执行.在每次抢占以及稍后分配给CPU时,可以将不同的核心分配给该线程.
是的,线程和进程可以在多核CPU上并发运行,因此这可以按照您的描述工作(无论您如何创建这些线程和进程,OpenMP或其他方式).单个进程或线程一次只能在一个核心上运行.如果有更多线程请求CPU时间而不是可用内核(通常是这种情况),则操作系统调度程序将根据需要在线程上打开和关闭线程.
单线程进程在多个CPU或核心上运行的原因与您的操作系统有关,而不是与硬件的任何特性有关.有些操作系统没有"线程亲和力"的意识 - 它们并不关心线程运行的处理器 - 因此,当重新评估正在使用哪些资源(至少每秒几次)时,它们会' ll将一个线程/进程从一个核心/ CPU移动到另一个核心/ CPU.除了导致缓存未命中之外,这通常不会影响您的进程的性能.