SCHED_FIFO和SCHED_RR如何相互干扰?

6

SCHED_FIFO和SCHED_RR都用于实时应用。我知道SCHED_RR可以被时间片抢占。但是假设我有一个线程设置为SCHED_FIFO,另一个线程设置为SCHED_RR,如果两个线程都准备好运行,它们是否仅按优先级调度?如果它们有相同的优先级会发生什么?

SCHED_FIFO按照优先级顺序运行,并且不会被抢占,直到当前进程释放CPU资源。当然,如果有更高优先级的进程处于就绪状态,则会将其暂停并运行更高优先级的进程。SCHED_RR也按照优先级进行调度,但是它可以被时间片抢占。如果两个线程具有相同的优先级,则按照调度策略(FIFO或RR)的规则来选择下一个运行的线程。

1个回答

7
从概念上讲,与每个静态优先级相关联的是可运行进程列表。这些列表可以包含SCHED_FIFOSCHED_RR进程 - 这两种调度策略共享相同的静态优先级集。
在选择要运行的进程时,调度程序会选择最高静态优先级的非空列表中的进程,而不考虑该进程的调度策略。
调度策略影响进程在这些列表中移动的方式。对于SCHED_FIFO,一旦进程到达给定优先级的列表头部,它将停留在那里,直到阻塞或放弃。对于SCHED_RR,超过其最大时间量的可运行进程将被移动到其静态优先级的列表末尾。

很抱歉晚了这么久才发表评论。假设一个系统仅有三个'SCHED_RR'进程:一个在优先级90,另外两个在优先级45。在时间片结束时,优先级为90的进程会一遍又一遍地被调度,从而使其他两个进程饿死(除非它们被阻塞)。我认为是这样的,除非调度程序明确地避免再次安排同一进程,以防还有其他进程需要调度。 - Margaret Bloom
2
@MargaretBloom:如果机器只有一个CPU核心可用,那就是正确的。只要优先级为90的进程可运行,优先级为90的可运行进程列表将不为空,因此将选择相同的进程运行。这就是实时调度优先级的工作原理-如果可以运行更高优先级的进程,则较低优先级的进程永远不会运行。(如果有多个CPU核心,则优先级为90的进程将始终运行,并且优先级为45的进程将交替同时运行)。 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接