多核CPU,多线程和上下文切换?

16
假设我们有一个20核心的CPU和一个具有20个CPU密集型且互不干扰的线程的进程:每个CPU核心一个线程。我正在尝试弄清楚在这种情况下是否会发生上下文切换。我认为会发生上下文切换,因为操作系统中有需要CPU时间的系统进程。
我知道有不同的CPU架构,某些答案可能会有所不同,但您能否请解释:
  • 上下文切换如何发生,例如在Linux或Windows以及一些已知的CPU架构上?现代硬件下会发生什么?
  • 如果我们有10个核心和20个线程,或者反过来呢?
  • 如何计算如果我们有n个CPU,则需要多少线程?
  • 上下文切换后,CPU缓存(L1 / L2)是否被清空?
谢谢
1个回答

20
当中断发生时,上下文切换会发生,例如在Linux或Windows上以及一些已知的CPU架构中会发生什么?在现代硬件下,在幕后会发生什么?
当中断发生时,其中包括内核线程和进程状态数据,指定了与之前不同的一组运行线程。请注意,在操作系统方面,中断可能是导致驱动程序运行并请求调度运行的“真实”硬件中断,也可能是来自正在运行的线程的系统调用。在任一情况下,操作系统调度状态机决定是否更改正在可用内核上运行的线程集。
内核可以通过停止某些线程并运行其他线程来更改正在运行的线程集。它可以通过将premption请求排队并生成该内核的硬件中断来停止任何正在任何内核上运行的线程,从而强制该内核运行其interprocessor driver以处理该请求。
如果有10个内核和20个线程怎么办?
这取决于线程正在做什么。如果它们处于除就绪/运行状态以外的任何其他状态(例如被I/O或线程间通信阻塞),则它们之间不会进行上下文切换,因为没有运行任何东西。如果它们都准备好/正在运行,则其中10个将永远在10个核心上运行,直到出现中断。大多数系统都有一个定期的计时器中断,可以共享可用内核周围的线程。
或者反过来
10个线程在10个内核上运行。其他10个内核被停止。操作系统可以移动线程以平均分布散热片上的热量等。
如何计算如果我们有n个CPU需要多少线程?

应用程序相关。如果所有核心总是以正好与核心数相同的准备线程数量的100%使用率被使用,那将会很不错,但由于大多数线程的阻塞时间远远超过运行时间,所以除了在某些特殊情况下(例如 - 在20个CPU密集型线程上的20个核心),很难找到任何最优数量。

在上下文切换之后,CPU缓存(L1 / L2)是否会被清空?

或许会 - 它完全取决于线程的数据使用情况。缓存将按需重新加载,如常规操作一样。没有“上下文切换总缓存重载”,但是,如果线程在运行时访问不同的大型数据数组,则至少(L1)高速缓存确实会在线程运行期间完全重新加载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接