今天早上我读到了关于Linux实时调度的文章。根据罗伯特·洛夫的“Linux系统编程”一书,有两种主要的调度方式。一种是先进先出( SCHED_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)
发布于 2012-02-21 17:23:03
在实时调度中,FIFO和RR在非实时调度中的含义并不完全相同。进程总是以先进先出的方式选择的,然而,与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进程将完成其循环调度时间段的未过期部分。“
发布于 2012-02-21 17:11:54
man sched_setscheduler
详细解释了这些调度策略。
在这种情况下,因为两个实时进程具有相同的优先级,所以它们中的任何一个都不会抢占另一个。SCHED_FIFO
进程运行,直到它阻塞自己,SCHED_RR
进程运行,直到它阻塞自己,或者它的时间段到期。
发布于 2013-08-06 10:24:16
根据手册页,我认为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的策略设置为先进先出,C将抢占A。
https://stackoverflow.com/questions/9374653
复制相似问题