在进程活跃时更改亲和力

在进程活跃时更改亲和力

我正在运行一个消耗 CPU 的进程(计算曼德布洛特集),该进程占用了几乎 100% 的 CPU(我的机器上有 8 个内核)。当我将亲和力更改为一半的内核时,CPU 消耗显示为 50% 或更低,这很酷,但我想了解的是这个魔法是如何实现的:

我的问题: 如果我在进程运行时更改亲和性,并且禁用的核心上有线程 - 我不会丢失任何数据吗?怎么做到的?

答案1

您有 8 个 CPU 核心,但启动的线程肯定不止 8 个。只需计算所有后台进程 - 可能有几十个,每个进程至少有一个线程。操作系统必须以某种方式处理它才能提供真正的多任务处理。因此,OS 有一个调度程序,它根据某种算法和一些选项集启动、暂停和重新启动线程。亲和性就是这样的选项之一,它决定了线程可以在哪些核心上调度。暂停和重新启动线程一直在发生。在核心之间移动它们也是如此(不过,OS 会尝试在相同的核心上进行调度,因为这会降低缓存未命中的频率并提高性能)。这是安全的。

答案2

虽然没有特别询问,但我应该指出(因为我一次加载所有核心数周,因此对这个主题有一定的了解),亲和力虽然很有用,但并不像优先级那么重要。与 50% 的 CPU 利用率相比,您的作业通常会在 100% 时以两倍的速度完成。将长时间运行的任务设置为低优先级,它们仍将以 100% 运行(只要没有更高优先级的任务要运行),但它将最大限度地减少对执行其他轻量级任务的影响。仅在需要解决风扇噪音/散热问题时才管理亲和力……在这种情况下,定期清洁我的电脑可以让我获得更多的里程。

答案3

不应该对程序有任何影响。操作系统的调度程序将收到通知,内核不再可用。将进程从运行状态切换到等待状态需要几微秒,因此切换似乎是瞬间完成的。进程将继续在所有可用内核上运行。

但是,如果程序编写得不好,或者编译器存在问题或错误,程序就无法正常运行,甚至完全崩溃。

答案4

绝对肯定的是,此处存在数据丢失(或数据损坏)的风险。或者进程终止或任何其他问题。Windows 调度程序每秒处理这种情况数十次甚至数百次。

改变进程亲和性(或者改变其优先级) - 实际上是改变进程线程的亲和性(和优先级) - 只是抢占的另一个原因。

抢占后,线程可能会在与上次运行时不同的逻辑处理器上运行。这是很常见的情况。

相关内容