首先明白调度策略不过是在内核中实现的调度算法。所以SCHED_FIFO,SCHED_RR,SCHED_OTHER在内核中是不同的算法。 SCHED_FIFO和SCHED_RR属于实时调度算法“类”。 SCHED_OTHER不过是系统中正常进程的调度算法,通常称为CFS(完全公平调度程序)算法。
SCHED_OTHER具有低得多的优先级
准确地说它不具有“多”低优先级,但有“一个”比实时调度类优先级较低。 Linux Scheduler中有三个调度类 - 实时调度类,普通进程调度类和空闲任务调度类。优先级如下:
- 实时调度类。
- 正常任务调度类。
- 空闲任务调度类。
系统上的任务属于这些类别之一。 (请注意,在任何时间点,任务只能属于一个调度类,尽管其类可以更改)。 Linux中的调度器首先检查实时类中是否有任务。如果有的话,它会调用SCHED_FIFO或SCHED_RR算法,具体取决于系统上配置的内容。如果没有实时任务,则调度程序将检查正常任务并根据是否有任何正常任务准备好运行来调用CFS算法。另外
回到主要问题,当您在两个不同的调度类中运行相同的进程时,为什么会看到更多的上下文切换。有两种情况:
- 通常在一个简单的系统上,几乎没有任何实时任务,大多数任务属于普通任务类。因此,当你实时运行这个过程时,你将使所有的处理器专门用于这个过程(因为实时调度类比普通的任务调度类具有更高的优先级,并且没有(非常少的)实时)任务共享CPU)。当您在普通任务类中运行相同的进程时,进程必须与其他各种进程共享处理器,从而导致更多的上下文切换。
- 即使系统中有许多实时任务,所讨论的实时调度算法(FIFO和RR)的性质导致较低的上下文切换。在FIFO中,处理器不会切换到其他任务,直到当前处理完成,并且在RR中存在给予处理的固定间隔(时间 - 量子)。当您查看CFS时,进程获得的时间片与处理器运行队列中的任务数量成正比。这是它的重量和处理器runqueue的总重量的函数。我假设你熟悉FIFO和RR,因为你正在学习操作系统类。欲了解更多关于CFS的信息,我会建议你谷歌它,或者如果你足够勇敢,然后通过它的源代码。
希望答案是完整的:)
感谢这个答案。再次阅读本文和OP后,我意识到我忽略了一个重要的事实,那就是我正在测试的过程是一个I/O绑定过程。因此,就其性质而言,它将进行大量的自愿上下文切换。然而,我仍然不能回答为什么正常计划的任务会比实时计划任务更频繁地自动切换的问题。我知道这样一个过程会自动切换很多,但为什么我会看到这些策略之间的差异?我认为自动交换机有...... – Alex 2013-03-30 15:50:36
......与策略无关,但表示该进程已经转移到I/O,并且在那个时候不需要CPU。政策在这里并不重要,只有当时的过程正在进行,对吗?我认为*非自愿*转换可以通过政策来解释,但是*自愿*转换归因于潜在计划?非常感谢您的回答。对不起,如果我很密集。 – Alex 2013-03-30 15:52:09
是的,你是正确的,无意的开关是由政策解释,而自愿开关是由过程本身引起的。但是我可能是错的,因为这是我们教给我们的单处理器系统。我怀疑多处理器系统,我将不得不看它的源代码。你让我对这里感兴趣。我可以知道你正在运行的程序是什么(看看你是否可以将它附加到OP),以及如何通过getrusage()找出上下文切换?程序是多线程的吗?你在多处理器系统上吗? – Varun 2013-04-01 05:33:13