文章目录
决策模式
对于处理起来讲,一般有两种方式来决策。
非剥夺决方式(Nonpreemptive)
- 一旦一个进程被执行,它就会一直执行到完毕,主动释放处理器,或者是阻塞自己。总之就是主动释放CPU。
- 主要对于批处理操作系统。
剥夺方式(Preemptive)
- 当前执行进程可以被中断,并且可以将进程移动到就绪队列中。
- 任何进程不可能长时间的独占、垄断处理器。
- 主要用于实时性要求较高的实时系统以及性能要求较高的批处理系统和分时系统。
调度算法
有5个进程,描述如下:
进程 | 到达时刻 | 服务时间 |
---|---|---|
P1 | 0 | 3 |
P2 | 2 | 6 |
P3 | 4 | 4 |
P4 | 6 | 5 |
P5 | 8 | 2 |
通过平均周转时间来分析不同的调度算法(需要加上每个进程的等待时间)
先来先服务(FCFS)
如同超市排队结账一般。
- 每个进程加入就绪队列;
- 当前进程完成时,在就绪队列中等待最久的进程被选择。
- 平均周转时间 = 8.6
- 短进程可能必须等待一个非常长的时间。如P5,它只需要执行短短的2个单位时间,可是就连平均周转时间都是8.6秒。
- 偏向于使用CPU的进程,如计算。
- 对于I/O型的进程,即使事件发生,也必须等待CPU型的进程彻底完成。
FCFS算法的实际应用
- 一般,FCFS与其他调度算法混合使用
- 系统可以按照不同的优先级维护多个就绪队列,每个队列内部按照FCFS算法调度。
轮转调度(Round Robin)
像幼儿园里,老师给班里小朋友喂午饭。很多老师都是让小朋友围着自己为一个圈,每个小孩喂一口,小孩子咀嚼需要时间,他就去喂下一个小朋友。
虚拟轮转调度(Virtual Round Robin)
针对于某些I/O型进程,轮转调度也有可能会对他们不公平,比如事件发生,依然需要等一大轮才能执行。
这个时候就有了虚拟轮转调度。有两个就绪队列A和B,所有进程先进入队列A,若是进程用完时间片依然没有执行完毕,则回到A队列继续排队轮转。
如果是I/O型,第一次阻塞,事件发生后回来后,则进入队列B,B队列的优先级比A队列的高,下次调度则会优先检测B队列是否为空。除此之外,还可以为B队列设置不同于A的时间片。
时间片长短
并没有明确的规定每个时间片必须多长多短。太长的话,其他程序等待太久,太短的话中断频繁,消耗性能。
唯一的原则是70-80%的进程能在一个时间片内完成的长短。
短进程优先(Shortest Process Next)
短进程优先做。对长进程不公平,短进程太多则会让长进程一直等待。
最短剩余时间进程优先(Shortest Remaining Time)
字面意思。
与短进程优先一样,都需要去估算进程的服务时间,这是非常困难的。
最高响应比优先(Highest Response Ration Next)
响应比 = (等待时间 + 服务时间)/服务时间 = 等待时间/服务时间 + 1
由上可以看出,由于等待时间越来越长,响应比会越来越高,优先级也就越来越高了。同时,短进程的优先级也会非常的高。
看似非常完美,但是现实却是骨干的。首先,老问题,估算服务时间是困难的;同时,由于计算机是工程性的,这套算法的计算量非常的大。我们的等待时间随时都在变化,每次调度都会去计算一次,进程量越多,性能消耗越大。
反馈(FeedBack)
完全不需要估算进程的服务时间,且是一个动态的调度算法。
- 首先会设置多个就绪队列。
- 每个时间片可以设置不同的长度的时间片,从上往下,每个时间片越来越长,优先级越来越低。若是RQ0时间片没执行完,就放进RQ1,RQ1没执行完,就放入RQ2。长进程会自然的往下掉,同时也保证了短进程优先级最高。