假设我们有一个具有20个核心的CPU和一个具有20个CPU密集型的进程,它们彼此独立于线程:每个CPU内核一个线程。我试图弄清楚在这种情况下是否会发生上下文切换。我认为这是因为操作系统中的系统进程也需要CPU时间。
我知道有不同的CPU架构,有些答案可能会有所不同,但可否请你解释:
谢谢
发布于 2014-01-28 21:24:11
上下文切换是如何发生的,例如在Linux或Windows以及一些已知的CPU体系结构上?在现代硬件的引擎盖下发生了什么?
当中断发生时发生上下文切换,该中断与内核线程和进程状态数据一起指定一组与中断前运行的线程不同的正在运行的线程。请注意,从OS的角度来说,中断可能是一个“真正的”硬件中断,它会导致驱动程序运行并请求调度运行,或者是来自已经运行的线程的syscall。在这两种情况下,OS调度状态机决定是否更改运行在可用内核上的线程集。
内核可以通过停止线程/s和运行其他线程来更改正在运行的线程集。它可以通过排队等待抢占请求并生成内核的硬件中断来阻止运行在任何核心上的任何线程,从而迫使内核运行其处理器间驱动程序来处理请求。
如果我们有10个核心和20个线程呢?
取决于线程在做什么。如果它们处于就绪/运行之外的任何其他状态(例如在I/O或线程间通信中阻塞),则它们之间将不会发生上下文切换,因为没有任何内容正在运行。如果它们都准备好/正在运行,它们中的10个将永远运行在这10个核心上,直到出现中断。大多数系统都有一个周期性的定时器中断,可以在线程周围共享可用的核心。
或者相反的情况
10个线程运行在10个核心上。其余10个核心停止运行。操作系统可以在内核周围移动线程,例如。防止模具的散热不均匀。
如果我们有n个CPU,如何计算我们需要多少线程?
应用程序依赖。如果所有的内核都在与内核一样多的就绪线程上消耗100%的话,那就太好了,但是,由于大多数线程被阻塞的时间比它们运行的时间长得多,所以很难找到任何最佳的数目,除非在一些终端情况下(例如,您的20个CPU密集型线程位于20个核上)。
上下文切换后CPU缓存(L1/L2)是否为空?
也许-这完全取决于线程的数据使用情况。这些缓存将像往常一样按需重新加载。没有“上下文切换总缓存重新加载”,但是,如果线程在运行时访问不同的大型数据数组,那么(至少L1)缓存将在线程运行期间得到完全重新加载。
https://stackoverflow.com/questions/21414462
复制相似问题