sched_setscheduler() /sched_getscheduler() 是否只影响指定进程及其子进程的调度策略?
Does sched_setscheduler() /sched_getscheduler() only affect scheduling policy of the specified process and its child processes?
我对 sched_setscheduler()
在 Linux 中的工作方式感到困惑。
我的理解是 Linux 在内部使用 CFS (SCHED_NORMAL)
进行内核进程调度。当用户space启动一个程序(进程)时,会触发clone()
调用,在内核space中创建相应的调度实体。
所以假设有用户进程A和进程B。
进程 A 调用 sched_setscheduler(pid_A, SCHED_RR)
并生成子进程 A1、A2。
进程 B 调用 sched_setscheduler(pid_B, SCHED_NORMAL)
并生成子进程 B1、B2。
在这种情况下,Linux 如何调度进程 A 和 B,因为它们使用不同的调度策略? Linux 是否仍然使用其内部默认调度策略在 A 和 B 之间进行选择,但让 A、A2、A1 使用 SCHED_RR
和 B、B1、B2 使用 SCHED_NORMAL
相互竞争?
Linux 内核有一系列 "scheduling classes" 模块,这些模块决定当内核空闲时应该 运行 哪个线程。
由于 SCHED_RR
是一个 real-time 调度 class,它将在 SCHED_NORMAL
之前决定将什么调度到空闲核心上。这意味着在某种意义上,A 及其 children 严格优先于 B 及其 children。
但是,我相信 Linux 为 non-realtime 调度 class 保留了大约 5% CPU,所以 B 及其 children 不应该饿死 CPU.
我对 sched_setscheduler()
在 Linux 中的工作方式感到困惑。
我的理解是 Linux 在内部使用 CFS (SCHED_NORMAL)
进行内核进程调度。当用户space启动一个程序(进程)时,会触发clone()
调用,在内核space中创建相应的调度实体。
所以假设有用户进程A和进程B。
进程 A 调用 sched_setscheduler(pid_A, SCHED_RR)
并生成子进程 A1、A2。
进程 B 调用 sched_setscheduler(pid_B, SCHED_NORMAL)
并生成子进程 B1、B2。
在这种情况下,Linux 如何调度进程 A 和 B,因为它们使用不同的调度策略? Linux 是否仍然使用其内部默认调度策略在 A 和 B 之间进行选择,但让 A、A2、A1 使用 SCHED_RR
和 B、B1、B2 使用 SCHED_NORMAL
相互竞争?
Linux 内核有一系列 "scheduling classes" 模块,这些模块决定当内核空闲时应该 运行 哪个线程。
由于 SCHED_RR
是一个 real-time 调度 class,它将在 SCHED_NORMAL
之前决定将什么调度到空闲核心上。这意味着在某种意义上,A 及其 children 严格优先于 B 及其 children。
但是,我相信 Linux 为 non-realtime 调度 class 保留了大约 5% CPU,所以 B 及其 children 不应该饿死 CPU.