同样忙 cpu 个核心

equally busy cpu cores

我最近在 运行 计算密集型 python 程序(没有线程)时认识到,在 Windows (Win8.1 x64) 下没有一个 CPU 核心(在我的 4 个逻辑内核和 2 个物理内核中)已被完全占用,而每个逻辑内核都忙于约 25%。总而言之,这对应于一个核心 100% 忙。 Windows 分散了任务,但不是很好吗?这与使核心尽可能保持低温有关吗?还是跟Python有关?我 运行 在 linux 下使用相同的程序,这里发生了我预期的情况(一个核心 100% 忙)

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

当您执行一个线程时,OS 会继续发送定时中断(时钟中断),从而使用户 space(您的应用程序)对 CPU 核心进行控制重新 运行ning) 返回内核 space(OS 运行ning 进程),这使 OS 能够将进程重新安排到 运行 在其他进程共享“CPU 馅饼”后,在相同(或其他)CPU 核心上。如果只有你的进程是主要的 CPU 消费者(除了你的进程之外,通常还有其他进程在后台 运行),原则上也会发生这种情况)

这种行为是交互式调度模式的一个非常重要的特性(这是当今大多数 OS 的默认设置,因为它们是交互式的...)因为它允许所有 运行ning 进程获取 CPU 资源的一部分,而不会使它们中的任何一个挨饿。这允许每个进程 运行 通过在它们之间共享整个 CPU 资源来“感觉”交互,而不是让“CPU 猪”拿走 CPU 并且不归还它.

现在,话虽如此,您可以调整该行为。例如,就像您通过将进程的亲和力设置为单核或为进程设置“实时”优先级所做的那样。

它们中的任何一个都会导致进程在同一个核心上保持 运行ning(亲和力是微不足道的,你要求 OS 到 运行 它只在一个核心上)。 Realtime 只是停止中断进程。它使您的机器交互性降低,但也停止中断 运行ning 进程,因此它继续在启动 运行ning 的同一个核心上运行。

现在,关于您在 Linux 上指定的行为。我认为这是以下两个解释之一:

  1. 您以某种方式将进程安排到 SCHED_FIFO 上的 运行 而没有意识到(这是 Windows 等同于“实时”)

    为了验证它,使用你进程的PID并执行

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

如果您能详细说明您是如何得出结论的,即在 Linux 中 运行 在所有内核上,我将非常高兴听到。