第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:单个长工作
一直降。
实例2:来了一个短工作
如果不知道工作是短工作还是长工作,那么就在开始的时候假设其是短工作,并赋予最高优先级。
实例3:如果有I / O呢
假设交互型工作中有大量的I / O操作(比如等待用户的键盘或鼠标输入),它会在时间1片用完之前放弃CPU。这种情况下,我们保持它的优先级不变。
当前MLFQ的一些问题
- 饥饿问题:太多交互型工作会导致长工作无法得到CPU。
- 愚弄调度程序:流氓程序运行99%的时间片时间就主动放弃一次CPU,工作可以几乎独占CPU。
- 一个计算密集的进程可能在某段时间表现为一个交互型的进程,但无法提升优先级。
8.3 尝试2:提升优先级
规则5:经过一段时间S,就将系统中所有工作重新加入最高优先级队列。
解决问题1和3
添加时间段的问题是:S的值该如何设置?过高则长工作饥饿,过低则交互型工作得不到合适CPU比例。
8.4 尝试3:更好的计时方式
现在来解决问题2:
重写规则4a和4b:
规则4:一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次CPU),就降低其优先级(移入低一级队列)
8.5 MLFQ调优及其他问题
关于 MLFQ 调度算法还有一些问题。其中一个大问题是如何配置一个调度程序,例如, 配置多少队列?每一层队列的时间片配置多大?为了避免饥饿问题以及进程行为改变,应该多久提升一次进程的优先级?这些问题都没有显而易见的答案,因此只有利用对工作负载的经验,以及后续对调度程序的调优,才会导致令人满意的平衡。
常用方法:
- 支持不同队列可变的时间片长度(如图)
- 使用表来调整优先级
- 采用数学公式来调整优先级
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 天,点击查看活动详情”