Linux中的实时调度

时间:2012-02-21 08:58:51

标签: linux kernel scheduling fifo round-robin

今天早上我读到了Linux实时调度。根据“罗伯特·洛夫的Linux系统编程”一书,有两个主要的调度。一个是SCHED_FIFO,fifo,第二个是循环法SCHED_RR。我理解了fifo和rr算法是如何工作的。但是因为我们有系统调用,

sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp)

我们可以为我们的流程明确设置调度策略。所以在某些情况下,由root运行的两个进程可以有不同的调度策略。作为一个具有SCHED_FIFO和另一个具有SCHED_RR并具有相同优先级的进程。在那种情况下,将首先选择哪个流程? FIFO分类过程或RR分类过程?为什么呢?

考虑这种情况。有三个过程A,B,C。所有人都有同样的优先权。 A和B是RR分类过程,C是FIFO分类过程。 A和B是可运行的(因此两者都在一段时间内交替运行)。目前A正在运行。现在C变得可运行了。在这种情况下,是否

1. A will preempt for C, or
2. A will run until its timeslice goes zero and let C run. Or
3. A will run until its timeslice goes zero and let B run.
   a) here after B runs till its timeslice becomes zero and let C run or
   b) after B runs till its timeslice becomes zero and let A run again (then C will starve untill A and B finishes)

4 个答案:

答案 0 :(得分:15)

在实时调度中,FIFO和RR与非实时调度的含义完全不同。始终以FIFO方式选择进程,但是,与SCHED_RR的时间量不同,SCHED_FIFO的时间量不受限制。

SCHED_FIFO进程不会抢占相同优先级的SCHED_RR进程。

sched_setscheduler(2) - Linux手册页

...

“进程的调度策略确定将其插入到具有相同静态优先级的进程列表中的位置以及它将如何在此列表中移动。所有调度都是抢占式的:如果具有更高静态优先级的进程已准备好运行,当前正在运行的进程将被抢占并返回到等待列表中以获得其静态优先级。调度策略仅确定具有相同静态优先级的可运行进程列表中的排序。“

...

“SCHED_FIFO进程一直运行,直到它被I / O请求阻塞,它被更高优先级的进程抢占,或者它调用sched_yield(2)。”

...

“当SCHED_FIFO进程变为可运行时,它将被插入列表的末尾以获得其优先级。”

...

“SCHED_RR:循环调度

SCHED_RR是SCHED_FIFO的简单增强。上面针对SCHED_FIFO描述的所有内容也适用于SCHED_RR,除了每个进程仅允许运行最大时间量程。如果SCHED_RR进程已经运行了等于或长于时间量程的时间段,则它将被放在列表的末尾以获得其优先级。已被更高优先级进程抢占并随后作为正在运行的进程恢复执行的SCHED_RR进程将完成其循环时间量的未到期部分。“

答案 1 :(得分:10)

man sched_setscheduler详细解释了这些调度策略。

在这种特殊情况下,因为两个实时进程具有相同的优先级,所以它们都不会抢占另一个。 SCHED_FIFO进程一直运行直到它阻塞自身,SCHED_RR进程一直运行直到它阻塞自身或其时间量到期。

答案 2 :(得分:1)

根据手册页,我认为1就是答案。 A,B是RR策略,C是FIFO策略。由于RR也是增强型FIFO,所有这些都是FIFO级。

因为所有这些都具有相同的优先级,并且手册页说"对sched_setscheduler()或sched_setparam(2)的调用将把pid标识的SCHED_FIFO(或SCHED_RR)进程放在列表的开头(如果它是可运行的)。因此,如果它具有相同的优先级,它可以抢占当前正在运行的进程。 (POSIX.1-2001指定进程应该到列表的末尾。)"

一旦调用sched_setscheduler将C的策略设置为FIFO,C将抢占A.

答案 3 :(得分:0)

我对两个不同类的理解是,进程SCHED_FIFO永远不会被内核抢占。即使另一个“SCHED_FIFO”类进程正在等待它......

虽然SCHED_RR策略更多地共享cpu资源。调度程序将让SCHED_RR进程运行一段时间,然后抢占它只是为了让另一个SCHED_RR进程运行。那就是Round Robin。

SCHED_FIFO是“更强大的”,因为如果SCHED_FIFO进程永远不会对内核产生()或在单核设备上调用系统调用,那么所有其他实时进程可能永远不会运行