为什么单个线程分布在 CPU 上?

Mac*_*cke 27 windows cpu performance

我只是好奇为什么调度程序会不断地在 CPU 之间移动应用程序,而不是将其保持在一个 CPU 上。有 4 个内核 25% 而不是 100% 的内核看起来有点傻。

它与热量有关,还是以某种方式更有效?其他操作系统的做法不同吗?

深入的见解或链接会很好。(我自己找不到太多。)

更新:

我所说的“散布”并不是说它一次在多个 CPU 上执行,而是每秒从一个 CPU 移到另一个 CPU 数次,从而产生看起来散开的效果。

nik*_*nik 8

我认为wierob已经很好地描述了这一点。
这是一篇讨论processor affinity四核QX6800设置的旧文章
(链接指向该文章的第二页)。

如果您不强制进程关联到核心,您是否会降低性能

  • 虽然Windows 调度程序需要决定这种亲和性以避免缓存颠簸,
    处理器设计本身也考虑了这些事情。
  • 英特尔 QX6800 四核(因为我在本回答前面提到过它)
    有一个8MBL3缓存,它的 4 个内核共享

应该注意的是,虽然您可能选择在系统上只运行这个单线程进程,但操作系统本身会运行其他几个也需要调度的任务。调度程序在可用的处理器池(或内核)之间平衡所有这些活动。


展望未来,借助Nehalem架构和NUMA
跨多个套接字的处理器也将能够更好地解决访问抖动问题。
这是来自NUMA 上 ArsTechnica 页面的快速图片。

在此处输入图片说明

如果 Nehalem 和i7您感兴趣,我在这个答案中有更多链接


wie*_*rob 6

调度程序只是执行下一个准备好在“空闲”内核/CPU 上执行的线程。

您可以通过 Windows 任务管理器将进程分配给特定的 CPU。

4 个内核占 25% 意味着同时执行 4 个线程。而 x% 的一个核心意味着只执行一个线程。所以前者在某些情况下效率更高。

但是在执行过程中,CPU 的缓存中充满了线程访问的数据。因此,如果线程在另一个 CPU 上执行,它将遇到更多缓存未命中,这是代价高昂的,因为数据不在该 CPU 的缓存中。

你的线程有什么作用?如果线程“休眠”了很短的时间,则之前在其上执行的核心可能被另一个威胁占用,因此您的线程将在下一个可用核心上执行。如果您只指定一个核心供您的流程使用(例如 ia 任务管理器),会发生什么情况?

  • afaik Windows 调度程序在将线程保持在同一 cpu/核心上方面做得非常好,以避免出现该问题。 (3认同)
  • “以 25% 的速度拥有 4 个内核意味着同时执行 4 个线程。” 不,这意味着执行一个线程,在一个核心上执行一点,然后在另一个核心上执行,依此类推。当任务管理器显示平均使用率时,它会为每个内核显示 25%(在 4 核系统上,在两核系统上将显示 50%)。这意味着核心被充分利用了四分之一的时间并且空闲了剩余的时间。 (2认同)