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.