先来先服务算法
最简单的一种调度算法是先来先服务算法(First Come First Served,FCFS),也叫做先进先出算法(First In First Out,FIFO)。
优点:简单,易于理解和实现。
缺点:一批任务的平均周转时间取决于各个任务到达的顺序,如果短任务位于长任务之后,那么将增大平均周转时间。
短作业优先算法
为了改进FCFS算法,减少平均周转时间,人们提出了短作业优先算法(Shortest Job First,SJF)。SJF算法的基本思路是:各个任务在开始执行之前,必须事先预计好它的执行时间,然后调度器将根据这些时间,从中选择用时较短的任务优先执行。
SJF算法有两种:不可抢占方式和可抢占方式。其中可抢占方式又叫最短剩余时间优先算法(Shortest Remaining Time First,SRTF)。
时间片轮转算法
时间片轮转算法(Round Robin,RR)的基本思路是:把系统当中的所有就绪任务按照先来先服务的原则,排成一个队列,然后再每次调度的时候,把处理器分派给队列当中的第一个任务,让它去执行一小段CPU时间(即时间片,time slice)。当这个时间片结束时,如果任务还没有执行完成的话,将会发生时钟中断,在时钟中断里面,调度器将会暂停当前任务的执行,并把它送到就绪队列的末尾,然后执行当前的队首任务。反之,如果一个任务在它的时间片用完之前就已经结束了或者阻塞了,那么它就会立即让出CPU给其他任务。
图3-25所示是时间片轮转法的示意图。图a表示初始状态,总共有四个任务位于就绪队列中,先后顺序是B、C、D、A,其中任务B位于队列之首。当CPU空闲时,调度器就会选择B去执行。假设当B运行完一个时间片后,即没有结束也没有被阻塞,这时操作系统就会通过时钟中断来中止它的运行,并把它送到就绪队列的末尾。于是就成了图b的状态,此时,C位于队列之首,C就被调度执行。当C时间片用完后也会送到队列末尾,以此内推。当某个任务运行结束了,就会退出就绪队列,或者某任务被阻塞也也会退出,并加入阻塞队列中去。
优点:公平性,各个就绪任务能得到相同的时间片;活动性,每个就绪任务能一直保持活动。
缺点:时间片的大小q要适当选取,如果选择不当,将会影响到系统的性能和效率。如果q太大,每个任务都在一个时间片内完成,这就退化为先来先服务算法了。如果q太小,每个任务需要更多的时间片才能运行结束,这就使任务之间的切换次数增加,从而增大了系统的管理开销,降低了CPU的使用效率。一般来说,q值选取在20ms~50ms比较合适。
另,时间片轮转算法属于可抢占式调度。
优先级算法
优先级调度算法(priority)的基本思路是:给每个任务都设置一个优先级,然后在任务调度的时候,在所有处于就绪状态的任务中选择优先级最高的任务去运行。上文提到的短作业优先算法其实也是一种优先级算法,每个任务的优先级就是它的运行时间,运行时间越短,优先级越高。
优先级算法可以分为可抢占方式和不可抢占方式。区别在于,一个任务正在运行时,如果来了一个优先级更高的任务,可抢占方式则会立即抢占CPU去运行高优先级的任务,不可抢占方式则会等当前任务运行结束后再执行。
在任务优先级的确定方式上,可以分为静态方式和动态方式。
静态优先级方式:在创建任务的时候就确定任务的优先级,并且一直保持不变直到任务结束。
动态优先级方式:任务的优先级在任务运行过程中可以动态改变。
在优先级算法中,高优先级的任务将抢占低优先级的任务,但如果两个任务的优先级相同,又该如何处理呢?通常的做法是把任务按照不同的优先级进行分组,然后在不同组之间使用优先级算法,在同一组的各个任务之间使用时间片轮转法。(如图)
参考资料:《嵌入式系统设计师》3.3.4章节 任务的调度
转自:https://blog.csdn.net/yannanxiu/java/article/details/52738580