转自:https://zhuanlan.zhihu.com/p/38046313

这一章主要是介绍几个简单的调度器策略。内容比较简单,就简单汇总下。

首先我们对现有的计算机环境有如下几个假设:

1.每个job都运行相同的时间。

2.所有的job都同时准备好运行

3.一旦一个job启动,那么他就会一直运行到结束。

4.所有的job都不会有I/O

5.每个job运行的时间都是可知的。

我们先引入一个效率的测量值:turnaround time

Tturnaround = Tcompletion − Tarrival
也就是任务完成时间点减去任务到达内存可以运行的时间点

一个测量反应时间的:

Tresponse = Tfirstrun − Tarrival
也就是任务第一次开始运行的时间点减去任务到达的时间点。

首先第一个策略是先入先出(First In, First Out (FIFO)),就是谁先到谁先运行。

这个是一个例子,有三个任务A,B,C,我们计算对应的turnaround time为10+20+30/3=30但是如果运行时间长的任务先到,那么turnaround time就会很高,比如这个例子,

因为任务A执行时间太长,导致turnaround time为100+110+120/3=110。因此引入了下一个策略:短任务先执行(Shortest Job First (SJF))。这样会减少turnaround time。但是如果我们放开所有任务同时到达的假设,如果是长任务先来那么就还是有问题,因此引入下一个策略:运行时间短的先执行(Shortest Time-to-Completion First (STCF))。但是如果运行时间不确定那还是有问题,进一步引入了新的策略:循环执行(Round Robin)。这种策略不是让一个任务从开始执行一直到结束,而是将任务划分为固定时间的一个一个时间片,然后顺序执行,

这样对应的response time会比较好,但是turnaround time会很糟糕,可以从上面的2个对比中看出来。另外RR的这种方式还会带来任务间切换的消耗变多。而且如果进程中有I/O的时候,会导致很大的时间浪费,因此就引出了下个章节的内容:多级反馈队列(multi-level feedback queue);

1.MLFQ的的规则

我们会有一些队列,不同的队列对应不同的优先级.对于队列中的进程,调度的规则如下:

(1)如果Priority(A) > Priority(B),那么A运行。

(2)如果Priority(A) = Priority(B),那么A,B按照Round-Robin方式运行。

(3)当一个任务创立的是时候,它在最高的优先级中

(4a)如果一个任务执行的时候消耗了整个时间片,那么降低优先级

(4b)如果一个任务主动放弃cpu的执行时间,那么保持优先级不变

上面的规则所构成的调度规则,会有如下的问题:

(1)如果有很多的job是交互性的,那么会导致那些需要大量cpu时间的job无法运行

(2)不公平性。如果有些job写的时候故意在时间片的最后一点时间放弃cpu,那么他就可以一直保持一个高优先级的状态。

(3)上面的规则只规定了job的优先级下降,但是如果一个job 从耗费cpu变为了交互性,它的优先级也是没办法提高的。

所以对上面的规则又新增了一些规则:

(5)经过一个时间S后,将所有的任务都调整到权限最高的队列。

(6)对规则4a和4b进行修改,一个job使用完该等级上的时间后,就会降低它的优先级。

上面的这些规则中包含了很多的设置内容,比如队列的个数,时间片的时间,调整所有低优先级job的时间,每个队列对应的时间为多少等等,这些都是具体在实现MLFQ的时候需要考虑的,一个好的建议是这些数值能够可配置化,避免写死。

上面介绍的调度策略在多核的时代还能不能适用呢?

首先什么是多核,就是因为单核的速度无法提升,所以只能以增加核心的方式来提升cpu 的速度。而且需要注意的是每个核心都有对应的缓存,所以这个会导致缓存不一致的情况。另外还需要考虑的就是并发的问题,这个可以通过加锁机制来完成。另外对于多核来说,会带来一个新的问题,那就是缓存关联性(Cache Affinity)。也就是说,如果一个进程如果能够一直运行在一个核上,那么就可以利用高速缓存来提高运行的效率,反之运行速度就会低下。

对于多核的OS调度机制,可以有两种方案,一种是单个调度队列(SQMS:single queue multiprocessor scheduling),一种是每个核一个调度队列(multi-queue multiprocessor scheduling (or MQMS))。

SQMS的优势在于能够简单,能够直接应用之前的调度代码。弊端也显而易见,首先是效率的问题,因为一个队列表示需要大量的锁操作来实现对数据的正确访问。其次缓存关联性问题也很突出,不过也有一些解决方案,比如固定一些进程只在某个核上跑,另外的则在多个核之前轮转的运行。

MQMS对于每个核都有一个调度的队列,这保证了扩展性,并发不是公用锁,所以效率也得到提升。但是会牵扯出负载均衡的问题。首先是怎么决定新生成的进程应该属于哪个队列,其次是如果核之间的任务数量失衡,怎么补救。第一个问题我们用启发式的方法决定,第二个可以使用进程在队列间的移动。再来个问题,每个核如何发现其他核的情况呢,那么肯定就需要去访问对应核的内核数据结构,这个频率不应该太高,也不应该太低,具体的就需要在实现的时候考虑了。所以实际的策略实现中,都需要大量的trade-off,因为在实际的场景中,没有一个最优的答案,有的只是不断探索然后将方案做到尽可能好。

