Linux中的实时调度

the*_*heB 21 linux kernel scheduling fifo round-robin

今天早上我读到了Linux实时调度.根据Robert Love的"Linux系统编程"一书,有两个主要的调度.一个是SCHED_FIFO,fifo,第二个是循环法SCHED_RR.我理解了fifo和rr算法是如何工作的.但是,由于我们有系统调用,

sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp)
Run Code Online (Sandbox Code Playgroud)

我们可以为我们的流程明确设置调度策略.所以在某些情况下,由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)
Run Code Online (Sandbox Code Playgroud)

sve*_*nfx 17

在实时调度中,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进程将完成其循环时间量的未到期部分.


Max*_*kin 10

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

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