调度:比例分享

在本章中,我们将研究一种不同类型的调度器,称为比例共享调度器,有时也称为公平共享调度器。比例共享是基于一个简单的概念:调度程序可能会试图确保每个作业获得一定百分比的CPU时间,而不是优化转换或响应时间。在Waldspurger和Weihl [WW94]的研究中发现了一个非常好的比例共享计划的现代例子,它被称为彩票调度。然而,这个想法肯定要大得多[KL88]。基本的想法很简单:每隔一段时间,拿一张彩票来决定下一步该做什么;应该经常运行的程序应该有更多的机会赢得彩票。很容易,不是吗?现在,到细节!但在我们的症结之前。

关键:如何按比例共享CPU。我们如何设计一个调度程序以比例的方式共享CPU ?这样做的关键机制是什么?他们的使用效果如何?基本概念:票代表你的份额。潜在的彩票调度是一个非常基本的概念:票据,用来表示一个进程(或用户或其他)应该接收的资源的份额。一个进程所占的票数百分比表示它所占的系统资源的份额。

 让我们来看一个例子。假设有两个过程,A和B,而且A有75张票,B只有25张。因此,我们想要的是获得75%的CPU和B,剩下的25%。抽奖计划是通过每隔一段时间(比如说,每次切片)就通过抽签来达到这个概率(但不是决定性的)。持有彩票是很简单的:调度器必须知道总共有多少张票(在我们的例子中,有100张)。调度器然后选择一张中奖票,从0到99。假设A持有0到74和B 75到99的票,中奖票只是决定A或B是否运行。然后,调度器加载该获胜进程的状态并运行它。这里有一个彩票调度程序的中奖彩票的例子。



提示:使用随机性。

抽奖计划最漂亮的一个方面就是它的随机性。当你必须做出决定时,使用这种随机方法通常是一种稳健而简单的方法。与传统的决策相比,随机方法至少有三个优势。首先,random通常会避免奇怪的转角行为,而传统的算法在处理时可能会遇到麻烦。例如,考虑LRU替换策略(在以后的虚拟内存章节中更详细地研究);虽然LRU通常是一个很好的替代算法,但它在某些周期顺序的工作负载中表现得很好。另一方面,随机却没有这样糟糕的情况。其次,random也是轻量级的,需要很少的状态来跟踪其他选项。在传统的公平共享调度算法中,跟踪每个进程收到的CPU数量需要每个进程计算,在运行每个进程之后必须更新。这样做只需要对每个进程的状态进行最少的操作(例如,每张票的数量)。最后,random可以是相当快的。只要生成一个随机数,就可以快速做出决策,因此可以在需要速度的地方使用随机数。当然,越快的需求,越随机倾向于伪随机。

从这个例子中可以看出,在彩票调度中使用随机性导致了满足期望比例的概率正确性,但没有保证。在上面的例子中,B只运行了20个时间段中的4个(20%),而不是期望的25%的分配。然而,这两个职位竞争的时间越长,他们就越有可能达到预期的百分比。

提示:使用门票来代表股票。

彩票(和步幅)设计中最强大(也是最基本的)机制之一就是门票。在这些例子中,票据被用来表示进程的CPU份额,但是可以更广泛地应用。例如,在最近的虚拟内存管理工作中,Waldspurger展示了如何使用tickets来表示来宾操作系统的内存份额[W02]。因此,如果您需要一种机制来表示所有权的比例,那么这个概念可能是……(等待)…这张票

9.2票机制

彩票安排也提供了一些机制来操纵票的不同,有时有用的方式。一种方法是使用票币的概念货币允许用户在自己的工作中以任何他们想要的货币分配门票。然后该系统自动将所述货币转换为正确的全球值。

例如,假设用户A和B都得到了100张票。用户A正在运行两份工作,A1和A2,并给他们每人500张(总共1000张)用户自己的货币。用户B只运行1个工作,并给它10张票(总共10张)。该系统将把A1 s和A2 s的分配从500美元兑换成全球货币的50美元;同样,B1的10张票将被兑换成100张票。然后,彩票将被持有全球票券(总计200英镑),以确定哪一项工作在运行。


另一个有用的机制是门票转让通过转让,一个过程可以暂时把它的票交给另一个进程。这种能力在客户机/服务器设置中特别有用,客户端进程将消息发送到服务器,请求服务器为客户端做一些工作。为了加快工作速度,客户端可以将票传递给服务器,从而在服务器处理客户端请求的同时尽量提高服务器的性能。完成后,服务器将这些票据传输回客户端,并且所有的都和以前一样。

最后,票价膨胀有时是一种有用的技术。在通货膨胀的情况下,一个过程可以暂时提高或降低它拥有的门票数量。当然,在竞争的情况下,如果流程彼此不信任,这就没什么意义;一个贪婪的过程可能会给自己大量的罚单,并接管机器。相反,通货膨胀可以应用在一个相互信任的过程中;在这种情况下,如果任何一个进程知道它需要更多的CPU时间,它就可以提高它的票务价值,以反映对系统的需求,而不需要与任何其他进程进行通信。

9.3实现

也许关于抽奖安排的最令人惊奇的事情是它的实现的简单性。你所需要的只是一个好的随机数生成器来选择中奖彩票。一个跟踪系统进程的数据结构(例如,一个列表),以及总票数。

