【问题标题】:Why does Windows switch processes between processors?为什么 Windows 在处理器之间切换进程?
【发布时间】:2015-05-09 09:19:41
【问题描述】:

如果单线程进程很忙并且使用了 100% 的单核,则 Windows 似乎正在内核之间切换此进程,因为在任务管理器内核概述中,所有内核都是平等使用的。

为什么 Windows 会这样做?这不是破坏 L1/L2 缓存吗?

【问题讨论】:

  • 任务管理器是 IME 对细节不太可靠。特别是在 Windows XP 中,当 Windows 更新让我的电脑瘫痪时,根据任务管理器,什么都没有发生。我怀疑这是否已解决,因为显然已经花费了大量工作来隐藏事物。这种历史上的不可靠性可能是解释的一部分。
  • @Cheersandhth.-Alf:可能是真的,但 Windows 确实在内核之间移动进程。

标签: windows process processors


【解决方案1】:

将进程固定到一个核心有很多好处,主要是缓存您已经提到的。

也有缺点 - 加热不均匀,这会产生机械应力,不会提高硅芯片的预期寿命。

为避免这种情况,操作系统倾向于保持所有内核的利用率相同。当只有一个活动线程时,它必须被移动并使缓存无效。只要不经常执行此操作(在 CPU 时间内),迁移期间额外缓存未命中的影响就可以忽略不计。

例如,"Energy and thermal tradeoffs in hardware-based load balancing for clustered multi-core architectures implementing power gating" 的摘要明确将此列为调度算法的设计目标(强调我的):

在这项工作中,提出了一种用于这些集群多核架构的负载平衡技术,该技术提供了较低的能量开销和芯片上的平滑温度分布,从而均匀地提高了处理器的可靠性强调核心

在整个芯片上散布散热对于 Turbo Boost 等技术也是必不可少的,在这种技术中,内核的时钟频率暂时以不可持续的长期速率运行。通过定期将负载转移到不同的内核,平均散热保持可持续,即使瞬时功率不可持续。

【讨论】:

  • Plus 1 今天也教会了我一些新东西(加热方面的考虑)。
  • 如果我用 CPU-Z 运行一个简单的基准测试并将其固定到一个单核上,我的 Ryzen 3500u 处理器的结果是 ~405。如果它没有被固定,它会达到〜365。那是10%的性能差异。我几乎不会说它微不足道。在 Linux 中,调度程序将尝试将正在运行的线程保持在单个内核中。因此,操作系统并不倾向于使所有内核保持相同的利用率,这只是 Windows afaik。切换内核还有其他缺点,下一个内核可能处于低功耗状态,然后必须切换到睿频等。
  • @EvrenYurtesen:不,机械应力是由热膨胀引起的。如果你让单个核心保持忙碌,那将是一个热点,它正在尝试扩展,但它周围的硅并没有扩展以腾出空间。问题是温度随位置的导数,而不是温度随时间的导数(这已经受到热容量的限制......即使你立即改变功耗,温度也会随时间平滑变化)
  • @BenVoigt 如果应用了您的逻辑,那么 APU 类型的处理器会更频繁地出现故障,而且具有集成内存控制器等的处理器会更频繁地出现故障,因为硅的某些部分永远不会像其他部分一样热。但事实并非如此。此外,我使用过许多具有超过 5000 个内核的 HPC 系统。在这些系统上运行的程序始终仅限于某些内核,因此线程不能跳来跳去。我也从未听说这些处理器中的任何一个因此而失败。最后硅的热膨胀系数很小。
  • 多年来,Linux 还将运行线程绑定到某些内核,这与 Windows 我正在做的完全相反。我也从未听说过服务器因此而失败。如果你说的是真的,会有一些关于有多少处理器因 Linux 调度程序而被丢弃的统计数据。更重要的是,我确信微软会幸灾乐祸地告诉他们的操作系统保护硬件。但我也从未在任何地方看到过……
【解决方案2】:

您的进程可能是唯一做大量工作的进程,但它并不是唯一运行的进程。还有许多其他进程需要偶尔运行。当您的进程被驱逐并最终重新调度时,它之前运行的核心可能不可用。最好在空闲内核上立即运行等待进程,而不是等待前一个内核可用(无论如何,它的数据很可能已被另一个线程从缓存中撞出)。

此外,现代 CPU 允许一个包中的所有内核共享高级缓存。请参阅此Intel Core i5 spec sheet 中的“智能缓存”功能。您仍然会丢失核心交换机上的较低级别缓存,但这些缓存很小,并且如果您运行的不仅仅是一个小的紧密循环,那么无论如何可能会有些混乱。

【讨论】:

  • “最好在空闲核心上立即运行等待进程,而不是等待前一个核心可用”——这往往会导致所有其他任务在其他核心上运行,永远不会驱逐 CPU-bound 线程。这是一个好主意,也是我在其他地方看到的解释,但这不是单个 CPU 绑定线程更改内核的主要原因,这在具有 8 个或更多内核的系统上变得非常明显,因为唤醒过程没有找到一个空闲的核心并且不得不使用“热”的核心是非常低的。
猜你喜欢
  • 2015-05-04
  • 1970-01-01
  • 2019-03-06
  • 2014-08-25
  • 2017-09-28
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多