调度算法是根据系统的资源分配策略所规定的资源分配算法。调度算法必须实现几个相互冲突的目标:进程响应的时间尽可能快,后台作业的吞吐量尽可能高,进程的饥饿现象尽可能避免,低优先级和高优先级进程的需要尽可能调和等等。
目前存在以下几种调度算法,适用于不同的系统,以实现不同资源管理目标:
1)先来先服务调度算法(FCFS,First Come First Served)
作业调度中:每次从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列中;
进程调度中:每次调度是从就绪队列中选择一个最先进入该队列的进程,把处理机分配给它,使之投入运行。
先来先服务调度算法是一种非抢占式调度算法,它能公平地使每个作业(进程)获得处理机。
2)短作业(进程)优先调度算法(SJF/SPF,Shortest Job/Process First)
作业调度中,从后备作业队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存;
进程调度中,从就绪队列中选择一个或若干个估计运行时间最短的进程,为它们分配处理机,使之投入运行。
该算法也是一个非抢占式算法。
3)时间片轮转调度算法
这种算法多用于进程调度,以提高进程的并发性,缩短每一个作业的响应时间。在通常的轮转算法中,系统将所有的就绪进程按“先来先服务”原则,排成一个队列,每次调度时把CPU分配给队首进程,并令其执行一个时间片。当时间片用完时,由一个计时器发出时钟中断,调度程序便据此信号来中断该进程的执行,并将它送就绪队列的末尾,等待下一次调度。
4)优先权调度算法
常用于批处理系统中作为作业调度算法,也作为多种操作系统中的进程调度算法,更可用于实时系统中,以实现对实时作业的实时响应。
在非抢占式优先权策略下,系统一旦把处理机分配给某一高优先权的进程后,该进程便一直执行下去,知道完成或因发生某事件而进程自身阻塞,使该进程放弃处理机。
在抢占式优先权策略下,系统同样把处理机分配给优先权最高的进程,使之执行。但一旦出现了一个优先权更高的进程时,进程调度程序就停止原最高优先权进程的执行,而将处理机分配给新出现的优先权最高的进程。
优先权分为静态优先权和动态优先权两种。
5)高响应比优先调度算法
响应比=(等待时间+要求服务时间)/要求服务时间。
该算法即照顾了短作业,又考虑了作业到达的先后顺序,不会使长作业长期得不到服务,实现了一种较好的折中。
6)多级队列调度算法
目前在计算机系统中,配置的操作系统即具备批处理功能,又具有分时系统的功能以适应批处理作业和交互型作业的不同需要。通常,为批处理作业所建立的进程是排入后台的就绪队列;而为交互型作业所建立的进程,则是排入前台的就绪队列。前台采用时间片轮转调度算法,后台采用优先权高者优先的调度算法或短作业优先的调度算法。在这种情况下,调度是对各个队列分级进行的。
7)多级反馈队列调度算法
该算法基于时间片轮转调度算法和优先级算法发展而来,却又不必估计运行时间的长短,因而是目前公认的较好的一种进程调度算法。
本算法基于以下情况考虑:
1)为提高系统吞吐量和降低进程平均等待时间而照顾短进程;
2)为得到较好的输入输出设备利用率和交互用户的及时响应而照顾输入输出型进程;
3)在进程运行过程中,按进程运行情况来动态地考虑进程的性质,进行相应的调度。
在采用多级反馈队列调度算法的系统中,调度算法如下:
1)设置多个就绪队列,并为各个队列赋予不同的优先级;
2)赋予各个队列中进程执行时间片大小也各不相同,在优先权愈高的队列中,每个进程的执行时间片就规定得愈小;而低优先权的队列会分配成倍于高一级优先权的队列的时间片,即第i+1队列的时间片比第i队列的时间片长一倍;
3)当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度;当轮到该进程执行时,如能在该时间片内完成,便可撤离系统;如果不能,调度程序便将该进程转入第二队列的末尾,再同样安装FCFS原则等待调度执行……依次规律,直至进程完成。若进程在进入最后一个队列后仍未执行完,则在该队列中采用时间片轮转法,直至进程执行完毕。
4)仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第(1~i-1)队列为空时,才调度第i队列的进程运行。如果处理机正在运行第i队列的进程,而此时又有新的进程进入优先权较高的任一队列(1~i-1队列),则此时新的进程将抢占处理机,即调度程序将处理机重新分配给新进入1~i-1队列的进程,并把被抢占的进程投入原队列的末尾。