进程调度算法
CPU进程的生命周期可以分为五个阶段:创建、就绪、运行、等待、终止。其中就绪、运行、等待是进程最集中的几个阶段,有的进程在就绪环节就形成了进程的就绪队列
;有的进程进行I/O请求就从运行状态切换为等待状态,形成了等待队列;有的进程因为中断从运行状态切换为就绪状态,从而加入就绪队列;有的进程 I/O 完成后从等待状态切换为就绪状态,从而加入就绪队列。
而CPU调度处理的问题是:从就绪队列中选择进程以便其分配CPU。
下面分别对几种调度算法进行简单的介绍:
1 FCFS 先到先服务调度
毫无疑问,最简单的CPU
调度算法就先到先服务调度算法
,采用这种方案,先请求CPU的进程首先分配到CPU。
FCFS策略可以通过FIFO
队列容易的实现,当一个进程进入就绪队列时,它的PCB
会被连接到队列尾部去。CPU空闲时,它会分配给位于队列头部的进程,并且这个运行进程从队列中移去。
非抢占式的调度算法,按照请求的顺序进行调度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。
2 SJF 短作业优先
短作业(进程)优先调度算法SJ(P)F
,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF
)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
非抢占式的调度算法,按估计运行时间最短的顺序进行调度。
长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。
3 SRTN 最短剩余时间优先
最短作业优先的抢占式版本是最短剩余时间优先(shortest remaining time next)算法。使用这个算法,调度程序总是选择剩余运行时间最短的那个进程运行。再次提醒,有关的运行时间必须提前掌握。当一个新的作业到达时,其整个时间同当前进程的剩余时间做比较。如果新的进程比当前运行进程需要更少的时间,当前进程就被挂起,而运行新的进程。这种方式可以使新的短作业获得良好的服务。
4 RR 轮转调度
根据先来先服务的原则,将需要执行的所有进程按照到达时间的大小排成一个升序的序列,每次都给一个进程同样大小的时间片,在这个时间片内如果进程执行结束了,那么把进程从进程队列中删去,如果进程没有结束,那么把该进程停止然后改为等待状态,放到进程队列的尾部,直到所有的进程都已执行完毕。
时间片够用:意思就是在该时间片内,进程可以运行至结束,进程运行结束之后,将进程从进程队列中删除,然后启动新的时间片
时间片不够用:意思是在该时间片内,进程只能完成它的一部分任务,在时间片用完之后,将进程的状态改为等待状态,将进程放到进程队列的尾部,等待cpu的调用
时间片大小的选择:
- 时间片过小,则进程频繁切换,会造成cpu资源的浪费
- 时间片过大,则轮转调度算法就退化成了先来先服务算法