书中一共描述了七种进程调度算法
1. 先来先服务(FCFS)调度算法
先来先服务调度算法是最简单的调度方法。其基本原则是,按照进程进入就绪队列的先后次序进行选择。对于进程调度来说,一旦一个进程得到处理机,它就一直运行下去,直到该进程完成任务或者因等待某事件而不能继续运行,才会让出处理机。先来先服务调度算法属于非剥夺方式。
2. 优先级调度算法
按照进程的优先级高低来进行调度,使高优先级进程优先得到处理机的调度算法称为优先级调度算法。进程的优先级可以由操作系统按一定原则赋予,也可以在操作系统外部安非,甚至可由用户支付高额费用来购买。但在许多采用优先级调度算法的系统中,通常使用动态优先级。一个进程的优先级不是固定的,可能会随许多因素的变化而变化,例如,进程的等待时间、已使用的处理机时间或其他资源的使用情况。
优先级调度算法又可分为下述两种:
①非剥夺的优先级调度算法。
②可剥夺的优先级调度算法。
3. 时间片轮转调度算法
时间片轮转调度算法也多用于进程调度。采用此算法的系统,其进程就绪队列往往按进程到达的时间来排序。进程调度程序总是选择就绪队列中的第一个进程,也就是说,按照先来先服务原则进行调度,但进程仅占用处理机一个时间片。在使用完一个时间片后,即使进程还没有完成其运行,它也必须让出(被剥夺)处理机给下一个就绪的进程。而被剥夺的进程返回就绪队列的末尾重新排队,等候再次运行。时间片轮转调度算法特别适合分时系统使用。当多个进程驻留主存时,在进程间转接的开销一般不是很大。
4. 短进程优先(SPF)调度算法
短进程优先调度算法从进程的就绪队列中挑选那些运行时间(估计时间)最短的进程进入主存运行。这是一个非剥夺算法。它一旦选中某个短进程,就应该保证该进程尽可能快地完成运行并退出系统。这样减少了在就绪队列中等待的进程数,同时也缩短了进程的平均等待时间,提高了系统的吞吐量。但从另一方面来说,各进程的等待时间的变化范围较大,并且进程(尤其是大进程)的等待时间难以预先估计。也就是说,用户对他的进程什么时候完成心里没底。这样,当后续短进程过多时,大进程可能没有机会运行,导致“饿死”。而在先来先服务调度算法中,进程的等待和完成时间是可以预期的。
5. 最短剩余时间优先调度算法
最短剩余时间优先调度算法是将短进程优先调度算法用于分时环境的变形。其基本思想是,让“运行到任务完成时所需的运行时间最短”的进程优先得到处理,包括新进入系统的进程。在最短进程优先调度算法中,一个进程一旦得到处理机,就一直运行到任务完成(或等待事件)而不能被剥夺(除非主动让出处理机)。而最短剩余时间优先调度算法允许被一个新进入系统的且其运行时间短于当前运行进程的剩余运行时间的进程所抢占。
6. 最高响应比优先调度算法
Hansen针对短进程优先调度算法的缺点提出了最高响应比优先调度算法。这是一个非剥夺的算法。按照此算法,每个进程都有一个动态优先数,该优先数不但是要求的服务时间的函数,而且是该进程得到服务所花费的等待时间的函数。进程的动态优先数计算公式如下:
优先数=(等待时间+要求的服务时间)/要求的服务时间
7. 多级反馈队列调度算法
短进程优先调度算法或最短剩余时间优先调度算法均是在估计的进程运行时间基础上进行调度的,但在程序开发环境或其他情况下,往往难以估计进程的运行时间。这里所研究的算法是时间片轮转调度算法的发展,不必估计进程运行时间。但是本算法仍然基于以下考虑:
①为提高系统吞吐量和缩短进程的平均等待时间而照顺短进程。
②为得到较好的I/O设备利用率和对交互用户的及时响应而照顾I/O型进程。
③在进程运行过程中,按进程运行情况动态地考虑进程的性质(I/O型进程还是处理机型
进程),并且要尽可能快地决定进程当时的运行性质(以I/O为主还是以计算为主),同时进行相应的调度。
具体来说,多级反馈队列的概念如下图所示。系统中有多个进程就绪队列,每个就绪队列对应一个调度级别。第1级队列的优先级最高,以下各级队列的优先级逐次降低。调度时,选择高优先级队列中的第1个就绪进程。