我最近在运行计算密集型python程序(没有线程)时认识到,在Windows(Win8.1 x64)下,没有一个CPU核心(我的4个逻辑,2个物理核心)被完全占用,而是每个逻辑核心都是忙碌~25%。总而言之,这与100%忙碌的核心相对应。 Windows是否传播任务,但不是很好?有这样的事情要做,以尽可能保持冷却?或者它与Python有关?我在linux下运行相同的程序,这里发生了我的预期(一个Core 100%忙)
答案 0 :(得分:2)
您在Windows中观察到的实际上是人们对交互式CPU调度程序(Windows或Linux,其他Unix变体或macOS)的默认行为的期望。
执行线程时,操作系统继续发送定时中断(时钟中断),将CPU内核的控制权从用户空间(您正在运行的应用程序)带回内核空间(运行该操作系统的操作系统)这使得操作系统能够重新安排进程,以便在其他进程分享" CPU馅饼后,在同一个(或其他)CPU核心上运行该进程。如果只有您的进程是主CPU使用者(除了在后台运行的其他进程外,通常还有其他进程),原则上也会发生这种情况。
这种行为是交互式调度模式的一个非常重要的特性(这是现在大多数操作系统的默认设置,因为它们很好地是交互式的...)因为它允许所有正在运行的进程获得一部分CPU资源没有饿死他们中的任何一个。这允许每个进程运行到"感觉"通过共享它们之间的整个CPU资源进行交互,而不是让CPU占用#34;拿走CPU而不是还原它。
现在,话虽如此,你可以调整这种行为。例如,就像您通过将流程的亲和力设置为单个核心或设置"实时"流程的优先级。
它们中的任何一个都会导致进程继续在同一个核心上运行(亲和力是微不足道的,你要求操作系统只在1个核心上运行它)。 实时只是停止中断过程。它使您的机器交互性降低,但也会停止中断正在运行的进程,以便继续运行它开始运行的同一个核心。
现在,关于您在Linux上指定的行为。我认为这是以下两种表达方式之一:
你是以某种方式安排进程在SCHED_FIFO上运行而没有意识到它(这是Windows等同于"实时")
为了验证它,使用您的过程的PID并执行
chrt -p <your process PID>
您误解了某个工具,该工具向您展示了该进程在单个核心上运行,而实际上它分布在所有核心上。
如果你能详细说明你是如何得出结论的,那么在Linux中它运行在所有核心上我会非常高兴听到。