为什么 Windows 在处理器之间切换进程?
Why does Windows switch processes between processors?
如果单线程进程很忙并且使用了 100% 的单核,则似乎 Windows 正在核心之间切换此进程,因为在任务管理器核心概述中,所有核心都被平等使用。
为什么 Windows 这样做?这不是破坏 L1/L2 缓存吗?
将一个进程固定到一个核心有很多好处,主要是您已经提到的缓存。
也有缺点 -- 加热不均匀,这会产生机械应力,不会提高硅芯片的预期寿命。
为避免这种情况,操作系统倾向于使所有内核的利用率保持一致。当只有一个活动线程时,必须移动它并使缓存无效。只要不经常这样做(在 CPU 时间内),迁移期间额外缓存未命中的影响可以忽略不计。
例如,"Energy and thermal tradeoffs in hardware-based load balancing for clustered multi-core architectures implementing power gating" 的摘要明确将此列为调度算法的设计目标(强调我的):
In this work, a load-balancing technique for these clustered multi-core architectures is presented that provides both a low overhead in energy and an a smooth temperature distribution across the die, increasing the reliability of the processor by evenly stressing the cores.
在整个裸片上分散散热对于 Turbo Boost 等技术来说也是必不可少的,在这种技术中,内核暂时以无法长期维持的速率计时。通过定期将负载移动到不同的核心,平均 散热保持可持续,即使瞬时功率不是。
您的过程可能是唯一一个做大量工作的过程,但它不是唯一的 运行ning。还有许多其他进程偶尔需要 运行。当您的进程被逐出并最终重新安排时,它之前 运行ning 所在的核心可能不可用。最好 运行 等待进程立即在空闲内核上等待,而不是等待前一个内核可用(并且在任何情况下,它的数据可能已被其他线程从缓存中取出)。
此外,现代 CPU 允许一个包中的所有内核共享高级缓存。请参阅此 Intel Core i5 spec sheet 中的 "Smart Cache" 功能。您仍然会丢失核心交换机上的低级缓存,但这些缓存很小,如果您 运行 不仅仅是一个小的紧密循环,它们可能会有所变动。
如果单线程进程很忙并且使用了 100% 的单核,则似乎 Windows 正在核心之间切换此进程,因为在任务管理器核心概述中,所有核心都被平等使用。
为什么 Windows 这样做?这不是破坏 L1/L2 缓存吗?
将一个进程固定到一个核心有很多好处,主要是您已经提到的缓存。
也有缺点 -- 加热不均匀,这会产生机械应力,不会提高硅芯片的预期寿命。
为避免这种情况,操作系统倾向于使所有内核的利用率保持一致。当只有一个活动线程时,必须移动它并使缓存无效。只要不经常这样做(在 CPU 时间内),迁移期间额外缓存未命中的影响可以忽略不计。
例如,"Energy and thermal tradeoffs in hardware-based load balancing for clustered multi-core architectures implementing power gating" 的摘要明确将此列为调度算法的设计目标(强调我的):
In this work, a load-balancing technique for these clustered multi-core architectures is presented that provides both a low overhead in energy and an a smooth temperature distribution across the die, increasing the reliability of the processor by evenly stressing the cores.
在整个裸片上分散散热对于 Turbo Boost 等技术来说也是必不可少的,在这种技术中,内核暂时以无法长期维持的速率计时。通过定期将负载移动到不同的核心,平均 散热保持可持续,即使瞬时功率不是。
您的过程可能是唯一一个做大量工作的过程,但它不是唯一的 运行ning。还有许多其他进程偶尔需要 运行。当您的进程被逐出并最终重新安排时,它之前 运行ning 所在的核心可能不可用。最好 运行 等待进程立即在空闲内核上等待,而不是等待前一个内核可用(并且在任何情况下,它的数据可能已被其他线程从缓存中取出)。
此外,现代 CPU 允许一个包中的所有内核共享高级缓存。请参阅此 Intel Core i5 spec sheet 中的 "Smart Cache" 功能。您仍然会丢失核心交换机上的低级缓存,但这些缓存很小,如果您 运行 不仅仅是一个小的紧密循环,它们可能会有所变动。