25

今天早上我阅读了有关 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)
4

4 回答 4

18

在实时调度中,FIFO 和 RR 与非实时调度中的含义并不完全相同。进程总是以 FIFO 方式选择,但是,SCHED_FIFO 的时间量不受 SCHED_RR 的时间量的限制。

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-21T09:23:02.947 回答
10

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

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

于 2012-02-21T09:11:54.430 回答
1

根据手册页,我认为 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。

于 2013-08-06T02:24:15.640 回答
-1

我对这两个不同类的理解是进程 SCHED_FIFO 永远不会被内核抢占。即使另一个“SCHED_FIFO”类进程正在等待轮到它......

虽然 SCHED_RR 策略共享 cpu 资源多一点。调度程序将让 SCHED_RR 进程运行一段时间,然后抢占它只让另一个 SCHED_RR 进程运行。那正是循环法。

SCHED_FIFO 在某种意义上“更强大”,如果 SCHED_FIFO 进程从不向内核屈服()或在单个核心设备上调用系统调用,那么您的所有其他实时进程可能永远不会运行。

于 2012-02-21T09:12:54.570 回答