我很好奇为什么调度程序会不断在CPU之间移动应用程序,而不是始终将其保持在一个状态。拥有4个25%的内核而不是100%的1个内核看起来有点愚蠢。
它与热量有关吗,还是效率更高?其他操作系统是否有所不同?
深入了解或链接到深入的东西会很好。(自己找不到很多。)
更新:
“散布”并不是说它一次在多个cpu上执行,而是每秒从一个cpu移到另一个cpu,从而使它看起来散布开来。
我很好奇为什么调度程序会不断在CPU之间移动应用程序,而不是始终将其保持在一个状态。拥有4个25%的内核而不是100%的1个内核看起来有点愚蠢。
它与热量有关吗,还是效率更高?其他操作系统是否有所不同?
深入了解或链接到深入的东西会很好。(自己找不到很多。)
更新:
“散布”并不是说它一次在多个cpu上执行,而是每秒从一个cpu移到另一个cpu,从而使它看起来散布开来。
Answers:
我认为wierob
已经很好地说明了这一点。
这是一篇较旧的文章,讨论processor affinity
了四核QX6800的设置。
(链接指向该文章的第二页)。
如果您不强制与内核建立进程亲和性,那么您的性能会有所下降吗?
L3
缓存。应该注意的是,尽管您可能选择只在系统上运行一个单线程进程,但OS本身将要运行其他几个任务,这些任务也需要安排。调度程序会在可用处理器池(或内核)之间平衡所有这些活动。
展望未来,借助Nehalem体系结构和NUMA,
跨多个插槽的处理器也将能够更好地解决访问问题。
这是NUMA上ArsTechnica页面上的快速图片。
调度程序仅执行准备在“空闲”内核/ CPU上执行的下一个线程。
您可以通过Windows任务管理器将进程分配给特定的CPU。
以25%的速度拥有4个内核意味着同时执行4个线程。而x%的一个内核意味着仅执行一个线程。因此,在某些情况下,前者效率更高。
但是在执行过程中,CPU的缓存中填充了线程访问的数据。因此,如果线程在另一个CPU上执行,它将遇到更多的高速缓存未命中,这代价很高,因为数据不在此CPU的高速缓存中。
你的线程做什么?如果线程“睡眠”了很短的时间,则之前在其上执行的内核可能会被另一个威胁占用,因此您的线程将在下一个可用的内核上执行。如果您仅指定流程要使用的一个核心(例如,任务管理器),会发生什么?
操作系统跨CPU内核迁移线程(每秒几次,一次)。始终在同一内核上运行它效率更高。这可以通过任务管理器中的“设置相似性”上下文菜单项来强制实施。
请注意,通常(典型的家庭使用)差异在百分之几的范围内。
正如任务管理器显示的平均使用率一样,“每个4个内核的使用率均为25%”表示每个内核已充分利用了四分之一的时间,而其余时间则得到了释放。
该说明适用于Windows,但在其他操作系统上也类似。
如果有人还在读,我也注意到了这一点,并进行了很多测试以查看它是否只是a幸。事实并非如此!我认为在多个内核上分配单个线程会更有效率,原因有以下几个:
另外,由于以上两个观察,我已经相信Turbo Boost和IDA无效。它们在较旧的操作系统上可能很有用,但是Linux和Windows 7非常有效地将所有内容分布在所有内核上。因此,Core 2 Quad q9100 @ 2.26 GHz几乎(总是会有例外:-)总是比Core 2 Duo X9100 @ 3.06GHz快,而且我很少见到它使用IDA(基本上是Turbo Boost的前身,仅针对单线程应用增加一个或两个内核的频率)。