操作系统导论 | 第 8 章笔记

144 阅读4分钟

第8章 调度:多级反馈队列

本章将介绍一种著名的调度方法——多级反馈队列 ( Multi-level Feedback Queue, MLFQ ) 。

关键问题🏝:没有完备的知识如何调度呢?

解决:从历史中学习。

8.1 MLFQ:基本规则

MLFQ中有许多独立的队列 (queue) ,每个队列有不同的优先级 (priority level)。任何时刻,一个工作只存在于一个队列中,每个队列可能会有多个工作。

  • 规则1:如果A的优先级 > B的优先级,运行A(不运行B)
  • 规则2:如果A的优先级 = B的优先级,轮转运行A和B

8.2 尝试1:如何改变优先级

  • 规则3:工作进入系统时,放在最高优先级(最上层队列)
  • 规则4a:工作用完整个时间片后,降低其优先级(移入下一个队列)
  • 规则4b:如果工作在其时间片以内主动释放CPU,则优先级不变
实例1:单个长工作

一直降。

image.png

实例2:来了一个短工作

如果不知道工作是短工作还是长工作,那么就在开始的时候假设其是短工作,并赋予最高优先级。

image.png

实例3:如果有I / O呢

假设交互型工作中有大量的I / O操作(比如等待用户的键盘或鼠标输入),它会在时间1片用完之前放弃CPU。这种情况下,我们保持它的优先级不变。

image.png

当前MLFQ的一些问题
  1. 饥饿问题:太多交互型工作会导致长工作无法得到CPU。
  2. 愚弄调度程序:流氓程序运行99%的时间片时间就主动放弃一次CPU,工作可以几乎独占CPU。
  3. 一个计算密集的进程可能在某段时间表现为一个交互型的进程,但无法提升优先级。

8.3 尝试2:提升优先级

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

解决问题1和3

image.png

添加时间段的问题是:S的值该如何设置?过高则长工作饥饿,过低则交互型工作得不到合适CPU比例。

8.4 尝试3:更好的计时方式

现在来解决问题2:

重写规则4a和4b:

规则4:一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次CPU),就降低其优先级(移入低一级队列)

image.png

8.5 MLFQ调优及其他问题

关于 MLFQ 调度算法还有一些问题。其中一个大问题是如何配置一个调度程序,例如, 配置多少队列?每一层队列的时间片配置多大?为了避免饥饿问题以及进程行为改变,应该多久提升一次进程的优先级?这些问题都没有显而易见的答案,因此只有利用对工作负载的经验,以及后续对调度程序的调优,才会导致令人满意的平衡。

常用方法:

  • 支持不同队列可变的时间片长度(如图)
  • 使用表来调整优先级
  • 采用数学公式来调整优先级

image.png

PS:操作系统很少知道什么策略对系统中单个进程和每个进程算好的,因此提供接口并允许用户或管理员给操作系统一些提示(hint)常常很有用,我们通常称之为建议 (advice) 。

举例:调度程序(通过nice(命令行工具))、内存管理(madvise)

8.6 MLFQ:小结

本章介绍了一种调度方式,名为多级反馈队列 (MLFQ) 。

  • 规则 1:如果 A 的优先级 > B 的优先级,运行 A(不运行 B)。
  • 规则 2:如果 A 的优先级 = B 的优先级,轮转运行 A 和 B。
  • 规则 3:工作进入系统时,放在最高优先级(最上层队列)。
  • 规则 4:一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次 CPU),就降低其优先级(移入低一级队列)。
  • 规则 5:经过一段时间 S,就将系统中所有工作重新加入最高优先级队列。

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20 天,点击查看活动详情