我对sched_setscheduler()
在Linux中如何工作感到困惑。
我的理解是Linux在内部使用CFS (SCHED_NORMAL)
进行内核进程调度。当用户空间启动程序(进程)时,将触发clone()
调用以在内核空间中创建相应的调度实体。
因此假设有用户进程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内核有一系列“调度类”,它们是决定核心空闲时应该运行什么线程的模块。
由于SCHED_RR
是一个实时调度类,它将决定在SCHED_NORMAL
之前安排到空闲核心的内容。这意味着从某种意义上说,A及其子女对B及其子女有严格的优先权。
但是,我相信Linux为非实时调度类保留了5%的CPU,因此B及其子代不应该缺乏CPU。