2

我正在为我的操作系统类做一些 Linux CFS 分析,并且有一个我无法解释的观察结果。

对于两个在其他方面相同的进程,当它们使用 SCHED_OTHER 策略执行时,我看到的自愿上下文切换比使用 SCHED_FIFO 或 SCHED_RR 策略执行它们时多 50%。

对于非自愿切换,这不会让我感到惊讶,因为 SCHED_OTHER 的优先级要低得多,所以它必须放弃 CPU。但为什么自愿转换会出现这种情况。为什么 SCHED_OTHER 会比实时进程更频繁地自愿放弃 CPU?这是一个相同的进程,所以它只会在切换到 I/O 时自愿放弃 CPU,对吧?而且我认为策略的选择不会影响 I/O 尝试的频率。

任何Linux人有一个想法?谢谢!

4

1 回答 1

7

首先要了解调度策略只不过是在内核中实现的调度算法。所以SCHED_FIFO、SCHED_RR、SCHED_OTHER是内核中不同的算法。SCHED_FIFO 和 SCHED_RR 属于实时调度算法“类”。SCHED_OTHER不过是系统中正常进程的调度算法,更通俗的说法是CFS(Completely Fair Scheduler)算法。

SCHED_OTHER 的优先级要低得多

准确地说,它没有“太多”的低优先级,但比实时调度类的优先级低“a”。Linux Scheduler中有三个调度类——Real-Time调度类、Normal Process调度类和Idle Tasks调度类。优先级如下:

  1. 实时调度类。
  2. 正常任务调度类。
  3. 空闲任务调度类。

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

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

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

希望答案是完整的:)

于 2013-03-28T12:00:45.497 回答