我对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。
关于linux - sched_setscheduler()/sched_getscheduler()仅影响指定进程及其子进程的调度策略吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55655951/