第九章 调度:比例份额
在本章,我们将看到一个不同类型的调度程序–比例份额(proportional-share)调度程序,有时也被称为公平份额(fair-share)调度程序。
比例份额算法基于一个简单的想法:调度程序的最终目标,是确保每个工作获得一定比例的CPU时间,而不是优化周转时间和响应时间。
每一个进程相当于买彩票的人,越是应该频繁运行的进程,买到的彩票越多。
每隔一段时间都会举办一次抽奖,抽到的彩票是哪个进程,就运行哪个进程。
9.1 基本概念:彩票数代表份额
彩票数( ticket)代表了进程占有某个资源的份额。
一个进程拥有的彩票数占总彩票书的百分比,就是它占有资源的份额。
假设有100张彩票,我们希望A占用CPU 75%的时间,而B占用CPU 25%的时间。
则我们应该分配给 A 75张彩票,分配给 B 25张彩票。
调度程序不断定时地抽取彩票,有100张彩票,就从0-99中抽取一个数字。
如果抽到0-24,就决定运行A;如果抽到25-99,就决定运行B。
虽然,这种随机性可能导致短时间的调度不均。
但是,随着两个工作运行时间的增加,它们的CPU时间所占比例会越来越接近于期望的25%和75%,从长时间看起来是很公平的。
9.2 彩票机制
彩票调度还提高了一些机制,以不同且有效的方式来调度彩票。
- 彩票货币(ticket currency)
这种方式运行拥有一组彩票的用户以他们喜欢的某种货币将彩票分给自己的不同工作。
之后操作系统再自动将这种货币兑换为正确的全局彩票。
类似于汇率,将用户的自有货币比作国家货币,如人民币、日元,将全局彩票比作全世界的通用货币–美元。
用户将自己拥有的彩票按照汇率折算成自有货币,分配给自己的不同工作。
当用户的工作需要运行时,会将分配到的自有货币再根据汇率折算成全局彩票进行抽奖,来决定由谁来运行。
- 彩票转让(ticket transfer)
通过转让,一个进程可以临时将自己的彩票交给另一个进程。
这种机制在C/S交互的场景中尤其有用,在这种场景中,客户端进程向服务端发送消息,请求其按自己的需求执行工作。
为了加速服务端的执行,客户端可以将自己的彩票转让给服务端,从而尽可能加速服务端执行自己请求的速度。
服务端执行结束后会将这部分彩票归还给客户端。
- 彩票通胀(ticket inflation)
利用通胀,一个进程可以临时提升或降低自己拥有的彩票数量。
当然在竞争环境下,进程之间互相不信任,这种机制就会没有意义。
因为一个贪婪的进程可能给自己非常多的彩票,从而接管机器。
但是,通胀可以用于进程之间相互信任的环境。
在这种情况下,急需更多CPU时间的进程就可以自己增加持有彩票,从而将自己的需求告知操作系统,也不用耗费时间与其他进程通信。
9.3 实现
彩票调度中最不可思议的,或许就是实现简单。
只需要
- 一个用来选择中奖彩票的随机数生成器
- 一个记录系统中所有进程的数据结构
- 所有彩票的总数
假设有A、B、C三个进程,每个进程有一定数量的彩票,彩票总数为400,如下图所示