同样忙碌的CPU核心

时间:2015-03-16 18:30:21

标签: python windows cpu

我最近在运行计算密集型python程序(没有线程)时认识到,在Windows(Win8.1 x64)下,没有一个CPU核心(我的4个逻辑,2个物理核心)被完全占用,而是每个逻辑核心都是忙碌~25%。总而言之,这与100%忙碌的核心相对应。 Windows是否传播任务,但不是很好?有这样的事情要做,以尽可能保持冷却?或者它与Python有关?我在linux下运行相同的程序,这里发生了我的预期(一个Core 100%忙)

1 个答案:

答案 0 :(得分:2)

您在Windows中观察到的实际上是人们对交互式CPU调度程序(Windows或Linux,其他Unix变体或macOS)的默认行为的期望。

执行线程时,操作系统继续发送定时中断(时钟中断),将CPU内核的控制权从用户空间(您正在运行的应用程序)带回内核空间(运行该操作系统的操作系统)这使得操作系统能够重新安排进程,以便在其他进程分享" CPU馅饼后,在同一个(或其他)CPU核心上运行该进程。如果只有您的进程是主CPU使用者(除了在后台运行的其他进程外,通常还有其他进程),原则上也会发生这种情况。

这种行为是交互式调度模式的一个非常重要的特性(这是现在大多数操作系统的默认设置,因为它们很好地是交互式的...)因为它允许所有正在运行的进程获得一部分CPU资源没有饿死他们中的任何一个。这允许每个进程运行到"感觉"通过共享它们之间的整个CPU资源进行交互,而不是让CPU占用#34;拿走CPU而不是还原它。

现在,话虽如此,你可以调整这种行为。例如,就像您通过将流程的亲和力设置为单个核心或设置"实时"流程的优先级。

它们中的任何一个都会导致进程继续在同一个核心上运行(亲和力是微不足道的,你要求操作系统只在1个核心上运行它)。 实时只是停止中断过程。它使您的机器交互性降低,但也会停止中断正在运行的进程,以便继续运行它开始运行的同一个核心。

现在,关于您在Linux上指定的行为。我认为这是以下两种表达方式之一:

  1. 你是以某种方式安排进程在SCHED_FIFO上运行而没有意识到它(这是Windows等同于"实时")

    为了验证它,使用您的过程的PID并执行

    chrt -p <your process PID>
    
  2. 您误解了某个工具,该工具向您展示了该进程在单个核心上运行,而实际上它分布在所有核心上。

  3. 如果你能详细说明你是如何得出结论的,那么在Linux中它运行在所有核心上我会非常高兴听到。