在Linux中实时调度

今天早上我读了关于Linux实时调度。 根据罗伯特·洛夫(Robert Love)的“Linux系统编程”一书,这里有两个主要的调度。 一个是SCHED_FIFO,fifo,另一个是SCHED_RR,循环赛。 我了解了fifo和rralgorithm的工作原理。 但是,由于我们有系统调用,

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

我们可以明确地为我们的stream程设置调度策略。 所以在某些情况下,两个由root运行的进程可以有不同的调度策略。 作为具有SCHED_FIFO的一个进程和具有相同优先级的SCHED_RR的另一个进程。 在那种情况下,首先select哪个进程? 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) 

Solutions Collecting From Web of "在Linux中实时调度"

在实时调度中,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进程被一个更高优先级的进程抢占,随后在运行过程中恢复执行将完成其循环时间段的未到期部分。

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

在这种特殊情况下,因为两个实时进程具有相同的优先级,它们都不会抢占对方。 一个SCHED_FIFO进程一直运行,直到它自己阻塞, SCHED_RR进程一直运行,直到它自己阻塞或者它的时间段过期。

我对这两个不同类的理解是,一个进程SCHED_FIFO从来没有被内核所占用。 即使另一个“SCHED_FIFO”类进程正在等待…

而SCHED_RR策略共享cpu资源更多一点。 调度程序将让SCHED_RR进程运行一个时间量,然后预先占用它,只是让另一个SCHED_RR进程。 那完全是循环赛。

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

根据手册页,我认为1是答案。 A,B是RR政策,C是先入先出政策。 由于RR也是一个增强型FIFO,所有这些都是FIFO类。

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

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