Linux CFS志愿者上下文切换SCHED_OTHER SCHED_FIFO

And*_*Dev 1 scheduling linux-kernel

我正在为我的OS类做一些Linux CFS分析,并且有一个我无法解释的观察.

对于两个相同的进程,当它们使用SCHED_OTHER策略执行时,我发现自愿上下文切换比使用SCHED_FIFO或SCHED_RR策略执行它们多50%.

这对于非自愿切换不会让我感到意外,因为SCHED_OTHER的优先级要低得多,所以它必须放弃CPU.但为什么自愿开关会出现这种情况.为什么SCHED_OTHER会比实时流程更频繁地自愿放弃CPU?这是一个完全相同的过程,因此只有志愿者在切换到I/O时放弃CPU,对吗?我不认为政策的选择会影响I/O尝试的频率.

任何Linux人都有自己的想法?谢谢!

小智 6

首先要了解调度策略只不过是内核中实现的调度算法.因此SCHED_FIFO,SCHED_RR,SCHED_OTHER是内核中的不同算法.SCHED_FIFO和SCHED_RR属于实时调度算法"类".SCHED_OTHER只是系统中正常进程的调度算法,通常称为CFS(完全公平调度程序)算法.

SCHED_OTHER的优先级要低得多

确切地说,它没有"很多"较低的优先级,但具有比实时调度类"低"的优先级.Linux Scheduler中有三个调度类 - 实时调度类,正常进程调度类和空闲任务调度类.优先级如下:

  1. 实时调度类.
  2. 普通任务调度类.
  3. 空闲任务调度类.

系统上的任务属于这些类之一.(请注意,在任何时间点,任务只能属于一个调度类,尽管其类可以更改).Linux中的调度程序首先检查实时类中是否有任务.如果有,则调用SCHED_FIFO或SCHED_RR算法,具体取决于系统上配置的内容.如果没有实时任务,则调度程序检查正常任务并根据是否有任何正常任务准备运行来调用CFS算法.也

回到主要问题,为什么在两个不同的调度类中运行相同的进程时会看到更多的上下文切换.有两种情况:

  1. 通常在一个简单的系统上,几乎没有任何实时任务,大多数任务属于普通任务类.因此,当您在实时类中运行该进程时,您将拥有此进程的所有处理器(因为实时调度类具有比正常任务调度类更高的优先级,并且没有(/非常少的实际)时间任务(s)与CPU共享.当您在普通任务类中运行相同的进程时,该进程必须与其他各种进程共享处理器,从而导致更多的上下文切换.
  2. 即使系统中存在许多实时任务,所讨论的实时调度算法(FIFO和RR)的性质也会导致较低的上下文切换.在FIFO中,处理器在当前完成之前不切换到其他任务,并且在RR中存在给予进程的固定间隔(时间量子).当您查看CFS时,进程获得的时间片与处理器的runqueue中的任务数成比例.它是其重量和处理器运行队列总重量的函数.我假设您已经精通FIFO和RR,因为您正在学习OS课程.有关CFS的更多信息,我会建议你谷歌它或如果你足够勇敢,然后通过它的源代码.

希望答案是完整的:)