Linux的SCHED_OTHER、SCHED_FIFO和SCHED_RR - 区别

53
可以有人解释一下 SCHED_OTHER、SCHED_FIFO 和 SCHED_RR 的区别吗?
谢谢。

2
非常类似于Linux的这个:https://dev59.com/Tmox5IYBdhLWcg3wLhei - yves Baumes
不完全正确,没有提到SCHED_OTHER。 - eve
2个回答

73

SCHED_FIFO和SCHED_RR是所谓的“实时”策略。它们实现了 POSIX 标准指定的固定优先级实时调度。具有这些策略的任务会抢占所有其他任务,因此很容易出现饥饿现象(如果它们不释放 CPU)。

SCHED_FIFO与SCHED_RR之间的区别在于,对于具有相同优先级的任务,SCHED_RR使用一定的时间片轮询;而SCHED_FIFO则需要任务显式地释放处理器。

SCHED_OTHER是常见的轮询时间共享调度策略,根据系统中运行的其他任务为任务安排一定的时间片。

更新:自Linux 3.14以来,增加了一个名为SCHED_DEADLINE的附加策略。该策略在Earliest Deadline First队列上实现了恒定带宽服务器(CBS)算法。该策略下的每个任务都被分配一个截止时间,并执行最早截止时间的任务。描述此算法的最佳资源是Linux内核中的截止时间调度

更新2:自Linux 4.13以来,SCHED_DEADLINE已用贪婪回收未使用带宽(GRUB)算法替换了CBS。


3
请注意,Linux调度程序可以在SCHED_DEADLINE下限制不良行为的进程,以便其他进程获得CPU时间。例如,请参见https://www.youtube.com/watch?v=AmyfSjRMcIY和http://retis.sssup.it/~jlelli/talks/rts-like14/SCHED_DEADLINE.pdf。也就是说,如果SCHED_DEADLINE进程表示需要5个时间片中的2个,但实际消耗更多,则必要时将被降低限制。要在Linux上实现类似硬实时(hard realtime)的效果,SCHED_DEADLINE可能是最好的选择。 - Erik Alapää
感谢提供这些链接。时间过去了,其中一个已经失效。我找到了this此处 - Neil Gatenby

6
这里是基于Linux手册(http://man7.org/linux/man-pages/man7/sched.7.html)的SCHED_OTHER、SCHED_FIFO和SCHED_RR之间的差异。
SCHED_FIFO:先进先出调度
SCHED_FIFO只能与静态优先级高于0一起使用,这意味着当一个SCHED_FIFO线程变为可运行状态时,它将立即抢占任何当前正在运行的SCHED_OTHER、SCHED_BATCH或SCHED_IDLE线程。SCHED_FIFO是一种简单的调度算法,没有时间片。
SCHED_RR:轮转调度
SCHED_RR是SCHED_FIFO的简单增强版。上述所有SCHED_FIFO的描述也适用于SCHED_RR,除了每个线程只允许运行最大时间量。如果SCHED_RR线程运行时间等于或超过时间量,则会将其放在其优先级列表的末尾。

SCHED_OTHER: 默认的 Linux 时间共享调度

SCHED_OTHER 只能在静态优先级 0 上使用(即,在实时策略下运行的线程总是优先于 SCHED_OTHER 进程)。SCHED_OTHER 是标准的 Linux 时间共享调度器,适用于不需要特殊实时机制的所有线程。


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