前言
不同操作系统中可能根据不同的需求而采用不同的调度算法。常见的调度算法有先来先服务(FCFS)、短作业优先(SJF)、高响应比优先调度(HRRN)、优先级调度(PSA)、时间片轮转调度(RR)、多级反馈队列调度(MFQ)。
调度算法又可以分成两类,如下图:
先来先服务(FCFS)
算法内容:调度作业/就绪队列中最先入队者,等待操作完成或阻塞;
算法原则:按作业/进程到达顺序执行;
调度方式:非抢占式调度;
适用场景:作业/进程调度
优缺点:
- 有利于CPU繁忙型作业,充分利用CPU资源;
- 不利于I/O繁忙型作业;
短作业优先(SJF)
算法内容:所需服务时间最短的作业/进程优先执行;
算法原则:最求最少的平均(带权)周转时间;
调度方式:SJF/SPF,非抢占式;
使用场景:作业/进程调度;
优缺点:
- 平均等待/周转时间最少;
- 长作业周转时间会增加;
- 估计时间不准确,不能保证紧迫任务及时处理;
高响应比优先调度(HRRN)
算法内容:结合FCFS和SJF,综合考虑等待时间和服务时间计算相应比,高的优先调度;
算法原则:综合考虑作业/进程的等待时间和服务时间;
调度方式:非抢占式;
使用场景:作业/进程调度
相应比计算:
- 相应比=(等待时间+服务时间)/服务时间,大于等于1。服务时间指的是CPU的计算时间;
- 只有当前进程放弃执行权(完成/阻塞)时,重新计算所有的进程相应比;
- 长作业等待越久,相应比越高,更容易获得处理机;
优先级调度(PSA)
算法内容:又叫做优先权调度,按作业/进程的优先级(紧迫程度)进行调度;
算法原则:优先级最高(最紧迫)的作业/进程先调度;
调度方式:抢占/非抢占式(并不能获得及时执行);
适用场景:作业/进程调度;
优先级设置原则:
- 静态/动态优先级。静态指一开始就设置优先级,固定的;动态优先级指的是在整个调度过程中优先级会进行变化,是一个动态的值;
- 系统>用户;交互型>非交互型;I/O型>计算型;
- 缺点:低优先级进程可能会迟迟得不到执行,从而产生“饥饿”;
时间片轮转调度(RR)
算法内容:按进程到达就绪队列的顺序,轮流分配一个时间片去执行,时间用完则剥夺;
算法原则:公平、轮流的为每个进程服务,进程在一定时间内都能得到相应;
调度方式:抢占式,同时由时钟中断确定执行时间是否到;
适用场景:进程调度;
优缺点:
- 公平、响应快,适用于分时系统;
- 时间片决定因素:系统相应时间、就绪队列进程数量、系统处理能力;
- 时间片太大,相当于FCFS;太小,处理机切换频繁,开销会增大;
多级反馈队列调度
算法内容:设置多个按优先级排序的就绪队列,优先级从高到低,时间片从小到大,新进程采用队列降级法(解释:首先进入第一级队列,按FCFS分时间片,如果没有执行完,移动到第二级,第三级…);如果前面的高优先级队列不为空,则不会执行后续队列中的进程;
算法原则:集前几种算法有点,相当于PSA+RR;
调度方式:抢占式;
适用场景:进程调度;
优缺点:
- 对各类型相对公平,快速相应;
- 终端型作业用户:短作业优先;
- 批处理作业用户:周转时间段;
- 长批处理作业用户:在前几个队列部分执行;