进程调度

4.1多任务

  1.多任务系统可以划分为:非抢占式多任务和抢占式多任务;

  (在此模式下,由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会,这个动作叫抢占;

   时间片实际上是分配给可运行进程的处理器时间段 )

  (在非抢占多任务模式下,除非进程自己主动停止运行,否则它会一直执行,进程主动挂起自己的操作叫做让步;)

  2.进程通常做出让步,以便有很多处理时间,但是这种机制有很多缺点:

    调度程序无法对每个进程该执行多久时间做出统一规定,所以进程独占的处理器时间可能超过用户的预料;

    一个绝不让步的悬挂就能使系统崩溃

4.2Linux的进程调度

  一种叫做O(1)调度程序

4.3策略

  调度器的策略往往决定系统的整体印象。而且负责优化使用处理器时间

  1.进程可以分为两个类型:I/O消耗型 和处理器消耗型;

    前者是指进程的大部分时间用来提交I/O请求或者等待请求,这样的进程经常处于可运行状态,但是时间很短,因为要等待更多I/O请求时,最后会阻塞;

    后者是指进程把大部分时间用在执行代码上,除非被抢占,否则他们一直在不停的运行,因为没有太多的I/O需求;

  2.调度策略通常要在两个矛盾的目标中间寻找平衡:进程响应迅速和最大系统系统利用率

  3.调度算法中一类是基于优先级的调度:调度程序总是选择时间片未用尽而且优先级最高的进程。用户和系统设置进程的优先级来影响系统的调度;    Linux两种不同的优先级范围。第一种是nice值,范围从-20到+19,默认值为0;越大的nice值意味着更低的优先级;在Linux中,nice值代表时间片的;      第二种是实时优先级,其值是可配置的,默认情况下它的变化范围是从0到99,与nice值不同,越高的实时优先级数值意味着进程优先级越高;

  4.时间片是一个数值,它表明进程被抢占前能持续运行的时间;

    时间片过长会导致系统对交互的响应欠佳,让人觉得系统无法并发执行应用程序;  

    时间片过短会明显增大进程切换带来的处理器耗时,因为肯定会有相当一部分系统时间用在进程切换上,而这些进程能够用来运行的时间片却很短。

    I/O消耗型号不需要长的时间片,而处理器消耗型的进程则希望越长越好.

4.4Linux调度算法

  1.Linux调度器是以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选择调度算法;

    这种模块化结构被称为调度器类,它允许多种不同的可动态添加的调度算法并存,调度属于自己的范畴的进程

  2.完全公平CFS,是一个针对普通进程的调度类,在Linux中称为SCHED_NORMAL,CFS算法实现定义在文件kernel/sched_fair.c中

  3.unix系统中的进程调度

  4.公平调度:

    CFS的做法是允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行进程,而不再采用分配给每个进程时间片的做法,CFS在所有可运行进程总数进程计算出一个进程应该运行多久,而不是依靠nice值来计算时间片;

    *越高的nice值进程获得越低的处理器使用权重,这是相对默认nice值进程而言的;相反,更反的nice值的进程获得更高的处理器使用权重

  5.CFS为此引入每个进程获得的时间片底线,这个底线称为最小粒度、默认情况下就是1ms

  6.任何进程所获得的处理器时间是由它自己和其他所有可运行进程nice值的相对差值决定的,nice值对时间片的作用不再是算数加权,而是几何加权,任何nice值对应的绝对时间不再是一个绝对值,而是处理器的使用比;CFS称为公平调度是因为确保给每个进程公平的处理器使用比,CFS不是完美的公平,

4.5Linux调度的实现

1.时间记账

  CFS使用调度器实体结构(定义在<linux/sched.h>的struct_sched_entity)来追踪进程运行记账;

  vruntime变量存放进程的虚拟运行时间,该运行时间的计算是经过了所有可运行进程总数的标准化,因此可用此变量来记录一个程序到底运行了多少时间以及还将运行多久

2.进程选择

  CFS调度算法的核心:选择具有最小vruntime的任务

  红黑树:挑选下一个任务;向树中加入进程;从树中删除进程

3.调度器入口

  调度器的主要入口点是函数schedule(),它定义在文件kernel/sched.c中。它正是内核其他部分用于调用进程调度器的入口

