操作系统如何同时在多个 CPU 内核上安排多个线程?
How do Operating Systems schedule multiple threads on multiple CPU cores simultaneously?
我目前正在阅读 Tanenbaum 的现代操作系统并且对 Gang- 或 Co-Scheduling 有疑问:
据说操作系统代码被互斥锁分成逻辑部分,以允许 OS 的不同部分在不同的 CPU 内核上同时执行(例如,文件系统代码可以是运行 与处理中断的代码并行)。这意味着 OS 中负责线程或进程调度的部分必须由互斥体保护。
此外,如果两个进程 A 和 B 正在大量通信,OS 应该使用 Gang- 或 Co-Scheduling 让这两个进程同时 运行 在不同的核心上时间。这是一项性能改进,因为这两个进程可能会因等待相应其他进程的响应而被阻塞。
现在我的问题:
OS 如何在当前 运行 未在其上的核心上安排进程或线程?例如。核心 X 上的调度程序 运行s,因此只能将上下文切换到核心 X 上的另一个线程,而不是 CPU/core Y.
OS 是如何同时调度多个核心的?如果调度程序仅在一个核心上 运行s 并且受互斥锁保护,而不是一次在多个核心上 运行?
在对称的多处理器架构中,所有 CPU 对所有内存具有同等的访问权限。一个线程的目标代码和数据是所有内核和处理器都可以访问的,所以很容易"move"一个线程/进程从一个内核到另一个内核。内核只需要实现一个调度方案,以确保所有需要 运行 的东西都尽可能地得到 运行。在一个内核上被中断的线程/进程可以在另一个内核上恢复,而代价很小。
具体的调度方案各不相同。单个内核上可能有一个调度程序任务 运行ning,它控制所有其他内核上的 运行ning。或者,每个核心可能有一个微型调度程序,负责仅在该核心上进行调度,并与其对等方合作以将线程分布到周围。这就是我认为(欢迎更正)Linux 的作用。
我目前正在阅读 Tanenbaum 的现代操作系统并且对 Gang- 或 Co-Scheduling 有疑问:
据说操作系统代码被互斥锁分成逻辑部分,以允许 OS 的不同部分在不同的 CPU 内核上同时执行(例如,文件系统代码可以是运行 与处理中断的代码并行)。这意味着 OS 中负责线程或进程调度的部分必须由互斥体保护。
此外,如果两个进程 A 和 B 正在大量通信,OS 应该使用 Gang- 或 Co-Scheduling 让这两个进程同时 运行 在不同的核心上时间。这是一项性能改进,因为这两个进程可能会因等待相应其他进程的响应而被阻塞。
现在我的问题:
OS 如何在当前 运行 未在其上的核心上安排进程或线程?例如。核心 X 上的调度程序 运行s,因此只能将上下文切换到核心 X 上的另一个线程,而不是 CPU/core Y.
OS 是如何同时调度多个核心的?如果调度程序仅在一个核心上 运行s 并且受互斥锁保护,而不是一次在多个核心上 运行?
在对称的多处理器架构中,所有 CPU 对所有内存具有同等的访问权限。一个线程的目标代码和数据是所有内核和处理器都可以访问的,所以很容易"move"一个线程/进程从一个内核到另一个内核。内核只需要实现一个调度方案,以确保所有需要 运行 的东西都尽可能地得到 运行。在一个内核上被中断的线程/进程可以在另一个内核上恢复,而代价很小。
具体的调度方案各不相同。单个内核上可能有一个调度程序任务 运行ning,它控制所有其他内核上的 运行ning。或者,每个核心可能有一个微型调度程序,负责仅在该核心上进行调度,并与其对等方合作以将线程分布到周围。这就是我认为(欢迎更正)Linux 的作用。