我正在为我的操作系统类进行一些Linux CFS分析,并且有一个我无法解释的观察结果。
对于两个相同的进程,当它们使用SCHED_OTHER策略执行时,我发现自愿上下文切换比使用SCHED_FIFO或SCHED_RR策略执行时多出50%。
这对于非自愿交换机来说并不会让我感到惊讶,因为SCHED_OTHER的优先级要低得多,所以它必须放弃CPU。但为什么自愿开关会出现这种情况。为什么SCHED_OTHER会比实时流程更频繁地自愿放弃CPU?这是一个完全相同的过程,因此只有志愿者在切换到I / O时放弃CPU,对吗?我并不认为政策的选择会影响I / O尝试的频率。
任何Linux人都有自己的想法?谢谢!
答案 0 :(得分:6)
首先要了解调度策略只不过是内核中实现的调度算法。因此SCHED_FIFO,SCHED_RR,SCHED_OTHER是内核中的不同算法。 SCHED_FIFO和SCHED_RR属于实时调度算法“类”。 SCHED_OTHER只是系统中正常进程的调度算法,通常称为CFS(完全公平调度程序)算法。
SCHED_OTHER优先级低得多
准确地说,它没有“很多”较低的优先级,但具有比实时调度类“低”的优先级。 Linux Scheduler中有三个调度类 - 实时调度类,正常进程调度类和空闲任务调度类。优先级如下:
系统上的任务属于这些类之一。 (请注意,在任何时间点,任务只能属于一个调度类,尽管其类可以更改)。 Linux中的调度程序首先检查实时类中是否有任务。如果有,则调用SCHED_FIFO或SCHED_RR算法,具体取决于系统上配置的内容。如果没有实时任务,则调度程序检查正常任务并根据是否准备好运行任何正常任务来调用CFS算法。还
回到主要问题,为什么在两个不同的调度类中运行相同的进程时会看到更多的上下文切换。有两种情况:
希望答案是完整的:)