【操作系统导论】比例份额调度

news2024/9/20 5:50:48

本文介绍一种 比例份额(proportional-share) 调度程序,也称为 公平份额(fair-share)

彩票调度

简介

彩票调度 的基本思想:

  • 每隔一段时间,都会举行一次彩票抽奖,以确定接下来应该运行哪个进程;

  • 越是应该频繁运行的进程,越是应该拥有更多地赢得彩票的机会。

关键在于如何按比例分配 CPU。

利用了 随机性(randomness),具有以下优势:

  • 随机方法很轻量,几乎不需要记录任何状态;

  • 随机方法很快,只要能很快地产生随机数,做出决策也就很快;

  • 随机方法常常可以避免奇怪的边角情况,较传统的算法可能在处理这些情况时遇到麻烦。

彩票机制

*彩票数(ticket)*代表进程占有某个资源的份额:一个进程拥有的彩票数占总数的百分比,就是它占有资源的份额。

假设有两个进程 A 和 B,A 拥有 75 张彩票,B 拥有 25 张;我们希望 A 占用 75%的 CPU 时间,而 B 占用 25%。

彩票调度程序输出的中奖彩票:

在这里插入图片描述

对应的调度结果:

在这里插入图片描述

上面例子中,工作 B 运行了 20 个时间片中的 4 个,只是占了 20%,而不是期望的 25%。

但是,如果这两个工作运行得时间越长,它们得到的 CPU 时间比例就会越接近期望

彩票调度还提供了一些机制,以不同且有效的方式来调度彩票。

  • 彩票货币 (ticket currency)

用户可以自定义他们自己的货币, 并分给自己的不同工作;之后操作系统再将这种货币兑换为全局彩票。

假设用户 A 和用户 B 每人拥有 100 张全局彩票。用户 A 有两个工作 A1 和 A2,分给每个工作 500 个货币。用户 B 只运行一个工作,给它 10 个货币。

操作系统将进行兑换,将 A1 和 A2 拥有的 A 的货币 500 个,兑换成全局彩票 50 张;将 B1 的 10 个货币兑换成 100 张全局彩票;然后对 200 张全局彩票进行抽奖,决定哪个工作运行。

在这里插入图片描述

  • 彩票转让 (ticket transfer)

通过转让,一个进程可以临时将自己的彩票交给另一个进程。

这种机制在 C/S 交互的场景中尤其有用,客户端进程向服务端发送消息,请求其按自己的需求执行工作,为了加速服务端的执行, 客户端可以将自己的彩票转让给服务端,从而尽可能加速服务端执行自己请求的速度。服务端执行结束后会将这部分彩票归还给客户端。

  • 彩票通胀 (ticket inflation)

利用通胀,一个进程可以临时提升或降低自己拥有的彩票数量。

当然在竞争环境中,进程之间互相不信任,这种机制就没什么意义。一个贪婪的进程可能给自己非常多的彩票,从而接管机器。

但是,通胀可以用于进程之间相互信任的环境。在这种情况下,如果一个进程知道它需要更多 CPU 时间,就可以增加自己的彩票,从而将自己的需求告知操作系统,这一切不需要与任何其他进程通信。

具体实现

彩票调度的实现非常简单,只需要 一个不错的随机数生成器来选择中奖彩票一个记录系统中所有进程的数据结构(一个列表),以及所有彩票的总数。

假定用列表记录进程,下面的例子中有 A、B、C 这 3 个进程,每个进程有一定数量的彩票。

在这里插入图片描述

代码实现如下:

// counter: used to track if we've found the winner yet 
int counter = 0;

// get a value between 0 and the total of tickets 
int winner = getrandom(0, totaltickets);

// current: use this to walk through the list of jobs 
node_t *current = head;

// loop until the sum of ticket values is > the winner 
while (current) {
    counter = counter + current->tickets; 
    if (counter > winner)
        break;
}

// now 'current' is the winner: schedule it...

如果要让这个过程更有效率,可以将列表项按照彩票数递减排序。

算法分析

我们知道彩票调度是一种“公平份额”调度算法,那么它的公平性如何呢?

假设有两个互相竞争的工作,每个工作都有相 100 张彩票,以及相同的运行时间 R。

我们希望两个工作大约同时完成,但由于彩票调度的随机性,一个工作可能先于另一个完成。

