我只是好奇为什么调度程序会不断在 CPU 之间移动应用程序,而不是将其保留在一个 CPU 上。 4 个核心处于 25% 而不是 1 个核心处于 100% 看起来有点愚蠢。
这和热量有关吗?还是因为效率更高?其他操作系统的做法不同吗?
如果有深入见解或链接就更好了。(我自己没找到多少。)
更新:
我所说的“分散”并不是指它同时在多个 CPU 上执行,而是每秒从一个 CPU 移动到另一个 CPU 几次,从而产生看起来分散的效果。
答案1
我认为wierob
已经很好地描述了这一点。
下面是一个较旧的文章processor affinity
与四核讨论设置QX6800.
(链接指向该文章的第二页)。
如果不强制将进程亲和力强加到核心,性能是否会下降??
- 虽然Windows 调度程序需要决定这种亲和力,以避免与缓存发生冲突
,处理器设计它本身也考虑这样的事情。 - 英特尔 QX6800 四核处理器(因为我之前在这个答案中提到过它)
有一个L3
4 个核心共享8MB缓存。
需要注意的是,虽然您可能选择在系统上只运行这一个单线程进程,但操作系统本身还会运行其他几个需要调度的任务。调度程序会在可用处理器池(或核心)之间平衡所有这些活动。
展望未来,尼黑勒姆建筑和NUMA,
跨多个插槽的处理器还可以更好地解决访问垃圾问题。
下面是一张来自ArsTechnica 关于 NUMA 的页面。
如果i7
你对 Nehalem 感兴趣,我还有更多链接至此答案。
答案2
调度程序仅执行在“空闲”核心/CPU 上准备执行的下一个线程。
您可以通过 Windows 任务管理器将进程分配给特定的 CPU。
4 个核心占 25% 意味着同时执行 4 个线程。而一个核心占 x% 意味着只执行一个线程。因此在某些情况下前者效率更高。
但在执行期间,CPU 的缓存会填充线程访问的数据。因此,如果线程在另一个 CPU 上执行,它将遇到更多缓存未命中,这是代价高昂的,因为数据不在该 CPU 的缓存中。
您的线程在做什么?如果线程“休眠”了很短的时间,那么之前执行该线程的核心可能被另一个威胁占用,因此您的线程将在下一个可用核心上执行。如果您仅指定一个核心供您的进程使用(例如 ia 任务管理器),会发生什么情况?
答案3
操作系统会在 CPU 核心之间迁移线程(速度很快,每秒数次)。始终在同一个核心上运行线程效率更高。这可以通过任务管理器中的“设置关联性”上下文菜单项来强制执行。
请注意,通常(典型的家庭使用)差异在百分之几的范围内。
正如任务管理器显示的平均使用情况那样,“4 个核心,每个核心的使用率为 25%”意味着每个核心有四分之一的时间被充分利用,其余时间则被释放。
该描述针对的是 Windows,但在其他操作系统上也类似。
答案4
如果有人还在读这篇文章,我也注意到了这一点,并进行了相当多的测试,看看这是否只是个侥幸。结果并非如此!我相信在所有核心上分布一个线程更有效率,原因如下:
- 将一个线程分散到所有核心可以降低功耗。大多数处理器会根据负载降低频率,更重要的是降低电压,因此,例如,Core 2 Quad 将一个线程分散到所有 4 个核心,而不是使用一个核心(这会导致所有核心的电压增加,因为只有一个电压调节器* - 这非常低效),从而消耗更少的电量并产生更少的热量。
- 它确保线程始终以最大/恒定速度运行。如果线程突然请求更多处理能力,则一个核心可能会过载,并且执行将延迟。通过将其分散到各个核心,任何突然的峰值都将得到平稳处理,而不会出现滞后和延迟。
此外,由于上述两个观察结果,我开始相信 Turbo Boost 和 IDA 是无效的。它们可能在较旧的操作系统上有用,但 Linux 和 Windows 7 非常有效地将所有内容分散到所有核心上。因此,Core 2 Quad q9100 @ 2.26 GHz 几乎(总是有例外 :-) 总是比 Core 2 Duo X9100 @ 3.06GHz 更快,而且我很少看到它使用 IDA(基本上是 Turbo boost 的前身,仅在单线程应用程序的一个或两个核心上增加频率)。
- 由于有两个物理芯片,Core 2 Quad 具有两个时钟域,因此两个内核可以全频运行,而两个内核则以最低频率运行。不过,我不知道是否有两个电压调节器 - 我注意到所有 4 个内核的电压是均匀的,因此整个封装中必须只有一个调节器。