转自: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. docker和K8s对应参数

    创建 Pod 时设置命令及参数 创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数.如果要设置命令,就填写在配置文件的 command 字段下,如果要设置命令的参数,就填写在配置文件的  ...

  2. docker镜像中文件丢失

    背景介绍 笔者创建了一个镜像,然后在不同的主机上启动,发现有的能启动,有的却不行,报错信息为找不到文件. 犹记得当初有人介绍,只要docker镜像做好了,拿到任何地方都可以用,此处好像不成呢,好诡异的 ...

  3. 学习JAVAWEB第十八天

    今天解决了登录过程中的数据库连接池的一些问题,如本地服务器不能被访问,主要是连接池的配置文件的问题 明天做一个htm页面,不同用户的不同html页面

  4. Linux 配置 SVN and ideal 配置SVN的客户端 ?

    Linux 配置 SVN? 4.配置svn(服务器端) 项目管理工具(subversion),每个公司都会用到(git/svn) 目的就是为了合作开发 4.1.从linux上安装svn 不需要从官网下 ...

  5. django入门 03 模板语法

    变量值从views.py传入html 基本语法 {{ abc }} 变量abc外,用双大括号包裹 {% for item in abc %} 语句外,用大括号+百分号包裹 1. 传递字符串 views ...

  6. springboot加载外部配置文件

    网上搜集和整理如下(自己已验证过) 1. war包在tomcat中加载外部配置文件 war包运行在独立tomcat下时,如何加载war包外部配置application.properties,以达到每次 ...

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

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

  8. bash_profile和bashsrc的区别

    感谢大佬:http://unclealan.cn/index.php/system/128.html 描述 在类Linux或者MACOS系统中,家目录(用户目录)中我们会看到,.bash_profil ...

  9. Function.prototype.bind、call与apply

    学习Function.prototype.bind.call与apply时,看到一篇博客,学到一些内容,但由于博客时间太久,根据官方文档对内容进行一些修正:下文为修正过内容 前言 前段时间面试遇见一题 ...

  10. 关于linux shell编程,alias rm='cp $@ ~/backup; rm $@'

    书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp $@ ~/backup; ...