最后对于linux来说,对多核是有多个调度器策略的。O(1), CFS , BFS,这个就不做介绍了。

(转载)虚拟化(3):os调度策略。的更多相关文章

  1. [转载]虚拟化之KVM配置

    虚拟化之KVM配置 2017-11-06 [TOC] 虚拟化:通过虚拟化工具把cpu,内存,硬盘等真实硬件资源给模拟成更少的虚拟硬件资源.进行虚拟化的好处是,最大限度的利用硬件资源.也是云计算的基础. ...

  2. (转载)《Three easy pieces 》虚拟化部分整体介绍

    转载自知乎:https://zhuanlan.zhihu.com/p/37917910 一个程序在运行的时候发生了什么呢? 其实只是一些非常简单的事情:运行指令.处理器从内存中取出指令,译码然后执行. ...

  3. 关于Linux虚拟化技术KVM的科普 科普三(From OenHan)

    http://oenhan.com/archives,包括<KVM源代码分析1:基本工作原理>.<KVM源代码分析2:虚拟机的创建与运行>.<KVM源代码分析3:CPU虚 ...

  4. 【转载】如何在Ubuntu上安装LAMP服务器系统?

    转载自:http://os.51cto.com/art/201307/405333.htm [2013年7月25日 51CTO外电头条]为何应该在Ubuntu上安装LAMP服务器?从事Web开发工作时 ...

  5. <Mastering KVM Virtualization>:第一章 了解Linux虚拟化

    本章为读者提供了Linux虚拟化中流行技术的深刻见解,以及相较于其他同类技术的优势特点.本书共有14章,囊括了KVM虚拟化中的各个方面,从KVM的内部构造开始,并包括了诸如软件定义网络(SDN),性能 ...

  6. 从内存管理原理,窥探OS内存管理机制

    摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...

  7. 腾讯TencentOS 十年云原生的迭代演进之路

    导语 TencentOS Server (又名 Tencent Linux 简称 Tlinux) 是腾讯针对云的场景研发的 Linux 操作系统,提供了专门的功能特性和性能优化,为云服务器实例中的应用 ...

  8. Linux Cgroups详解(一)

    [转载]http://blog.chinaunix.net/uid-23253303-id-3999432.html Cgroups是什么? Cgroups是control groups的缩写,是Li ...

  9. Linux 读书笔记 二

    一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 若不小心登出后,直接刷新页面即可 2. 环境使用 完成实验后可以点击桌面上方的“实验截图”保存并分 ...

随机推荐

  1. pycharm 安装插件

    1.使用pip安装插件 pip安装指定版本的插件: pip install openpyxl==2.6.2 -i https://pypi.doubanio.com/simple/ -i后面跟的是&q ...

  2. cloudcompare备忘录(1)

    1.找点 然后直接在需要的位置上点就会出现这个点的信息了~! 2.想看一个三d的切面时候 先选中切的目标 点击小剪刀~ 点击鼠标左键四次来框选,然后点击鼠标右键确认 再点击这个按钮就切好了

  3. ApacheCN PHP 译文集 20211101 更新

    PHP 入门指南 零.序言 一.PHP 入门 二.数组和循环 三.函数和类 四.数据操作 五.构建 PHP Web 应用 六.搭建 PHP 框架 七.认证与用户管理 八.建立联系人管理系统 使用 PH ...

  4. js-reduce方法源码

    // 数组中的reduce方法源码复写 //先说明一下reduce原理:总的一句,reduce方法主要是把数组遍历, //然后把数组的每个元素传入回调函数中,回调函数怎么处理,就会的到什么样的效果 A ...

  5. CentOS-7部署Docker容器

    为了适应当前容器化的部署方式,故最近也在对docker进行学习.目前的理解是docker服务就像一艘货船,而你的各项服务可以封装在一个个集装箱里,而且在docker里服务的启动非常快,故有必要从基础的 ...

  6. 设置程序启动时加载的storyboard

    这个设置表明:程序启动时会加载Main.storyboard

  7. iOS 模糊、精确搜索匹配功能方法总结 By HL

    字符串搜索主要用于UITableView的搜索功能的筛选,过滤,查询 下面是一些流行的搜索查询方法 一.遍历搜索 for循环 根据要求:精确搜索(判读字符串相等)   模糊搜索(字符串包含) 相关知识 ...

  8. iOS 七大手势之轻拍,长按,旋转手势识别器方法-赵小波

    一.监听触摸事件的做法 如果想监听一个view上面的触摸事件,之前的做法通常是:先自定义一个view,然后再实现view的touches方法,在方法内部实现具体处理代码 通过touches方法监听vi ...

  9. Net6 DI源码分析Part4 CallSiteFactory ServiceCallSite

    Net6 CallSiteFactory ServiceCallSite, CallSiteChain abstract class ServiceCallSite ServiceCallSite是个 ...

  10. nodejs串行有关联

    var async = require('async'); //串行无关联series//串行有关联waterfallasync.waterfall([ function(cb) { setTimeo ...