我正在阅读Tanenbaum的《Modern Operating Systems》,有一个关于Gang- or Co-Scheduling的问题:
据说操作系统代码被互斥锁分成逻辑部分,以允许操作系统的不同部分在不同的CPU内核上同时执行(例如,文件系统代码可以与处理中断的代码并行运行)。这意味着操作系统中负责线程或进程调度的部分必须受到互斥锁的保护。
此外,如果两个进程A和B通信频繁,操作系统应该使用Gang- or Co-Scheduling来让这两个进程同时在不同的内核上运行。这是一个性能改进,因为两个进程可能会因为等待各自的其他进程的应答而被阻塞。
现在我的问题:
-
操作系统如何在当前没有运行的内核上调度进程或线程?例如,调度程序运行在核心X上,因此只能将上下文切换到核心X上的另一个线程,而不是CPU/核心y。
-
操作系统如何能够一次调度多个内核?如果调度程序只在一个核心上运行,并受到互斥锁的保护,而不是一次在多个核心上运行?
在对称的多处理器架构中,所有的cpu对所有的内存都有平等的访问权。线程的目标代码和数据对所有内核和处理器都是可访问的,因此很容易将线程/进程从一个内核"移动"到另一个内核。内核只需要实现一个调度方案,以确保所有需要运行的程序都尽可能地运行得最好。在一个核上中断的线程/进程可以在另一个核上恢复,而且代价很小。
确切地说,调度方案是不同的。可以在单个内核上运行单个调度器任务,该任务控制在所有其他内核上运行的任务。或者,每个核都可以有一个小型调度器,它只负责该核上的调度,与它的对等体合作,将线程分散开来。我认为(欢迎更正)这就是Linux所做的。