“工程指标中的尾延迟与形式公平相关却不等价。FIFO、轮转和配额可以改善可预测性,优先级策略则可能有意偏离平等服务。选择策略时应先声明业务需要的是无饥饿、有界越过、按权重分配还是截止期;用一个…”
最短工作通常容易尽快做完,但操作系统未必知道它有多短。多级反馈队列先给新任务较高优先级,再根据它已经用了多少CPU调整位置:很快结束的工作及时离开;持续繁忙的工作逐渐降到更低层。它根据可观察行为作决定,不需要偷看未来服务量。
形式陈述
先固定一个能真正运行的MLFQ版本
MLFQ是一类政策,不是仅凭名字就能还原的唯一算法。本页固定三层队列Q0、Q1、Q2,Q0最高。总选最高非空层,同层采用轮转理路轮转时间片与切换成本Round-robin scheduling · RR scheduling · Time quantum · Time slicing按FIFO轮流交付有界时间片,复算到达与重排的同刻边界,并在有明确切换成本时核对响应上界和有效利用率。。新到达任务进Q0。高层任务到达时可以抢占低层当前任务;本层新任务只入队,不穿过当前时间片。
每层有两种量,不能混成一个:时间片限制这一次连续运行多久;层配额限制在这一层总共获得多少实际CPU服务。参数为:
| 层 | 每次时间片 | 降级前累计服务配额 |
|---|---|---|
| Q0 | 2 | 2 |
| Q1 | 4 | 4 |
| Q2 | 8 | 无更低层,按8轮转 |
任务在某层用完配额就降一级,进入下一层时该层用量从0开始。配额先耗尽时,即使本次片还剩时间也必须停止。被更高层抢占时保留本片剩余量和层用量,放回本层队首;自愿阻塞时保留层用量,唤醒后在原层队尾等待,并获得一个新时间片。
这里“新片”没有清零“层用量”。一个任务可以通过很多短片耗尽同一个层配额;把这两份计数分开,才有办法防止任务用频繁让出CPU逃避降级。
直觉
一次可见的反馈过程
仍用SCHED-16的到达和服务量,先忽略切换开销。每隔12毫秒有一次全体优先级提升,称为boost。为得到唯一答案,本实验在boost边界先结算服务、移除完成者,再处理到达;随后把所有未完成任务提升Q0并清零该层用量及片用量。可运行者按任务名排列,阻塞者保持阻塞且只更新优先级。最后重新派发。
这项按名字重排是实验规则,不声称是某个操作系统的实现。后面会看到,boost的队列次序与周期同样影响公平。
| 运行区间 | 任务与所在层 | 结束后的动作 |
|---|---|---|
| 0–2 | A,Q0 | 用完2,降Q1,剩7 |
| 2–4 | B,Q0 | 用完2,降Q1,剩2 |
| 4–6 | C,Q0 | 完成 |
| 6–7 | D,Q0 | 提前完成 |
| 7–11 | A,Q1 | 累计用满4,降Q2,剩3 |
| 11–12 | B,Q1 | 用1,剩1;到boost边界 |
| 12–14 | A,Q0 | boost后先选A;用2后降Q1,剩1 |
| 14–15 | B,Q0 | 完成 |
| 15–16 | A,Q1 | 完成 |
12之前A已经在两层累计取得6,B取得3;boost没有抹掉这些总服务,只重置政策用于分类的层配额。12之后A剩3、B剩1,不会重新变成原需求9和4。
最终A、B、C、D完成于16、15、6、7,周转为16、14、4、3,均值9.25;首次响应为0、1、2、2,均值1.25。与普通RR的8.75和1.75比较,平均首次派发稍早,平均周转稍长。反馈政策不是对每份负载都同时改进全部指标。
例子与边界
为什么不能在I/O之后忘记已用服务
单独做一个作弊实验:Q0时间片为2、层配额为4。任务G每运行1.5毫秒便主动做一次短I/O,从不连续跑满2。如果规则是“只有跑满整片才降级,I/O回来把用量清零”,G就能无限重复这种行为而留在最高层。
累计配额的账本不同。G第一段用1.5,层累计为1.5;第二段再用1.5,累计为3;第三段只允许再用1,累计到4时立即降级。中间等待I/O不增加CPU服务,也不抹去已经消耗的3。
这条改动防的是通过切碎服务来逃避已经声明的层配额,不能推出“所有I/O任务都公平”或“任何进程都无法操纵调度器”。如果用户可以不停创建新身份,新任务总从Q0开始,又会出现另一种资源身份问题,需要组级配额等独立机制。
提升能解决什么,还欠什么条件
没有boost时,Q0可以不断出现新的短任务,使Q2里的长任务永远没有机会。周期性把长任务带回高层,能让政策重新观察其行为,也能处理“以前CPU密集、后来变成交互式”的任务。
但是“有boost”本身不是无饥饿证明。按本实验的名字排序,若两个任务A、B一直可运行,Q0时间片为2,而boost周期改成1,那么每次刚给A运行1毫秒就重排,A仍在前;B可以永远轮不到。两个参数看似更积极,组合起来却破坏公平。
若一次boost后至多有
推论与应用
实现里哪些账本不能丢
每个任务至少保留所在层、当前层已用服务、当前片已用服务、READY/BLOCKED状态。运行
为避免同刻边界歧义,本实验若完成、配额耗尽与boost重合,先完成退出;未完成者再执行boost,不需要先降到低层又立即升回高层。外部观察应得到同一总服务,但队列次序仍需明确记录。
小量固定队列可以逐层检查,层内入队出队为常数工作;层数可变时另计查找非空层的成本。周期扫描所有
从一个版本迁移到另一个版本
阅读某个真实调度器时,先查四个具体问题:每层时间片多长;降级看连续片还是累计服务;阻塞和抢占后哪些计数保留;提升如何处理正在运行与睡眠任务。只有这些回答一致,才能把本页的表直接搬过去。
MLFQ是利用历史服务作分类的一种启发式,不保证准确预测剩余工作,也不是按指定权重分配CPU的合同。若主要诉求是“持续繁忙时A拿两份、B拿一份”,应转向彩票理路彩票调度与随机服务份额Lottery scheduling · Proportional-share lottery scheduling · Lottery tickets用均匀抽签把正权重转成时间片选择概率,精算有限样本服务份额和连续未中签概率,区分概率无饥饿与确定等待界。或步幅调度理路步幅调度与虚拟服务账本Stride scheduling · Proportional-share stride scheduler · Virtual pass按票数倒数设置步幅,每次运行最小pass者并按实际服务推进,复算十二片序列,证明固定成员下的有界虚拟差并说明加入和短片边界。的份额模型。
参考资料
- Arpaci-Dusseau与Arpaci-Dusseau,OSTEP, Ch.8, §§8.1–8.5:反馈队列、boost与跨I/O累计配额,尤其§8.4对gaming的修正。
- Corbató、Merwin-Daggett、Daley,“An Experimental Time-Sharing System”,1962,pp.341–344的调度算法,提供分层反馈的早期来源。本页三层数值、事件优先级与boost反例均为独立教学模型。