比例份额调度
这里涉及到的两个算法都是比较有趣的。分别是彩票调度算法和步长调度算法。
彩票调度算法:
彩票数(ticket)代表了进程(或用户或其他)占 有某个资源的份额。一个进程拥有的彩票数占总彩票数的百分比,就是它占有资源的份额。假设有这样一个问题场景总共有100张彩票:A有75张彩票,B有25张彩票。通过不间断定时抽取彩票,就可以让A、B拥有等比例的占用CPU资源的几率。彩票调度制度也采取了一些有趣的方式:
一是利用彩票货币的形式允许拥有一组彩票的用户以他们喜欢的某种货币, 将彩票分给自己的不同工作。之后操作系统再自动将这种货币兑换为正确的全局彩票。假设用户 A 和用户 B 每人拥有 100 张彩票。用户 A 有两个工作 A1 和 A2,他以自己的货币,给每个工作 500 张彩票(共 1000 张)。用户 B 只运行一个工作,给它 10 张彩 票(总共 10 张)。操作系统将进行兑换,将 A1 和 A2 拥有的 A 的货币 500 张,兑换成全局 货币 50 张。类似地,兑换给 B1 的 10 张彩票兑换成 100 张。然后会对全局彩票货币(共 200 张)举行抽奖,决定哪个工作运行。
另一个机制是彩票转让制度,一个进程可以临时将自己的彩票交给操一个进程。还有就是彩票通胀也时有利用。利用通胀,一个进程可以临时提升或者降低自己的彩票数量,这里主要应用在进程相互信任的环境中。
Q:如何分配彩票呢?
如果使用彩票调度算法,系统会非常依赖于彩票的分配。这里提到另一种调度算法-步长调度。
步长调度
步长调度也很简单。系统中的每个工作都有自己的步长,这个值与票数值成反比。假设A、B、C 这 3 个工作的票数分别是 100、50 和 250,我们通过用一个大数分别除以他们的票数来获得每个进程的步长。比如用 10000 除以这些票数值,得到了 3 个 进程的步长分别为 100、200 和 40。我们称这个值为每个进程的步长(stride)。每一进程运行后,我们会让它的计数器增加它的步长,记录它的总体进展。初始步长值分别为100、200和40。假设A先运行,走了步长值100,然后B运行,走了步长值200,最后C执行,走了步长值40。此时算法会选择最小的行程值,也就是C,走步长值40,此时C的行程为80,也是整个行程中最短的,继续走步长值…一直等到所有的行程值相等。然后一直运行下去。
经过统计得知,C运行了5次,B运行了1次,A运行了2次,正好对应票数比例250:50 : 100。
总结:
这俩有意思的调度算法也是有区别的,彩票调度不需要全局状态,就是当步长调度过程中有一个新进程加进去了,步长调度就没法进行处理,而彩票调度只需要更新总票数就可以进行了。
这俩兄弟有一个问题,是不能很好的适合IO,同时无法准确的进行票数分配。如果有进程窃取了大部分的票数,不也近似于垄断CPU了嘛?