操作系统中对进程的调度算法大体上可以分为三类:
1、先来先服务算法
2、优先级法
3、时间片轮法
接下来简要介绍一下这三类算法。
一、先来先服务算法
(FCFS: First Come First Service)
原理:
这是最简单的一种调度算法,用到了队列的思想。每次调度都从进程就绪队列中选择队首的进程(也就是最先进入队列的进程)进行调度。
直到进程的执行被阻塞,或进程结束,再调用下一个进程,依然是从队列中选择队首的进程的。
这里要注意,上文我说的队列中的进程实际上是进程的PCB,因为队列中存放的是PCB而不是进程本身。
一种优化:
短进程优先调度算法:
在进程PCB队列中选择一个估计运算时间最短的进程,优先对该PCB对应的进程进行调用,直到进程调用结束或阻塞。
二、优先级法
原理:
调度算法用到了优先级队列的思想。每次调度时,对于高优先级的进程优先进行调度,对于相同优先级的进程,才按照“先来后到”的原则进行调用。
进一步划分:
1、非抢占式优先权算法
进程的调用只会因为【调用结束或阻塞】这两种情况中断,而不会因为队列中出现了比当前进程优先级高的进程而中断。
2、抢占式优先权算法
这种算法跟上述的 非抢占式算法 相反:当进程调用时,进程队列中出现了比当前进程优先级更高的进程时,就会停止当前的进程而执行队列中优先级更高的进程。
3、高响应比优先权算法
在前文的【一、先来先服务法】中提到了【短进程优先调度算法】,这种算法的缺点是,每次都选短进程进行调用,而入队的都是短一些的进程,那么队列中已经存在的一些长进程有可能永远都运行不了。而这种方法可以理解成是对【短进程优先调度算法】的一种优化。
这种调度算法依然是选择队列中短进程进行调用,在每次调用时,对队列中剩余的进程进行优先级加权,这样就可以保证,即使入队的进程一直是短一点的进程,队列中的长进程也依然能够被调用。
三、时间片轮法
原理:
依然是将所有被调用的进程的PCB存入队列中,每次对队首的进程进行调用【一段时间】后,将该进程的PCB存入队尾,再调用当前队首的进程,依次往复的进行调用。
这个【一段时间】叫做【时间片】。
一种优化:
多级反馈队列调度算法:
(这是目前被公认的一种较好的进程调度算法)
原理:
采用多个就绪队列,分别具有不同的优先级,待调用进程的PCB先存入优先级最高的队列中,然后开始用时间片轮法进行调用。
在这个优先级最高的队列中,时间片是很短的,也就是说,一次调用,队列中短一点的进程会调用结束,而剩下的进程则是较长的进程,把这些剩下的进程存入优先级比当前队列低一级的队列,循环往复。
这里,时间片随着队列优先级的降低而增长,也就是说,优先级最高的队列,时间片是最短的,然后越来越长。而只有当高优先级队列空闲时,才考虑调用低优先级队列中的进程。
可以看出,这种调用结构会优先调用完毕短进程,同时会筛选出长进程并降低它们的优先级,但能保证这些长进程都有被调用的机会,是一种比较合理的调度算法。