先决条件 – CPU 调度、多级队列调度
这种调度类似于多级队列(MLQ)调度,但在这个过程中可以在队列之间移动。多级反馈队列调度(MLFQ)不断分析进程的行为(执行时间)并根据它改变其优先级。现在,请查看下面的图表和解释以正确理解它。
现在让我们假设队列 1 和 2 分别遵循时间量程 4 和 8 的循环,队列 3 遵循 FCFS。 下面给出了 MFQS 的一种实现 –
- 当一个进程开始执行时,它首先进入队列 1。
- 在队列 1 中,进程执行 4 个单元,如果它在这 4 个单元中完成,或者它在这 4 个单元中为 I/O 操作提供 CPU,那么该进程的优先级不会改变,如果它再次进入就绪队列,则它会再次出现在队列 1 中开始执行。
- 如果队列 1 中的进程没有在 4 个单元内完成,那么它的优先级会降低并转移到队列 2。
- 上述第 2 点和第 3 点也适用于队列 2 进程,但时间片为 8 个单位。在一般情况下,如果进程未在时间片内完成,则它会转移到优先级较低的队列。
- 在最后一个队列中,进程以 FCFS 方式调度。
- 低优先级队列中的进程只有在高优先级队列为空时才能执行。
- 在较低优先级队列中运行的进程被到达较高优先级队列的进程中断。
好吧,上面的实现可能会有所不同,例如最后一个队列也可以遵循循环调度。
上述实现中的问题——由于一些短进程占用了所有 CPU 时间,低优先级队列中的进程可能会遭受饥饿。
解决方案 –一个简单的解决方案是在定期间隔后提高所有进程的优先级,并将它们全部放在最高优先级队列中。
如此复杂的调度需要什么?
- 首先,它比多级队列调度更灵活。
- 为了优化周转时间,需要像 SJF 这样的算法,它需要进程的运行时间来调度它们。但是进程的运行时间是事先不知道的。 MFQS 运行一个进程一个时间片,然后它可以改变它的优先级(如果它是一个长进程)。因此,它从过程的过去行为中学习,然后预测其未来行为。通过这种方式,它首先尝试运行更短的过程,从而优化周转时间。
- MFQS 还缩短了响应时间。
例子 –
考虑一个系统,它有一个 CPU 绑定进程,它需要 40 秒的突发时间。使用多级反馈队列调度算法,排队时间量子“2”秒,在每一级它增加“5”秒。那么进程会被中断多少次,进程会在哪个队列中终止执行呢?
解决方案 –
进程 P 需要 40 秒才能完全执行。
在队列 1 执行 2 秒,然后中断并转移到队列 2。
在队列 2 执行 7 秒,然后中断并转移到队列 3。
在队列 3 执行 12 秒,然后中断并转移到队列 4。
在队列 4 执行 17 秒,然后中断并转移到队列 5。
在队列 5,它执行 2 秒然后完成。
因此该过程被中断 4 次并在队列 5 上完成。
优点:
- 它更灵活。
- 它允许不同的进程在不同的队列之间移动。
- 它通过将等待低优先级队列的进程移到高优先级队列来防止饥饿。
缺点:
- 对于最佳调度器的选择,需要一些其他方法来选择值。
- 它会产生更多的 CPU 开销。
- 它是最复杂的算法。