调度:比例份额
调度程序的最终目标,是确保每个工作获得一定比例的 CPU 时间,而不是优化周转时间和响应时间。
彩票数代表份额:
彩票数(ticket)代表了进程(或用户或其他)占有某个资源的份额。
很好理解:举个栗子
eg.A有75张彩票,B有25张彩票,理想情况下我们希望A占用CPU75%的时间,B则是25%。
不定时(例如一个时间片)地抽取一个随机数(从0~99选取)决定运行A或B。
实际结果却不一定是A75%,B25%,这相当于概率和频率的区别。
随机性相对于传统方法的优势:
(1)可避免奇怪的边角情况
(2)很轻量,几乎不需要记录任何状态
(3)快
彩票机制
(1)彩票货币(ticket currency)
简单说来,先由用户按喜好分配,分配完后系统再根据比例分配,举个栗子就明白了。
eg.
A和B各有100张彩票,A有两个工作,B只有一个工作。A分配给两个工作各500张彩票(A开心就好),B给他的一个工作10个彩票。
系统分配时,根据A:B=1:1来进行分配,给A的两个工作各全局货币50张,B100张。
(2)彩票转让(ticket transfer)
进程临时将自己的彩票转让给另一个进程,多见于客户端和服务端。
当客户端想要加速服务端处理自己的请求,它可以将自己彩票转让给服务端,执行结束后服务端再还给客户端。
(3)彩票通胀(ticket inflation)
进程临时提升或降低自己的彩票数量,而不需要与其他任何进程通信(注:只有在进程间相互信任的情况下才有用)。
若不信任,一个贪婪进程可以给自己很多彩票从而接管CPU。
不公平指标U(unfairness metric)
两个工作完成时刻相除得到 U。
我们的目标是: 完美的公平调度程序可以做到 U=1。
当工作执行时间很短时,平均不公平度非常糟糕。
上图为两个工作运行时间从1~1000时U的变化。
步长调度
一个确定性的公平调度算法。
每个工作都有自己的步长,与票数成反比,计算方式为一个大数除以票数。每个进程都有计数器(行程值)记录总步长。
当需要进行调度时,选择目前拥有最小行程值的进程,并且在运行之后将该进程的行程值增加一个步长。举个栗子。
eg.A,B,C的票数分别为100,50,250。用10000除以它们得到步长100,200,40。
初始行程值ABC均为0,假设选择A首先运行,行程值(A)=0+100=100。之后在BC(它们行程值最小)选择,假设选择了B,行程值(B)=0+200=200。然后选C,行程值(C)=0+40=40。因为C仍是最小的,接着选C……此过程会无限运行下去。
上图可知,A运行2次,B运行1次,C运行5次,正好是票数的比例。
彩票调度相对于步长调度的优势
不需要全局状态。
若新进程在步长调度中途加入,该如何设置其行程值?设置为0的话就会独占CPU。而彩票调度就没有这样的烦恼,只需要再新加入后更新全局总票数就行了。
缺陷
两种方式都不能很好地适合 I/O,最难的票数分配问题并没有确定的解决方式。