为了量化这种区别,我们定义一个不公平指标 U,将两个工作完成时刻相除得到 U 的值。

在这里插入图片描述

可以看出,当工作执行时间很短时,公平性非常糟糕。只有当工作执行非常多的时间片时,彩票调度算法才能得到期望的结果。

还有一个问题没有提到,那就是如何为工作分配彩票?

这是一个非常棘手的问题,系统的运行严重依赖于彩票的分配。

假设用户自己知道如何分配,则可以分给每个用户一定量的彩票,由用户自主分配给其工作。

然而还是没有具体的分配策略。对于给定的一组工作,彩票分配的问题依然没有最佳答案。

步长调度

简介

虽然随机方式可以使得调度程序的实现简单,但偶尔并不能产生正确的比例,尤其在工作运行时间很短的情况下。

出于这个原因,Waldspurger 提出 步长调度 (stride scheduling), 确定性的公平份额算法。

步长机制

步长调度的基本思想:

系统中的每个工作都有自己的 步长 (stride),与票数值成反比。比如 A、B、C 这 3 个工作的票数分别是 100、50 和 250,则可以用一个「大数」分别除以它们的票数来获得进程的步长。

如果用 10000 除以这些票数值,得到了 3 个进程的步长分别为 100、200 和 40。

每次进程运行后,会让它的计数器「行程值 (pass) 」增加它的步长,记录它的总体进展。

调度程序根据进程的步长及行程值来确定调度哪个进程:

在调度时,选择目前拥有最小行程值的进程,并在运行之后将该进程的行程值增加一个步长。

current = remove_min(queue);       // pick client with minimum pass
schedule(current);                 // use resource for quantum
current->pass += current->stride;  // compute next pass using stride
insert(queue, current);            // put back into the queue

在上面例子中,3 个进程 (A、B、C) 的步长值分别为 100、200 和 40,初始行程值都为 0。因此,最初,所有进程都可能被选择执行。假设先执行 A,再执行 B,执行过程如下:

在这里插入图片描述

可以看出,C 运行了 5 次、A 是 2 次,B 是 1 次,正好是票数的比例——200、100 和 50。

算法分析

  1. 步长调度需要全局状态 (行程值)

彩票调度不需要对每个进程记录全局状态,只需要用新进程的票数更新全局的总票数即可;

  1. 选择步长仍然是一个棘手的问题

步长太小可能导致进程频繁地被切换,增加上下文切换的开销;步长太大可能导致某些进程长时间占用CPU而不释放,影响系统的响应性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1305378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【上海大学数字逻辑实验报告】六、时序电路

一、 实验目的 掌握同步二进制计数器和移位寄存器的原理。学会用分立元件构成2位同步二进制加计数器。学会在Quartus II上设计单向移位寄存器。学会在Quartus II上设计环形计数器。 二、 实验原理 同步计数器是指计数器中的各触发器的时钟脉冲输入端连接在一起,接…

做题总结 707. 设计链表

做题总结 707. 设计链表 leetcode中单链表节点的默认定义我的尝试正确运行的代码(java) leetcode中单链表节点的默认定义 class ListNode {int val;ListNode next;//无参public ListNode() {}//有参:1public ListNode(int val) {this.val val;}//有参:…

【项目小结】优点分析

一、 个人博客系统 一)限制强制登录 问题:限制用户登录后才能进行相关操作解决: 1)前端: ① 写一个函数用于判断登录状态,如果返回的状态码是200就不进行任何操作,否则Ajax实现页面的跳转操作…

Apollo配置发布原理解析

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

Windows下查看删除某一个端口号

背景:Java项目运行时,提示端口号被占用,然后就忘记之前是怎么处理的了,感觉还是像Linux中杀掉端口号就命令行的方式比较简单一些,然后就是各种搜索,记录一下 第一步:在cmd中查看该端口号是否被…

最强文生图跨模态大模型:Stable Diffusion

文章目录 一、概述二、Stable Diffusion v1 & v22.1 简介2.2 LAION-5B数据集2.3 CLIP条件控制模型2.4 模型训练 三、Stable Diffusion 发展3.1 图形界面3.1.1 Web UI3.1.2 Comfy UI 3.2 微调方法3.1 Lora 3.3 控制模型3.3.1 ControlNet 四、其他文生图模型4.1 DALL-E24.2 I…

