操作系统导论 第九章 调度:比例份额
文章目录
- 第九章 调度:比例份额
- 9.1 基本概念:彩票数代表份额
- 9.2 彩票机制
- 9.3 实现
- 9.4 步长调度
- 9.5 小结
第九章 调度:比例份额
在本章,我们将看到一个不同类型的调度程序–比例份额(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,如下图所示
Tix:100
Tix:50
Tix:250
在做出调度决策之前,首先从彩票总数400中选择一个随机数,假设选择了300。
然后遍历链表,用一个简单的计数器找到中奖者。
从零开始,将每个进程的票数按序相加,当超过或等于中奖彩票时,当前进程就是中奖者。
- 进程A拥有100张彩票,0+100=100<300,继续寻找;
- 进程B拥有50张彩票,100+50=150<300,继续寻找;
- 进程C拥有250张彩票,150+250=400<300,进程C是中奖者。
要让这个过程更有效率,建议将列表项按照彩票数递减排序。
这样的顺序不会影响算法的正确性,却可以用最小的的迭代次数找到中奖者,尤其当大多数彩票被少数进程掌握时。
9.4 步长调度
你可能会想到,虽然随机方式可以使得调度程序的实现简单,但偶尔并不能产生正确的比例,尤其在工作运行时间很短的情况下。
那么,为什么要利用随机性呢?
基于这个原因,Waldspurger提出了步长调度(stride scheduling),一个确定性的公平分配算法。
系统中的每个工作都有自己的步长,这个值与票数成反比。
之前的例子中,A、B、C三个进程的票数分别为100、50、250,我们用一个大数除以每个工作的票数,就可以得到每个工作的步长。
比如用10000作为大数,则A、B、C的步长分别为100,200,40。
每个进程都有一个计数器,当进程运行时,它对应的计数器会增加相应的步长,记录它的总体进展。
步长调度的基本思路是:每次需要进行调度时,选择目前拥有最小行程值的进程,并且在运行之后将该进程的行程值增加一个步长。
进程A、B、C一段时间内的调度行为如下:
行程值(A)(步长=100) | 行程值(B)(步长=200) | 行程值(C)(步长=40) | 谁运行 |
---|---|---|---|
0 | 0 | 0 | A |
100 | 0 | 0 | B |
100 | 200 | 0 | C |
100 | 200 | 40 | C |
100 | 200 | 80 | C |
100 | 200 | 120 | A |
200 | 200 | 120 | C |
200 | 200 | 160 | C |
200 | 200 | 200 | ······ |
可以看出,C运行了5次,A运行了2次,B运行了1次,正好是票数的比例——250、100、50。
彩票调度算法只能在一段时间后,在概率上实现比例。
而步长调度算法可以在每个调度周期后做到。
既然这样,为什么还要彩票调度算法呢?
因为彩票调度有步长调度没有的优势,它不需要全局状态。
如果一个新的进程在步长调度执行过程中加入系统,应该怎么设置它的行程值?
设置为0的话,它就独占CPU了。
而彩票调度不需要对每个进程记录全局状态,进加入的进程只要将它的票数更新进全局总票数即可。
9.5 小结
本章我们介绍了比例份额调度的概念,并简单讨论了两种实现:彩票调度和步长调度。
虽然两者都很有趣,但由于一些原因,并没有作为CPU调度程序被广泛使用。
一个原因是它们并不能很好地适合I/O,另一个原因是其中最难的票数分配问题没有确定的解决方案。
通用调度程序(比如MLFQ以及其他类似的Linux调度程序)做得更好,因此得到了广泛的应用。
操作系统导论 第九章 调度:比例份额相关推荐
- 操作系统原理第九章:虚拟内存
目录 1 虚拟内存的背景 1.1 局部性原理 1.2 虚拟内存 2 请求调页 2.1 页面调入策略 3 页面置换 4 页面置换算法 4.1 最佳算法(OPT, optimal) 4.2 先进先出置换算 ...
- 全局变量中断原子操作_操作系统导论02-06章
第二章 操作系统介绍 一个正在运行的程序会做一件非常简单的事情:执行指令.处理器从内存中获取(fetch)一条指令,对其进行解码(decode)(弄清楚这是哪条指令),然后执行(execute)它(做 ...
- 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...
计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...
- 【操作系统】第九章-操作系统接口
九.操作系统接口 前言 操作系统作为计算机系统资源的管理者,对系统中的所有硬件和软件资源进行统一的管理和操纵.无论是用户(程序)或OS的外层软件,凡是涉及到系统资源的有关操作,都必须作为服务请求提交给 ...
- 现代操作系统: 第九章 安全
日益庞大的操作系统和应用导致系统中不乏出现错误.当错误涉及安全类别的时候,我们就称之为漏洞.通过向软件输入特定的字节来触发错误.像这种触发错误的输入通常叫做漏洞攻击或者漏洞利用. 攻击可以通过病毒,手 ...
- 算法导论第九章习题9.2-3
使用迭代版本的随机选择函数实现选择第i小元素.原理与9.2例题相同,该代码为9.2例题的迭代版实现.具体代码如下: #include<iostream> using namespace s ...
- 操作系统学习(三):浅析比例份额调度——彩票调度和步长调度
1.简单介绍 比例份额(proportional-share)算法基于一个简单的想法:调度程序的最终目标,是确保每个工作获得一定比例的 CPU 时间,而不是优化周转时间和响应时间. 他有一种简单的实习 ...
- 操作系统概念笔记——第九章:虚拟内存
文章目录 第九章:虚拟内存 9.1 背景 9.2 按需调页 9.2.1 基本概念 9.2.2 按需调页的性能 9.3 写时复制 9.4 页面置换 9.4.1 基本页置换 9.4.2 FIFO页置换 9 ...
- 操作系统-第九章虚拟内存
操作系统-第九章虚拟内存 虚拟内存 内存共享 按需调页 虚拟存储需要解决的几个问题 页表中须指明对应的页是否在内存中 如何具体的区分当发生页错误时 page is invalid or isvalid ...
最新文章
- Linux性能研究(总)
- Oracle按照时间统计总结
- mysql数据库出现无法登录(ERROR 1045 ),预防和解决及系列问题解决方法。
- Mysql/Mairadb主从复制
- 博客搭建攻略(三):创造收益
- JspServlet之Cookie
- 深度解析PHP数组函数array_chunk
- 【剑指offer】面试题54:二叉搜索树的第k大节点(java)
- 华为云DevCloud为虚拟仿真插上互联网的翅膀
- artdialog4.1.7 中父页面给子页面传值
- mysql 告警 异常 处理_mysql异常解决方案 - Lock wait timeout exceeded异常
- 计算机组成原理(微课版)谭志虎pdf资源
- GStreamer 简化 Linux 多媒体开发
- H264/AVC协议基本概况
- jq ui-selectable中click单击事件,dblclick双击事件无效
- 《P2SGrad Refined Gradients for Optimizing Deep Face Models》论文阅读
- 50本永不过时的经典计算机书籍
- 编剧小记 — Contour
- CUDA11.3以及PyTorch-GPU版本安装
- RUST error: linking with `x86_64-w64-mingw32-gcc` failed: exit code: 1