4.睡眠和唤醒

  休眠的进程处于一个特殊的不可执行的状态.

   1、等待队列

      休眠通过等待队列进行处理。等待队列是由等待某些事件发生的进程组成的简单链表;内核用wake_queue_head_t来代表等待队列;函数inotify_read(),负责从通知文件描述符中该读取信息,它的实现无疑是等待队列的典型用法。

   2、唤醒

      唤醒操作通过函数wake_up()进行,它会唤醒指定的等待队列上的所有进程

4.6抢占和上下文切换

  上下文切换,也就是从一个可执行进程切换到另一个可执行进程,由定义kernel/sched.c中的context_switch()函数负责处理

  1.用户抢占:从系统调用返回用户空间

        从中断处理程序返回用户空间

  2.内核抢占:中断处理程序正在执行,且返回内核空间之前

        内核代码再一次具有可抢占性的时候

        如果内核中的任务显式地调用schedule()

        如果内核中的任务阻塞(这样也会导致调用schedule())

4.7实时调度策略

  1.两种实时调度策略:sched_fifo和sched_RR;前者实现了一种简单、先入先出的调度算法:它不使用时间片;而后者尽量事先分配给它的时间后就不能再继续执行了。

4.8与调度相关的系统调用

   

    

读书笔记(chapter4)的更多相关文章

  1. 《Linux内核设计与实现》 Chapter4 读书笔记

    <Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子 ...

  2. 读书笔记-Coding faster(英文版)

    读书笔记-Coding faster(英文版) Getting More Productive with Microsoft visual Studio Author: Zain Naboulsi S ...

  3. 读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit

    读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit Author: Andrew Hunt ,David Thomas with Matt ...

  4. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  5. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  6. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  7. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  8. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  9. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

  10. LOMA280保险原理读书笔记

    LOMA是国际金融保险管理学院(Life Office Management Association)的英文简称.国际金融保险管理学院是一个保险和金融服务机构的国际组织,它的创建目的是为了促进信息交流 ...

随机推荐

  1. 在同一个服务器(同一个IP)为不同域名绑定的免费SSL证书

    越来越多的浏览器不在支持http协议了,这就要求你为你的网站必须绑定SSL证书.谷歌浏览器也将要在今年取消对http协议的支持,申请CA证书迫在眉睫.我购买有两个域名,一个虚拟机,没事鼓捣鼓捣,图个乐 ...

  2. linux内网IP如果判断出网IP地址

    [root@jumpserver ~]# curl https://ip.cn当前 IP: 162.14.210.16 来自: 河南省郑州市 xx网络

  3. 关于UIPageViewController那些事

    一.前言 这些天有新生问及UIPageViewController这个视图控制器,自己原来没有用过,所以就看了一下相关的知识,就写了下来,分享一下经验. 主要的关于这个控制器的内容就从例子中去解说了. ...

  4. [Tomcat]The JRE_HOME environment variable is not defined correctly

    在tomcat的bin目录下,双击startup.bat,闪一下,就没了,后来仔细看了一下黑屏闪的内容如下: the JRE_HOME environment variable is not defi ...

  5. 解决HTTP status code is not handled or not allowed

    /Books/>: HTTP status code is not handled or not allowed 2017-11-04 17:21:38 [scrapy.spidermiddle ...

  6. oc kvc的模式:匹配搜索模式(模式匹配)、装包解包

    按照一定规则使用匹配模式在目标空间进行搜索,然后执行相应操作: 运行时系统将kvc的运行机制解释为模式匹配,将值的兼容性问题解释为装包解包问题 一.模式匹配 The default implement ...

  7. javascript中apply()和call()方法及区别

    call()和apply()方法 1.方法定义 call方法: 语法:obj.call(thisObj, arg1, arg2, ...); 定义:调用一个对象的一个方法,以另一个对象替换当前对象. ...

  8. DStream算子讲解(一)

    先把目录列好,方便有条理的进行整理

  9. 【Odoo 8开发教程】第二章:Odoo生产环境部署设置

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/10792977.html 一:dbfilter 数据库访问规则设置 一个odoo实例可以连接到不同的数据库实例中 ...

  10. day20 Python 高阶函数,函数,嵌套,闭包 装饰器

    高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): ...