进程调度

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. zabbix监控VMware6.7

    1.登录VMwareweb页面 管理--高级配置启用:Config.HostAgent.plugins.solo.enableMob 2.测试(记住这个UUID) https://10.155.0.8 ...

  2. pb中遍历查询数据库数据问题(数据库为 sql server)

    指针可以实现但是不推荐 例如:(部分代码) for ll_a = 1 to ll_count    ll_b = ll_i +  ll_a  //插入行行号先下移一位    dw_main.inser ...

  3. Python 使用 xlwings 往 excel 中写入一行数据的两种方法

    该方法跟上一篇写入一列的方法相反,代码如下: # -*- coding:utf-8 -*- import xlwings as xw list1 = [1,2,3,4,5] list2 = [[1], ...

  4. Python程序的编写方式

    直接在Python的交互式环境编写代码 现在,了解了如何启动和退出Python的交互式环境,我们就可以正式开始编写Python代码了. 在写代码之前,请千万不要用“复制”-“粘贴”把代码从页面粘贴到你 ...

  5. centos7下安装docker(12.3容器之间的连通性)

    我们接着盗图,如下: 在这张图上,可以看到,如果两个容器使用同一个bridge,那么两个容器之间是互相能通的 可以看到两个容器在同一个bridge下是可以互相ping通的 当两个容器在不同的bridg ...

  6. CSS3中和动画有关的属性transform、transition 和 animation

    CSS3中和动画有关的属性有三个  transform. transition 和 animation.下面来一一说明:        transform     从字面来看transform的释义为 ...

  7. api接口简短实力

    无参数传递 public function actionJiekou(){ $url = 'http://wap.guoshihui.com/_static/wap/video/startVideo. ...

  8. Qt 编程指南 4 单行编辑控件

    从 Qt 设计师界面可以看到常用的 Qt 文本编辑和浏览控件,包括四个: 其中单行编辑控件 QLineEdit 和 普通文本编辑控件 QPlainTextEdit 都是针对最普通的 C++ 字符串编辑 ...

  9. 转载 jQuery和js自定义函数和文件的方法(全网最全)

    jQuery和js自定义函数和文件的方法(全网最全)    版权声明:本文为像雾像雨又像风_http://blog.csdn.net/topdandan的原创文章,未经允许不得转载. https:// ...

  10. Java部署环境搭建(Linux)

    环境搭建必须jdk.tomcat.mysql(基础) 额外的软件包项目中可能用到 jdk:它包含jre和开发所需完整类库. tomcat:它是一个web容器,项目通常往webapps下扔,便于外界访问 ...