1

线程一旦启动,是否总是在同一个 CPU 上运行,直到它终止?还是依赖于操作系统/实现?

我是出于好奇而问这个的。

4

2 回答 2

2

一般来说,在多核盒子上,没有。如果可以使用相同的内核,则可以通过使用仍在 L1 缓存中的数据来获得优势,正如其他人所发布的那样,但是显式强制内核亲和性的缺点是不好的:

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

怎么办?

不必要地抢占线程 Y?移动 Y 的开销,加上如果 Y 也绑定到核心 0 怎么办?再次阻止 X 直到 Y 阻止?阻止 X 在可能的情况下取得进展。

于 2013-02-20T13:42:12.070 回答
2

它取决于操作系统,但是通常操作系统会尝试使线程在相同的内核上运行,因为线程使用的数据更有可能仍被缓存在该内核中,从而提高了性能。

这一切都基于线程调度机制。

于 2013-02-20T12:40:45.833 回答