假设我们有一个具有20个内核的CPU和一个具有20个CPU密集型的进程,彼此独立于每个线程:每个CPU内核一个线程.我试图弄清楚在这种情况下是否发生了上下文切换.我相信这是因为操作系统中的系统进程也需要CPU时间.
我知道有不同的CPU架构,一些答案可能会有所不同,但请您解释一下:
如何在Linux或Windows以及一些已知的CPU架构上进行上下文切换?在现代硬件的引擎盖下会发生什么?
如果我们有10个核心和20个线程或者反过来怎么办?
如果我们有n个CPU,如何计算我们需要多少线程?
上下文切换后CPU缓存(L1/L2)是否为空?
谢谢
如何在Linux或Windows以及一些已知的CPU架构上进行上下文切换?在现代硬件的引擎盖下会发生什么?
发生中断时会发生上下文切换,并且该中断与内核线程和进程状态数据一起指定一组运行线程,这些线程与中断之前运行的集合不同.请注意,在OS术语中,中断可能是导致驱动程序运行的"实际"硬件中断,驱动程序请求调度运行,或者是来自已运行的线程的系统调用.在任何一种情况下,OS调度状态机都决定是否更改在可用内核上运行的线程集.
内核可以通过停止线程并运行其他线程来更改正在运行的线程集.它可以通过排队抢占请求并生成该核心的硬件中断来强制核心运行其处理器间驱动程序来处理请求,从而阻止任何核心上运行的任何线程.
如果我们有10个内核和20个线程怎么办?
取决于线程正在做什么.如果它们处于准备/运行之外的任何其他状态(例如,在I/O或线程间通信中被阻止),则它们之间将不会进行上下文切换,因为没有任何正在运行.如果它们都准备就绪/正在运行,其中10个将在10个核心上永远运行,直到出现中断.大多数系统都有周期性的定时器中断,可以共享线程周围的可用内核.
或者相反
10个核心上运行10个线程.其他10个核心停止运行.OS可以围绕核心移动线程,例如.防止模具上的不均匀散热.
如果我们有n个CPU,如何计算我们需要多少线程?
应用程序依赖.如果所有核心总是在与核心一样多的准备线程上使用100%,那将是很好的,但是,由于大多数线程被阻塞的时间比它们运行的时间长得多,所以很难,除了在某些最终情况下(例如 - 你的20个核心上的"20个CPU密集型线程"),以提供任何最佳数字.
上下文切换后CPU缓存(L1/L2)是否为空?
也许 - 它完全取决于线程的数据使用情况.像往常一样,缓存将按需重新加载.没有'context-switch total cache reload'但是,如果线程在运行时访问不同的大型数据数组,那么(L1至少)缓存将在线程运行期间完全重新加载.