![在进程活跃时更改亲和力](https://linux22.com/image/1577300/%E5%9C%A8%E8%BF%9B%E7%A8%8B%E6%B4%BB%E8%B7%83%E6%97%B6%E6%9B%B4%E6%94%B9%E4%BA%B2%E5%92%8C%E5%8A%9B.png)
我正在运行一个消耗 CPU 的进程(计算曼德布洛特集),该进程占用了几乎 100% 的 CPU(我的机器上有 8 个内核)。当我将亲和力更改为一半的内核时,CPU 消耗显示为 50% 或更低,这很酷,但我想了解的是这个魔法是如何实现的:
我的问题: 如果我在进程运行时更改亲和性,并且禁用的核心上有线程 - 我不会丢失任何数据吗?怎么做到的?
答案1
您有 8 个 CPU 核心,但启动的线程肯定不止 8 个。只需计算所有后台进程 - 可能有几十个,每个进程至少有一个线程。操作系统必须以某种方式处理它才能提供真正的多任务处理。因此,OS 有一个调度程序,它根据某种算法和一些选项集启动、暂停和重新启动线程。亲和性就是这样的选项之一,它决定了线程可以在哪些核心上调度。暂停和重新启动线程一直在发生。在核心之间移动它们也是如此(不过,OS 会尝试在相同的核心上进行调度,因为这会降低缓存未命中的频率并提高性能)。这是安全的。
答案2
虽然没有特别询问,但我应该指出(因为我一次加载所有核心数周,因此对这个主题有一定的了解),亲和力虽然很有用,但并不像优先级那么重要。与 50% 的 CPU 利用率相比,您的作业通常会在 100% 时以两倍的速度完成。将长时间运行的任务设置为低优先级,它们仍将以 100% 运行(只要没有更高优先级的任务要运行),但它将最大限度地减少对执行其他轻量级任务的影响。仅在需要解决风扇噪音/散热问题时才管理亲和力……在这种情况下,定期清洁我的电脑可以让我获得更多的里程。
答案3
它不应该对程序有任何影响。操作系统的调度程序将收到通知,内核不再可用。将进程从运行状态切换到等待状态需要几微秒,因此切换似乎是瞬间完成的。进程将继续在所有可用内核上运行。
但是,如果程序编写得不好,或者编译器存在问题或错误,程序就无法正常运行,甚至完全崩溃。
答案4
绝对肯定的是,不此处存在数据丢失(或数据损坏)的风险。或者进程终止或任何其他问题。Windows 调度程序每秒处理这种情况数十次甚至数百次。
改变进程亲和性(或者改变其优先级) - 实际上是改变进程线程的亲和性(和优先级) - 只是抢占的另一个原因。
抢占后,线程可能会在与上次运行时不同的逻辑处理器上运行。这是很常见的情况。