2013-02-20 125 views
1

线程一旦启动,总是运行在同一个CPU上,直到它终止为止?或者它是OS /实施依赖?线程是否始终运行在同一个内核上?

我出于好奇问这个。

+0

如果只有一个CPU核心,是的。对于多核机器来说,答案是“通常不是”(核心之间的线程迁移是可能的),但OS /实现依赖于此。在某些OS/libs/pthreads中有“setaffinity”调用来将某些线程绑定到可用CPU核心的某个子集。 – osgx 2013-02-20 12:39:07

+0

简短回答:不,线程将按计划程序认为合适的方式跳转核心。如果您对这些细节感到好奇(至少对于Windows),您可能需要查看[Windows Internals第6版](http://www.amazon.com/dp/0735648735)(ISBN:978-0735648739)。第5章的一半致力于深入解释线程调度。 – 2013-02-20 12:39:20

回答

2

一般来说,在多核心盒子上,没有。如果可以使用相同的内核,那么利用仍在L1缓存中的数据可能会获得优势(由其他人发布),但是明确强制内核关联的缺点是不好的:

线程X是创建并绑定到核心0. 线程X运行。 系统调用的线程X块,可能用于I/O或线程间通信。 操作系统在内核0上运行线程Y. 线程X在内核1,2和3空闲时准备就绪。

现在呢?

不必要地抢占线程Y?移动Y的开销,以及如果Y也绑定到核心0,那该怎么办? 再次阻止X直到Y块?防止X在可以做时取得进展。

2

它依赖于操作系统, 然而,一般来说,操作系统试图让线程在相同的内核上运行,因为线程所使​​用的数据在内核中被缓存的可能性更高,从而提高了性能。

它都基于线程调度机制。

相关问题