Skip to content

方法Method

步幅调度与虚拟服务账本

Stride scheduling · Proportional-share stride scheduler · Virtual pass

按票数倒数设置步幅,每次运行最小pass者并按实际服务推进,复算十二片序列,证明固定成员下的有界虚拟差并说明加入和短片边界。

想让三项繁忙工作按3:2:1分CPU,又不希望短窗口完全由运气决定,可以记一份“下一次应当轮到谁”的虚拟账本。步幅调度每次选账本数最小者;份额越大,每次运行后账本增加得越少,所以更快再次成为最小者。

它与彩票调度使用相同的权重语言,但选择过程是确定的。差别不在有没有票,而在怎样把票转成下一次选择。

形式陈述 ​

三个数定义一个静态版本 ​

每个持续可运行的任务 i 有正票数 wi。选常数 K>0,定义步幅

di=K/wi.

本页采用原论文基本算法的初始化:Pi=di。每次选择 Pi 最小的任务,运行一个完整时间片,然后令 Pi←Pi+di。并列按A、B、C的次序。Pi 称为pass,表示下一次分配的虚拟位置;它不是墙钟毫秒,也不是实际完成时间。

主实验与彩票页相同:三项始终可运行、不结束、不阻塞,时间片1毫秒、切换免费,票数 (3,2,1)。取 K=6,步幅为 (2,3,6),初始pass也是 (2,3,6)。所有值都是整数,暂不承担除法舍入误差。

有些教学实现把所有pass初始化为0,也能形成相关的比例调度,但开头的次序会不同。复算时必须把初始化也当成输入,不能仅看“总取最小”的一句话。

直觉

十二次选择,每次只改胜者的pass ​

片号 选择前 (PA,PB,PC) 运行者 选择后
1 (2,3,6) A (4,3,6)
2 (4,3,6) B (4,6,6)
3 (4,6,6) A (6,6,6)
4 (6,6,6) A (8,6,6)
5 (8,6,6) B (8,9,6)
6 (8,9,6) C (8,9,12)
7 (8,9,12) A (10,9,12)
8 (10,9,12) B (10,12,12)
9 (10,12,12) A (12,12,12)
10 (12,12,12) A (14,12,12)
11 (14,12,12) B (14,15,12)
12 (14,15,12) C (14,15,18)

胜者序列是A、B、A、A、B、C,再重复一次。A取得6片,B取得4片,C取得2片,恰为目标份额。这个“恰好”依赖本组权重和窗口;前5片的计数为3、2、0,C的理想份额是 5/6,并未恰好实现。

选择后pass也不必相同。第12片之后C的18大于A的14,表示C下一次应当更晚取得机会,不表示C已经获得比A更多的真实服务。

例子与边界

账本为什么不会无限拉开 ​

令 D=maxidi。在本页固定成员、完整时间片、精确数值的模型里,始终有

maxiPi−miniPi≤D.

初始 Pi=di,这个界显然成立。假设某次选择前最小pass为 m,所有pass都在 [m,m+D] 中。只更新一个最小者,给它加不超过 D 的步幅,更新后的它仍不超过 m+D;其余不变,且没有pass下降。因此新的最大最小之差仍不超过 D。归纳完成。

设任务 i 已取得 ni 个完整片,由初始化和每次更新直接得到

Pi=(ni+1)di=K(ni+1)/wi.

上面的界限制的是各任务“下一次虚拟位置”的差。代入后得到

|niwi−njwj|≤DK+|1wi−1wj|.

右边是与总运行片数无关的常数,所以运行越来越久时,各任务按票数归一化的累计服务不会越来越偏离。在固定有限成员下,结合 ∑ini=m,可以推出 ni/m→wi/∑jwj。

这不是“每项任意时刻都误差小于一片”的证明。原论文另区分两两相对误差与整个集合的绝对误差;对偏斜权重,二者的界不同。本页只使用已经给出归纳推导的虚拟差界。

为什么固定成员不会永远被跳过 ​

假设C的当前pass固定为某值 H,此后永远未被选。其他任务只要仍以小于或等于 H 的pass抢在C前面,每次选中就加一个固定正步幅。每个这样的任务能在 H 以下运行的次数有限,任务总数也有限,最后必轮到C,与“永远不选”矛盾。

这解释固定正票数下的无饥饿;它不等于对任意动态到达流、任意暂停和任意整数溢出实现都给出了同一个等待界。特别是如果允许不断加入pass极小的新任务,刚才“其他任务总数有限”的论证就失效。

一小片服务,只应收费一小份 ​

若标准片长为 q,任务本次实际只消耗 u,则相应扩展把pass增加改为

Pi←Pi+diuq.

例如A步幅2、标准片1,本次只运行0.25毫秒,增加应为0.5,而不是2。若原pass为2,更新为2.5,表示这次只取得了四分之一片的服务。按完整片收费,会让频繁短片任务的虚拟账本走得过快,从而拿到过少CPU。

本次让出后若任务阻塞,就先从候选队列移除,不能因为pass小而调度一个尚未就绪的任务。等它重新加入时,还必须明确下面的动态加入规则;不能只改短片公式就声称完成了动态协议。

新加入者不能永远从历史的零点开始 ​

设旧任务pass已经在100附近。若新任务每次创建都设pass为0,它会连续获得许多机会追赶到100;反复创建新身份可以反复领取这份并不属于它的历史补偿。反过来,长期睡眠者保存的旧pass也可能远落后于当前系统进度。

原论文的动态版本维护全局虚拟进度,离开时保存相对于全局进度的剩余距离,回来时重新放置;改变票数还要按新旧步幅比例调整剩余距离。它不是简单地把所有新任务设为0,也不是每次权重变化把所有历史清零。动态版本的完整规则应以原文§2.2–2.4为准,本页十二片证明只覆盖静态版本。

若只是在一个封闭批次开始前把所有pass减去同一个常数,大小次序不变;但运行中对部分任务单独重置会改变次序。防止数值溢出的归一化必须覆盖同一个比较域,不能让一部分睡眠记录仍停在旧坐标系。

推论与应用

实现代价与模型边界 ​

最小优先队列可用于按pass取任务、更新后重插,二叉堆每次为 O(log⁡n),另计实际上下文交接。票数很大、K很小时,整数除法可能把步幅截成0,任务再也不向前推进;应选择有足够精度的表示并验证所有有效步幅严格为正。

按CPU时间取得3:2:1不意味着业务吞吐也按3:2:1。缓存状态、锁等待、I/O及不同处理器速度会使同样的服务时间产生不同产出。调度器保证的对象必须与服务账本一致,而不是由“公平”两个字替代。

参考资料
  • Carl A. Waldspurger、William E. Weihl,“Stride Scheduling: Deterministic Proportional-Share Resource Management”,MIT/LCS/TM-528,1995,§2.1与Figure 1(pass初始化与基本算法)、§2.2–2.4(动态成员、票变更与非等长片)、§4(层次变体)。本页较保守的虚拟差界独立证明,不冒充原论文的更强误差界。
  • Arpaci-Dusseau与Arpaci-Dusseau,OSTEP, Ch.9, §9.6:确定性比例调度的教学对照;实际使用时须区分不同初始化约定。
关系图谱5 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系