多级反馈队列调度

多级反馈队列

​ 多级反馈队列(Multi-level Feedback Queue, MLFQ),与上个世纪70年代提出,主要应用于时分共享系统。主要解决两方面问题:一个是优化周转时间,一个是要给用户很好的交互体验。MLFQ中有很多独立的队列,每个队列有不同的优先级,任何时刻,一个任务只能存在于一个队列中。先引出MLFQ的两个基本规则

  • 规则1:如果A优先级 > B优先级,则运行 A
  • 规则2:如果A优先级 = B优先级,则轮转执行A和B。

多级反馈队列调度_第1张图片

​ 还是引出一个问题,就是如果优先级都是不变的,这样不就相当于在计算机中出现了贵族阶级吗。但是如何改变优先级呢,由此引入以下几个规则来尝试调整优先级。

  • 规则3:工作进入系统时,优先级最高
  • 规则4a:工作用完整个时间片之后,降低优先级,到下一个队列
  • 规则4b:如果工作在其时间片内主动释放CPU,优先级不变。

两个工作:A 是一个长时间运行的 CPU 密集型工作,B 是一个运行时间很短的交互型工作。A执行一段时间之后B到达,结果如左图所示。比如说系统既有CPU密集型任务,又有IO密集型任务。IO密集型会在时间片用完之后放弃CPU,维护优先级不变,如右图所示。

多级反馈队列调度_第2张图片

​ 上面看似很优秀的调度任务,其实还有问题,就是如果有太多的交互性任务,不断占用CPU,对于长工作则无法得到满足。我们可以尝试对优先级做一些改变。

如何提升优先级?

  • 规则5:经过一段时间,就把系统中所有工作重新加入最高优先级队列。

​ 在最高优先级队列中,它会以轮转的方式,与其他高优先级工作分享 CPU,从而最终获得执行。如果一个 CPU 密集 型工作变成了交互型,当它优先级提升时,调度程序会正确对待它。假设这样一个场景,一个长工作与两个交互式工作竞争CPU,每50ms进行一次优先级提升。可以看到能很好的避免调度过程中的饥饿问题。

多级反馈队列调度_第3张图片

如何设置优先级提升间隔?

​ 假设这样一个问题场景,就是进程在每一个时间片结束的时候主动申请释放CPU,按照规则4,则会报纸CPU优先级,从而几乎垄断CPU时间。这个规则显然不对,因此修改为下面规则。可以发现对于两个任务来说都能比较公平的共享CPU资源。

  • 规则4:一旦工作用完再某一层中的时间配额,不管是不是主动释放CPU资源,都会降低优先级。

多级反馈队列调度_第4张图片

​ 这里也有一个问题,就是如何设置队列大小呢,如何设置每一级时间片大小呢。也就是说如何更好的进行MLFQ性能调优,这里提出一个解决方案是,对于越高优先级队列,它的时间片越小,对于优先级越小的队列,它的时间片越大。如下图所示。

队列,它的时间片越小,对于优先级越小的队列,它的时间片越大。如下图所示。

多级反馈队列调度_第5张图片

你可能感兴趣的:(体系结构,系统架构)