面试题:说一说进程调度算法有哪些?
针对该面试题,我在这里谈谈自己的理解与看法,如有错误或模糊的地方,还请多多包涵与指正🤤~
什么是进程调度?
进程调度实际上包含三种调度:
1.短程调度(将进程从ready状态转移到running状态)
2.长程调度(将进程从new状态转移到ready状态)
3.中程调度(将进程从CPU上移出,并放入到磁盘中,当需要时再从磁盘中取出以进行恢复,进程会从被中断的地方重新开始执行,从而降低多道程序程度)
我们所讲的进程调度算法一般是针对进程的短程调度而言。
进程调度算法有哪些?
先到先服务算法(FIFS)、最短作业优先(SJF)、优先级调度、轮旋调度(又称旋转罗宾法、RR调度)、多级队列调度、多级队列反馈调度
1.先到先服务(FIFS)
先请求的进程优先得到服务(即根据ready队列的顺序,排在前面的进程先得到服务)
- 优点:实现简单、易理解;公平性
- 缺点:平均等待时间往往很长
2.最短作业优先(SJF)
优先服务作业时间最短的作业。实际上难以实现,因为无法知道下次cpu执行的长度。但可以用公式
(
代表最近一次的信息,
存储了过去的信息)来对下一次cpu执行的长度进行预测。
- 优点:平均等待时间短
- 缺点:公平性不足,容易导致饿死现象的产生(由于每次都优先服务作业时间最短的进程,这会导致作业时间长的进程一直在等待,永远无法得到服务)
最短作业优先可以分为抢占式和非抢占式两种
1.抢占式(又称最短剩余时间优先算法):
允许就绪队列中的进程抢占正在cpu上运行的进程(如果就绪队列中某一进程的作业时长小于正在执行的进程的剩余作业时长)。
- 优点:平均等待时间比非抢占式要短。
- 缺点:上下文切换频繁,花费更多的时间用于上下文切换。
2.非抢占式:
能保证进程一旦被换上cpu,那么该进程会一直执行直到终止或者要等待I/O。
- 优点:相对于抢占式而言,上下文切换的次数要少。
- 缺点:平均等待时间一般而言要比抢占式的长。
3.优先级调度
给每个进程分配优先级,高优先级的进程首先获得cpu时间。(最短作业优先(SJF)就是优先级调度的一个以作业时间为优先度的特例)
- 缺点:优先级调度算法容易导致无穷阻塞(即饿死)的现象出现,即优先级低的进程可能永远也无法得到执行。为了解决这一问题,老化技术(逐渐增加在系统中等待很长时间的进程的优先级)是一种方案。
4.轮旋调度(RR调度)
RR调度是一种抢占式调度。轮流按就绪队列的顺序为每一个进程分配时间片,当一个正在执行的进程的时间片用完了,那么将该进程放回就绪队列中,并从就绪队列中换上另一个进程,为其分配时间片。
- 优点:保证了公平性;且每一个进程在一个时间段上都能得到执行。
- 缺点:平均等待时间较长。
时间片大小的选取决定了该算法性能的高低:如果时间片很大,那么RR算法近似于FIFS算法;如果时间片很小,那么系统将花费大量的时间用于上下文切换,效率很低;大多数进程都能在一个时间片内执行完成是我们想要追求的目标。
一般而言,80%的进程的cpu执行时间应该小于时间片。
5.多级队列调度
将进程分成不同的队列,每一个队列内有各自的算法,每个队列间有不同的优先级。一般将进程分为前台进程(优先级高)和后台进程两个队列。队列间的调度算法有两种:固定优先级抢占式调度(当前台进程队列为空时才调度后台进程执行);队列间划分时间片(每个队列有一定比例的cpu时间)。
6.多级队列反馈调度
在多级队列调度的基础上,允许进程在队列间进行迁移。(如果进程使用过多的cpu时间,那么它会被移到更低的优先级队列,即不会让某一个进程一直长时间地执行;如果进程在较低优先级队列中等待时间过长,那么会把它放到更高优先级的队列,以防止饿死现象的出现)