让我们假设我们将进程保存在列表中。这是一个由三个过程组成的例子,A, B, C,每个都有一定数量的票。代码遍历进程列表,将每个票证值添加到计数器中,直到值超过了获胜者。一旦出现这种情况,当前的列表元素就是赢家。在我们的例子中,获胜的票是300,以下是发生的。首先,计数器增加到100,以计算s票;因为100小于300,循环继续。然后计数器会更新到150 (B s票),仍然小于300,因此我们继续。最后,计数器被更新到400(明显大于300),因此我们跳出循环,用当前指向C(获胜者)。为了使这个过程最有效,通常最好是按照排序顺序组织列表,从最多的票到最低的票。排序并不影响算法的正确性;但是,它确实确保了列表迭代次数最少的情况,特别是如果有少数几个进程拥有大部分的票据。



9.4一个例子

为了使抽奖活动的动态更容易理解,我们现在对两份工作的完成时间进行了简单的研究,每个工作都有相同数量的门票(100)和相同的运行时间(R,我们将会有所不同)。在这种情况下,我们希望每一份工作的完成时间大致相同,但由于抽签安排的随机性,有时一份工作比另一份工作先完成。为了量化这一差异,我们定义了一个简单的不公平度量,即第一个工作完成的时间除以第二个作业完成的时间。或者,如果R = 10,第一个作业在时间10(和第二份工作在20),U = 10 20 = 0.5。当这两种工作几乎同时完成时,U将会非常接近1。在这个场景中,这就是我们的目标:一个完全公平的调度器将实现U = 1。


图9.2将平均不公平性划分为两个工作(R)的长度,从1到1000,超过30个试验(结果是通过在章节末尾提供的仿真器生成的)。从图中可以看出,当工作长度不太长时,平均不公平会非常严重。只有当作业运行大量时间片时,彩票调度程序才会接近预期的结果。

9.5如何分配门票。

我们在抽奖计划中没有解决的一个问题是:如何分配工作的门票?这个问题很棘手,因为系统的行为方式非常依赖于如何分配门票。一种方法是假定用户最了解;在这种情况下,每个用户都有一些票,用户可以分配到他们想要的任何工作的票。然而,这个解决方案是一个非解决方案:它真的没有告诉你该做什么。因此,在给定一组工作的情况下,ticket分配问题仍然是开放的。

9.6为什么不确定性呢?

您可能还会疑惑:为什么要使用随机性呢?正如我们在上面所看到的,虽然随机性为我们提供了一个简单的(并且近似正确的)调度器,但它偶尔也不会提供精确的比例,尤其是在短时间内。由于这个原因,Waldspurger发明了步调度,一个确定性的公平共享调度器[W95]。跨步调度也很简单。系统中的每一项工作都有一个跨步,这与它所拥有的票的数量成反比。在上面的例子中,工作A、B、C,分别有100、50和250张票,我们可以计算每个过程分配到的票的数量,然后除以一个很大的数字。例如,如果我们将10,000除以这些票证值,我们就得到了A、B和C: 100、200和40的步进值。我们称这个值为每一个过程的跨度;每次进程运行时,我们将增加一个计数。

然后,调度器使用stride和pass来确定下一步应该运行哪个进程。基本的想法很简单:在任何给定的时间,选择运行的过程,它的传递值是最低的;当你运行一个进程时,通过它的步幅增加它的通过计数器。一个伪代码实现由Waldspurger (W95)提供。


在我们的示例中,我们从三个流程开始(A、B和C),其跨步值为100、200和40,所有这些流程的初始值为0。因此,首先,任何进程都可能运行,因为它们的传递值同样低。假设我们选A(任意;可以选择任何具有相同低通值的过程。一个运行;完成时间片后,我们将其传递值更新为100。然后我们运行B,它的传递值被设置为200。最后,我们运行C,其传递值增加到40。此时,该算法将选择最低的传递值,即C s,并运行它,更新它的传递到80(如您所回忆的,C的步幅是40)。然后C将再次运行(仍然是最低的传递值),将其传递到120。现在A将运行,更新到200(现在等于B),然后C将运行两次,更新到160,然后200。在这一点上,所有的传递值都是相等的,这个过程会重复,无限。图9.3跟踪了调度器随时间的变化。从图中我们可以看出,C只运行了5次,两次,B一次,它们的票面价值是250,100,和50。抽奖计划随着时间的推移达到了概率的比例;在每一个调度周期的末尾,步幅调度完全正确

所以你可能会想:考虑到跨步调度的精度,为什么要使用抽签安排呢?嗯,彩票调度有一个很好的属性,它可以跨越调度:没有全局状态。想象一份新工作进入我们的跨步调度示例的中间;它的传递值应该是什么?应该设置为0吗?如果是这样,它将独占CPU。在彩票调度中,每个流程都没有全局状态;我们只需添加一个新的进程,无论它有什么票,更新单个全局变量来跟踪我们有多少张总票,然后从那里开始。通过这种方式,乐透使得以合理的方式合并新流程变得更加容易。

9.7总结

我们介绍了比例共享计划的概念,并简要讨论了两种实现:彩票和跨步调度。乐透利用随机性巧妙地实现比例分享;步确定性。尽管两者在概念上都很有趣,但由于各种原因,它们并没有作为CPU调度程序获得广泛的应用。一是这种方法与I/O [AC97]并不特别吻合;另一个原因是,他们留下了门票分配的难题,即:你怎么知道你的浏览器应该分配多少张票?通用的调度器(如我们前面讨论过的MLFQ和其他类似的Linux调度器)做得更优雅,因此部署得更广泛。因此,在一些问题(如分配股票)相对容易解决的领域中,比例共享调度程序更有用。例如,在一个虚拟数据中心中,您可能希望将您的CPU周期的四分之一分配给Windows VM,其余的分配给您的基础Linux安装,比例共享可以是简单和有效的。请参阅Waldspurger [W02],了解如何在VMWare ESX服务器中按比例共享内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值