今天早上,我读了有关Linux实时调度的信息。根据《 Robert Love的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)
最佳答案
在实时调度中,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进程已被更高优先级的进程抢占,随后在运行进程中恢复执行,将完成其循环时间范围的未到期部分。”
关于linux - Linux中的实时调度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9374653/