Nginx的location匹配和rewrite重写

一、location匹配 常用的正则表达式 ^ :匹配输入字符串的起始位置 $ :匹配输入字符串的结束位置 * :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”:匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll…

MySQL笔记-第14章_视图

视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第14章_视图1. 常见的数据库对象2. 视图概述2.1 为什么使用视图?2.2 视图的理解 3. 创建视图3.1 创建单表视图3.2 创建多表联合视…

C++ exception类:C++标准异常的基类

C语言本身或者标准库抛出的异常都是 exception 的子类,称为标准异常(Standard Exception)。你可以通过下面的语句来捕获所有的标准异常: try{//可能抛出异常的语句}catch(exception &e){//处理异常的语句} 之所以使用引用&a…

GeoPandas实操:读取数据

GeoPandas 支持读取和写入多种地理空间数据格式,如 ESRI Shapefile、GeoJSON、GeoPackage 等,以及与其他 GIS 软件兼容的格式。 1. 读取数据 1.1. 读取ESRI Shapefile数据 ESRI Shapefile(简称 Shapefile 或 .shp 文件)是一种常…

Pandas中的Series(第1讲)

Pandas中的Series(第1讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

PHP操作ZIP之ZipArchive类以及如何避免生成压缩文件带有目录层级的问题

常用的方法 php ZipArchive可以说是php自带的一个函数了,他可对对文件进行压缩与解压缩处理,但是使用此类之前我们必须在php.ini中把extensionphp_zip.dll前面的分号有没有去掉,然后再重启Apache这样才能使用这个类库。 ziparchive 可选参数…

解决:Component name “index“ should always be multi-word

原因 要求组件名称以驼峰格式命名,自定义组件名称应该由多单纯组成,防止和html标签冲突,所以index.vue 会报错 解决 1、按照规则驼峰格式,如:appIndex.vue 2、若有.eslintrc.js文件,并在规则中(rules)关…

排序算法4:【快速排序】、查看每趟归并后的结果,定义一个全局变量,用来计数作为总趟数

一、快速排序——时间复杂度:、 最坏的情况 1、原理: 快速排序是通过多次比较和交换来实现排序,首先,先从数列中,任意选择一个数作为基准(或叫分界值),比如,第一个数&a…

MySQL的事务以及springboot中如何使用事务

事务的四大特性: 概念: 事务 是一组操作的集合,它是不可分割的工作单元。事务会把所有操作作为一个整体,一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 注意: 默认MySQ…

图解transformer中的自注意力机制(备忘)

注意力机制 在整个注意力过程中,模型会学习了三个权重:查询、键和值。查询、键和值的思想来源于信息检索系统。所以我们先理解数据库查询的思想。 假设有一个数据库,里面有所有一些作家和他们的书籍信息。现在我想读一些Rabindranath写的书&#xff1a…

网络编程----select 模型总结

为什么要使用select模型? 答:解决基本C/S模型中,accept()、recv()、send()阻塞的问题 select模型与C/S模型的不同点 C/S模型中accept()会阻塞一直傻等socket来链接select模型只解决accept()傻等的问题,不解决recv(),send()执行…

Android View闪烁动画AlphaAnimation,Kotlin

Android View闪烁动画AlphaAnimation,Kotlin private fun flickerAnimation(view: View?) {val animation: Animation AlphaAnimation(1f, 0f) //不透明到透明。animation.duration 500 // 1次过程时长。animation.interpolator LinearInterpolator() // 线性速…

一天搞定jmeter入门到入职全套教程之Jmeter分布式测试

随着并发量的增大,一台机器就不能满足需求了,所以我们采用分布式(Master-Slaver)的方案去执行高并发的测试 注意事项: Master机器一般我们不执测试,所以可以拿一台配置差些的机器,主要用来采集…

YOLOv8改进 | 2023主干篇 | 利用RT-DETR特征提取网络PPHGNetV2改进YOLOv8(超级轻量化精度更高)

一、本文介绍 本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv8的主干,RT-DETR是今年由百度推出的第一款实时的ViT模型,其在实时检测的领域上号称是打败了YOLO系列,其利用两个主干一个是HGNet一个是ResNet,其中HGNet就是我们…