我对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
竞争呢?
答案 0 :(得分:1)
Linux内核具有一系列“调度类”,这些模块决定了当内核空闲时应该运行哪个线程的模块。
由于SCHED_RR
是实时调度类,因此它将在SCHED_NORMAL
之前决定要在空闲核上调度什么。这意味着从某种意义上说,A及其子级比B及其子级具有严格的优先级。
但是,我相信Linux会为非实时调度类预留5%的CPU,因此B及其子级不应缺少CPU。