2013-03-27 48 views
1

我正在为我的操作系统类进行一些Linux CFS分析,并观察到我无法解释。Linux CFS志愿者上下文切换SCHED_OTHER SCHED_FIFO

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

这不会让我感到意外非自愿的交换机,因为SCHED_OTHER的优先级低得多,所以它不得不放弃CPU。但为什么这会是自愿交换机的情况。为什么SCHED_OTHER会比实时流程更频繁地放弃CPU?这是一个完全相同的过程,所以它只在志愿者放弃CPU时切换到I/O,对吧?我认为政策的选择不会影响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. 通常在一个简单的系统上,几乎没有任何实时任务,大多数任务属于普通任务类。因此,当你实时运行这个过程时,你将使所有的处理器专门用于这个过程(因为实时调度类比普通的任务调度类具有更高的优先级,并且没有(非常少的)实时)任务共享CPU)。当您在普通任务类中运行相同的进程时,进程必须与其他各种进程共享处理器,从而导致更多的上下文切换。
  2. 即使系统中有许多实时任务,所讨论的实时调度算法(FIFO和RR)的性质导致较低的上下文切换。在FIFO中,处理器不会切换到其他任务,直到当前处理完成,并且在RR中存在给予处理的固定间隔(时间 - 量子)。当您查看CFS时,进程获得的时间片与处理器运行队列中的任务数量成正比。这是它的重量和处理器runqueue的总重量的函数。我假设你熟悉FIFO和RR,因为你正在学习操作系统类。欲了解更多关于CFS的信息,我会建议你谷歌它,或者如果你足够勇敢,然后通过它的源代码。

希望答案是完整的:)

+0

感谢这个答案。再次阅读本文和OP后,我意识到我忽略了一个重要的事实,那就是我正在测试的过程是一个I/O绑定过程。因此,就其性质而言,它将进行大量的自愿上下文切换。然而,我仍然不能回答为什么正常计划的任务会比实时计划任务更频繁地自动切换的问题。我知道这样一个过程会自动切换很多,但为什么我会看到这些策略之间的差异?我认为自动交换机有...... – Alex 2013-03-30 15:50:36

+0

......与策略无关,但表示该进程已经转移到I/O,并且在那个时候不需要CPU。政策在这里并不重要,只有当时的过程正在进行,对吗?我认为*非自愿*转换可以通过政策来解释,但是*自愿*转换归因于潜在计划?非常感谢您的回答。对不起,如果我很密集。 – Alex 2013-03-30 15:52:09

+0

是的,你是正确的,无意的开关是由政策解释,而自愿开关是由过程本身引起的。但是我可能是错的,因为这是我们教给我们的单处理器系统。我怀疑多处理器系统,我将不得不看它的源代码。你让我对这里感兴趣。我可以知道你正在运行的程序是什么(看看你是否可以将它附加到OP),以及如何通过getrusage()找出上下文切换?程序是多线程的吗?你在多处理器系统上吗? – Varun 2013-04-01 05:33:13