我对两个不同类的理解是,进程SCHED_FIFO永远不会被内核抢占。即使另一个“SCHED_FIFO”类进程正在等待...
而SCHED_RR策略更多地共享cpu资源。调度程序将让SCHED_RR进程运行一段时间,然后抢占它只是为了让另一个SCHED_RR进程运行。那就是Round Robin。
SCHED_FIFO在某种意义上是“更强大的”,如果一个SCHED_FIFO进程永远不会对内核产生()或者调用一个系统调用 的 单核设备 强> ,那么你所有的其他实时进程可能永远不会运行。
根据手册页,我认为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.
在实时调度中,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 详细解释了这些调度策略。
man sched_setscheduler
在这种特殊情况下,因为两个实时进程具有相同的优先级,所以它们都不会抢占另一个。一个 SCHED_FIFO 进程运行直到它阻塞自身, SCHED_RR 进程运行直到它阻塞自身或其时间量程到期。
SCHED_FIFO
SCHED_RR