进程调度算法

调度也称dispatcher, 内核的主要职责之一就是决定该轮到哪个任务运行了。多数实时内核是基于优先级调度算法的。每个任务根据其重要程度的不同被赋予一定的优先级。基于优先级的调度法指CPU 总是让处在就绪态的优先级最高的任务先运行,然而究竟何时让高优先级任务掌握CPU 的使用权有两种不同的情况。这要看用的是什么类型的内核,是非占先式,还是占先式的内核。一个良好的任务调度算法应该主要体现在以下几个方面

  1. 公平保证每个进程得到合理的CPU 时间
  2. 高效使CPU保持忙碌状态即总是有进程在CPU上运行
  3. 响应时间使交互用户的响应时间尽可能短
  4. 周转时间使批处理用户等待输出的时间尽可能短
  5. 吞吐量使单位时间内处理的进程尽可能多

很显然在任何操作系统中这几个目标不可能同时达到,所以不同的操作系统会在这几个方面中做出相应的取舍,从而确定自己的调度算法,常用的处理机调度算法有:

  1. 先来先服务FCFS
  2. 短作业优先SJF
  3. 优先级
  4. 时间片轮转法
  5. 多级队列法
  6. 多级反馈队列法

先来先服务:FCFS 是最简单的CPU 调度算法,即按进程到来的先后次序进行调度,这样在系统中等待时间最长的进程被优先调度,而不管其所需运行时间的长短。

作业优先:SJF 算法是指当CPU 可供使用时,SJF 算法把CPU 分给需要运行时间最短的进程。

多级队列调度算法:把就绪队列划分成几个单独的队列,一般根据进程的某些特性如内存大小和进程类型,永久性地把各个进程分别链入其中某一个队列中,每个队列都有自己的调度算法,此外在各个队列之间也要进行调度。通常采用固定优先级的抢占式调度,例如某系统中有5 个队列,各个队列的优先级自上而下降低,只有当前3 个队列中都为空的时候,队列4 中的进程才可以运行,而当队列4 中的进程在运行时,如果队列1 中进入了一个就绪进程,则队列4 中的进程要立刻让出CPU 使用权。多级反馈队列法允许进程在各队列间移动,其基本思想是把具有不同CPU工作时间这一特性的进程区分开来,如果一个进程要使用很长的CPU 时间,则应把它移至较低级的队列中,这种方式把I/O 繁忙型和交互式进程放在较高优先级的队列中,同样在低优先级队列中长时间等待的进程可以移到较高优先级队列中,UNIX 系统采用的是多级反馈队列轮转法。

时间片轮转调度法round-robin scheduling
当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间叫做时间额度quantum ,然后切换给另一个任务也叫做时间片调度time slicing ,内核在满足以下条件时把CPU 控制权交给下一个任务就绪态的任务, 当前任务已无事可做,当前任务在时间片还没结束时已经完成了。轮转法主要是为分时系统设计的,其中时间片是一个重要的参数不能取的过大或过小,通常为10 至100ms 数量级,就绪队列可以看成是一个环形队列,CPU 调度程序轮流地把CPU 分给就绪队列中地每个进程,时间长度为一个时间片Linux 操作系统就是采用时间片轮转的调度算法。