一、总览
Linux操作系统的调度策略如下图所示,主要分为两种调度方式;一种是对于普通任务而言,采用的是CFS调度,另一种是对于实时任务采用的调度策略(SCHED-FIFO和SCHED-RR)
二、CFS调度器简介
CFS的全称是completely fair scheduler,意思是完全公平调度。它的目标是让每个任务尽可能公平地获得CPU运行时间。其工作原理是:首先定义了一个核心概念--虚拟运行时间(vruntime)用于管理每个任务在CPU上的运行时间。每一个任务都有一个vruntime,这个vruntime是根据任务的优先级和该任务所占权重计算得出的。当该任务运行时,其vruntime会逐渐增加。但是对于不不同优先级的任务来说,vruntime增加的速度是不同的;高优先级的增加慢,低优先级任务增加快。而每次发生调度,总会选择vruntime值最小的任务来执行,因此,这也使得高优先级的任务可以得到更多的CPU运行时间。而当一个任务运行一段时间以后,它的vruntime可能不再是最小的任务,此时CFS会选择具有更小的vruntime任务来执行。通过不断调节和比较 vruntime,CFS 实现了对所有任务的公平调度,同时也保持了系统的高效运行。高优先级任务可以更频繁地获得 CPU 时间,而低优先级任务也不会完全被饿死。
其中,为了方便管理任务与RTOS中任务控制块类似,用红黑树这种数据结构来进行管理。通过将每个任务的vruntime插入到红黑树中,vruntime最小的任务在树的最左边,每次需要调度时,选择树的最左边来执行。
三、SCHED_FIFO
这是一种基于任务优先级的抢占式调度策略,每次任务调度,选择任务优先级最高的实时任务来运行。
四、SCHED_RR
这是一种基于时间片轮转的调度策略,主要用于相同优先级的实时任务。每个任务会在固定时间片内运行,等时间结束,切换到下一个相同优先级的实时任务运行。这样通过时间片机制,使得相同优先级的实时任务可以轮流运行。
总结:相比于RTOS,Linux操作系统具有更复杂的调度机制,而不是像RTOS,只有基于任务优先级抢占式调度机制或者是基于时间片轮转调度机制。