有人可以解释 SCHED_OTHER、SCHED_FIFO 和 SCHED_RR 之间的区别吗?
谢谢
SCHED_FIFO 和 SCHED_RR 是所谓的“实时”策略。它们实现了 POSIX 标准规定的固定优先级实时调度。具有这些策略的任务会抢占其他所有任务,因此很容易陷入饥饿状态(如果它们不释放 CPU)。
SCHED_FIFO和SCHED_RR的区别在于,在相同优先级的任务中,SCHED_RR以一定的时间片进行循环;相反,SCHED_FIFO 需要任务显式让出处理器。
SCHED_OTHER 是常见的轮询分时调度策略,它根据系统中运行的其他任务将任务调度到某个时间片。
更新:从 Linux 3.14 开始,还有一个名为SCHED_DEADLINE的附加策略。此策略在最早期限优先队列之上实施恒定带宽服务器 (CBS) 算法。此策略下的每个任务都分配了一个截止日期,并执行最早截止日期的任务。描述此算法的最佳资源是Linux 内核中的截止日期调度。
更新 2:自 Linux 4.13 起,SCHED_DEADLINE 已将 CBS 替换为贪婪回收未使用带宽 (GRUB) 算法。
以下是基于 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 分时调度程序,适用于不需要特殊实时机制的所有线程.