同优先级下SCHED_RR与SCHED_FIFO混合调度的执行顺序问题
同优先级SCHED_FIFO与SCHED_RR混合调度核心规则
- Linux实时调度器对同优先级的所有实时进程(不管是
SCHED_FIFO还是SCHED_RR类型),会按加入运行队列的先后顺序排入同一个先进先出队列,调度顺序和进程的调度类型没有关系,仅由队列中的先后顺序决定 - 两类进程的唯一区别是运行时的让出规则:
SCHED_FIFO进程一旦占用CPU,会一直运行直到主动退出、阻塞、或者被更高优先级实时进程抢占,不会被同优先级的其他进程抢占SCHED_RR进程占用CPU后,最多运行完分配的时间片就会让出CPU,排到同优先级队列的末尾,等待下一次调度
问题逐个解答
问题1:同优先级进程到达顺序为A(r)、B(f)、C(f)、D(r)、E(r)的执行顺序
如果所有进程都没有主动阻塞、也没有更高优先级进程介入,执行逻辑如下:
- 第一个运行队首的A(r),它运行完自己的时间片后,让出CPU排到队列末尾,此时队列顺序变为B(f)、C(f)、D(r)、E(r)、A(r)
- 接下来运行B(f),它会一直运行直到主动让出/阻塞/被更高优先级进程抢占,结束后排到队列末尾,队列变为C(f)、D(r)、E(r)、A(r)、B(f)
- 接下来运行C(f),同样运行到主动让出/阻塞/被高优先级抢占,结束后排到队尾,队列变为D(r)、E(r)、A(r)、B(f)、C(f)
- 接下来运行D(r),用完时间片后排到队尾,队列变为E(r)、A(r)、B(f)、C(f)、D(r)
- 接下来运行E(r),用完时间片后排到队尾,队列回到初始顺序,进入下一轮循环
整体执行流按「A(r)时间片耗尽→B(f)主动让出→C(f)主动让出→D(r)时间片耗尽→E(r)时间片耗尽→A(r)时间片耗尽……」的顺序循环。
问题2:A的调度类型改为(f)后的执行顺序变化
队列初始顺序还是A(f)、B(f)、C(f)、D(r)、E(r):
- 第一个运行A(f),它需要运行到主动让出/阻塞/被高优先级抢占后,才会排到队尾,后续执行逻辑和问题1完全一致
- 和修改前的唯一区别是第一个运行的进程不再是用完时间片就退出的RR进程,变成了需要主动让出的FIFO进程,其余调度顺序没有变化
问题3:A先到(RR类型)、B后到(FIFO类型)同优先级的执行顺序
- 先运行A(r),用完时间片后排到队尾,队列变为B(f)、A(r)
- 接下来运行B(f),一直运行到主动让出/阻塞/被高优先级抢占后,排到队尾,队列变回A(r)、B(f)
- 按上述逻辑循环往复
问题4:A先到(FIFO类型)、B后到(RR类型)同优先级的执行顺序
- 先运行A(f),一直运行到主动让出/阻塞/被高优先级抢占后,排到队尾,队列变为B(r)、A(f)
- 接下来运行B(r),用完时间片后排到队尾,队列变回A(f)、B(r)
- 按上述逻辑循环往复
总结
同优先级下SCHED_FIFO和SCHED_RR混合调度时,调度顺序完全由进程进入同优先级运行队列的先后顺序决定,和进程的调度类型没有任何关系,调度类型仅影响当前运行进程什么时候让出CPU,不会改变队列里的调度优先级顺序。
内容的提问来源于stack exchange,提问作者algo
相关产品推荐
相关产品推荐

