操作系统学习:浅析多级反馈队列MLFQ(二)

276 阅读2分钟

因此,MLFQ 调度策略的关键在于如何设置优先级。MLFQ 没有为每个工作指定不变的优先顺序,而是根据观察到的行为调整它的优先级。例如,如果一个工作不断放弃CPU 去等待键盘输入,这是交互型进程的可能行为,MLFQ 因此会让它保持高优先级。相反,如果一个工作长时间地占用 CPU,MLFQ 会降低其优先级。通过这种方式,MLFQ 在进程运行过程中学习其行为,从而利用工作的历史来预测它未来的行为。

由此我们得到了 MLFQ 的两条基本规则:

规则 1:如果 A 的优先级 > B 的优先级,运行 A(不运行 B)

规则 2:如果 A 的优先级 = B 的优先级,轮转运行A 和 B

而当工作刚刚来到时,我们并不能判断它是计算密集型工作还是交互型工作,因此,我们得到一个规则:

规则 3:将刚进入系统时的工作放入最上层

当工作用完一个时间片后,降低其优先级,移入下一个队列(说明计算比较密集);而当工作主动放弃CPU时,优先级不变(可能是交互型工作)。其实可以总结一下:当来一个工作时,我们默认他是短工作,并赋予最高优先级。如果确实是短工作,则很快会执行完毕;如果不是短工作,就会被慢慢移入低优先级队列。其实在这里MLFQ近似于SJF。

在这里会有两个问题:一是如果交互操作太频繁了,会使长工作永远无法获得CPU(饿死),并且一个工作可能不是一直是计算密集型,它也可能需要交互;二是黑客可以通过一些手段进行攻击:比如在时间片即将用完的时候,调用一个I/O操作,比如访问一个无关的文件,从而主动放弃CPU,这样就可以保持在高优先级,操作得当的话,几乎可以独占CPU。