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

调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统。

一、多任务

多任务操作系统就是能同时并发地交互执行多个进程的操作系统。

多任务系统可以划分为两类:

  • 非抢占式多任务

    • 进程会一直执行直到自己主动停止运行
  • 抢占式多任务
    • Linux/Unix使用的是抢占式的方式;强制的挂起进程的动作就叫做抢占。

像所有unix的变体和许多其他现代操作系统一样,Linux提供了抢占式的多任务模式。

进程的时间片:进程在被抢占之前能够运行的时间是预先设置好的。

二、Linux 的进程调度

O(1)调度器虽然在拥有数以十计(不是数以百计)的多处理器的环境下尚能表现出近乎完美的性能和可扩展性,但是时间证明该调度算法对于调度那些响应时间敏感的程序却有一些先天不足,这些程序我们称其为交互进程一它无疑包括了所有需要用户交互的程序。

因此:

O(1)调度程序虽然对于大服务器的工作负载很理想,但是在有很多交互程序要运行的桌面系统上则表现不佳,因为其缺少交互进程,自2.6内核系统开发初期,开发人员为了提高对交互程序的调度性能引入了新的进程调度算法,其中最为著名的是“反转楼梯最后期限调度算法,该算法吸取了队列理论,将公平调度的概念引入了Linux调度程序。并且最终在2.6.23内核版本中替代了O(1)调度算法,它此刻被称为“完全公平调度算法”,或者简称CFS。

三、策略

1.I/O消耗型和处理器消耗型的进程

  1. I/O消耗型进程

    • 进程的大部分时间用来提交I/O请求或者等待I/O请求
    • 多数用户图形界面(GUI)都属于I/O密集型
  2. 处理器耗费型
    • 时间大多数用在执行代码上
    • 例如MATLAB
    • 往往要延长运行时间并降低调度频率

2.进程优先级

调度算法中最基本的一类就是基于优先级的调度,这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。

通常做法:

优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。

优先级分为两类:

  • 第一种是用nice值(―20~+19)

    • 默认值为0;数值越大意味着优先级越低;可以通过 ps-el查看系统进程列表并找到NI标记列对应的优先级
  • 第二种范围是实时优先级(0~99):

    • 越高的实时优先级级数意味着进程优先级越高

3.时间片

时间片:一个数值,它表明进程在被抢占前所能持续运行的时间。

调度策略必须确定一个默认的时间片。

Linux的CFS调度器并没有直接划分时间片到进程,而是将处理器的使用比例划分给了进程。

4.调度策略的活动

四、Linux调度算法

1.调度器类

Linux调度器是以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选择调度算法。这种模块化结构被称为调度器类。允许不同类型的进程可以有针对性地选择调度算法

调度器类允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程。

调度器代码会按照优先级顺序遍历调度类,拥有一个可执行进程的最高优先级的调度器类胜出,去选择下面要执行的那一个程序。

2.Unix 系统中的进程调度

将nice值映射到时间片的话,就必须将nice值对应到处理器的绝对时间。

3.公平调度

进程调度的效果应如同系统具备―个备一个理想中的完美多任务同时,我们可以调度给它们无限小的时间周期,所以在任何可测量周期内,我们给予一个进程中每个进程同样多的运行时间。

5、Linux调度的实现

1.时间记账

所有的调度器都必须对进程运行时间做记账。

多数Unix系统,分配一个时间片给每一个进程。那么当每次系统时钟节拍发生时,时间片都会被减少一个节拍周期。

2.进程选择

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

具体做法:利用红黑树rbtree(以节点形式存储数据的二叉树)

  • 选择下一个任务
  • 向树中加入进程
  • 从树中删除进程

3.调度器入口

进程调度的主要入口点是schedule(),它定义在文件kernel/sched.c中。

这一函数最重要的工作就是调用pick_next_state(),依次检查每一个调度类,并从最高优先级的调度类中,选择最高优先级进程。

4.睡眠和唤醒

休眠(被阻塞)的进程处于一个特殊的不可执行状态。

进程休眠的原因:

  • 事件可能是一段时间从文件读更多数据
  • 或者是某个硬件事件
  • 还有可能在尝试获取一个已被占用的内核信号量时被迫进入休眠
  • 一个常见原因就是文件I/O——如进程对个文件执行了read()操作,而这需要从磁盘里读取
  • 进程在获取键盘输入的时候也需要等待
  • 无论哪种情况,内核的操作都相同:进程把自己标记成休跳态,从可执照课树黑树中移出,放入等待队列,然后调用schedule()选择和执行―个其他进程
  • 唤醒的过程刚好相反:进程被设置为可执行状态,然后再从等待队列中移到可晰红黑树中。

六、抢占和上下文切换

1.用户抢占

内核无论是在中断处理程序还是在系统调用后返回,都会检查need_resched标志,如果它被设置了,那么,内核会选择一个其他(更合适的进程投入运行。从中断处理程序或系统调用返回的返回路径都是跟体系结构相关的,在entry.S(此文件不仅包含内核入口部分的程序,内核退出部分的相关代码也在其中)文件中通过汇编语言来实现。

产生用户抢占的情况:
  • 从系统调返回用户空间时
  • 从中断处理程序返回用户空间时

2.内核抢占

Linux完整地支持内核抢占,在不支持内核抢占的内核中,内核代码可以一直执行,到它完成为止。
调度程序没有办法在一个内核级的任务正在执行的时候重新调度——内核中的各任务是以协作方式调度的不具备抢占性。

七、实时调度策略

软实时:内核调度进程,尽力使进程在它的限定时间到来前运行,但内核不保证总能满足这些进程的要求

硬实时:系统保证在一定条件下,可以满足任何调度的要求。

八、与调度相关的系统调用

1.与调度策略和优先级相关的系统调用

  • sched_setscheduler()和 sched_getscheduler()分别用于设置和获取进程的调度策略和实时优先级。与其他的系统调用相似,它们的实现也是由许多参数检查、初始化和清理构成的。其实最重要的工作在于读取或改写进程task_struct的policy和rt_priority的值。
  • sched_setscheduler()和 sched_getscheduler()分别用于设置和获取进程的实时优先级。这两个系统调用获取封装在sched_param特殊结构体的rt_priority中。实时调度策略的的最大优先级:是MAX_ USERRT_PRIO减1。最小优先级等于1。
  • 对于―个普通的进程,nice函数可以将给定进程的静态优先级增加一个给定的量。只有超级用户才能在调用它时使用负值,从而提高进程的优先级。nice函数会调用内核的set_user_nice函数,这个函数会设置进程的的task_struct的static_prio值。

2.与处理器绑定有关的系统调用

Linux调度程序提供强制的处理器绑定机制。

3.放弃处理器时间

Linux通过sched_yield()系统调用,提供了一种让进程显式地将处理器时间让给其他等待执行进程的机制。

九、小结

进程调度程序是内核重要的组成部分,但是,满足进程调度的各种需要绝不是轻而易举的。

  • 很难找到“一刀切”的算法既适合众多的可运行进程
  • 具有可伸缩性
  • 可调度周期和吞吐量之间求得平衡
  • 满足各种负载的需求

Linux内核的新CFS调度程序尽量满足了各个方面的需求,并以较完善的可伸缩性和新颖的方法提供了最佳的解决方案。

《Linux内核设计与实现》 Chapter4 读书笔记的更多相关文章

  1. 《Linux内核设计与实现》读书笔记 - 目录 (完结)

    读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...

  2. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块

    本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...

  3. 《Linux内核设计与实现》读书笔记(十九)- 可移植性

    linux内核的移植性非常好, 目前的内核也支持非常多的体系结构(有20多个). 但是刚开始时, linux也只支持 intel i386 架构, 从 v1.2版开始支持 Digital Alpha, ...

  4. 《Linux内核设计与实现》读书笔记 - 目录 (完结)【转】

    转自:http://www.cnblogs.com/wang_yb/p/3514730.html 读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!! ...

  5. 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...

  6. 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/10/3070373.html 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务 ...

  7. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

  8. 《Linux内核设计与实现》读书笔记——第五章

    <Linux内核设计与实现>读书笔记--第五章 标签(空格分隔): 20135321余佳源 第五章 系统调用 操作系统中,内核提供了用户进程与内核进行交互的一组接口.这些接口让应用程序受限 ...

  9. 《Linux内核设计与实现》读书笔记——第一二章

    <Linux内核设计与实现>读书笔记——第一二章 第一章 Linux内核简介 1.1 Unix的历史 简洁:仅提供系统调用并有一个非常明确的设计目的. 抽象:Unix中绝大部分东西都被当做 ...

  10. 《Linux内核设计与实现》读书笔记(八)- 中断下半部的处理

    在前一章也提到过,之所以中断会分成上下两部分,是由于中断对时限的要求非常高,需要尽快的响应硬件. 主要内容: 中断下半部处理 实现中断下半部的机制 总结中断下半部的实现 中断实现示例 1. 中断下半部 ...

随机推荐

  1. Effective Java 47 Know and use the libraries

    Advantages of use the libraries By using a standard library, you take advantage of the knowledge of ...

  2. Nodejs断言测试

    var assert = require('assert');/*node中,我们可以使用assert模块来测试代码.equal()和notEqual()分别作相等性和不等性的判断,第一个参数是期望值 ...

  3. PL/SQL之--变量

    一.PL/SQL 简介 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是oracle对sql语句的一种扩展,在普通SQL语句的使用上 ...

  4. SSL certificate problem unable to get local issuer certificate解决办法

    SSL certificate problem unable to get local issuer certificate 解决办法: 下载:ca-bundle.crt 将它放在自己的wamp或者x ...

  5. 深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题

    一.概述   定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型.类加载和连接的过程都是在运行期间完成的. 二. 类的 ...

  6. uva 839 not so mobile——yhx

    Not so Mobile  Before being an ubiquous communications gadget, a mobile was just a structure made of ...

  7. MIT jos 6.828 Fall 2014 训练记录(lab 1)

    注: 源代码参见我的github:https://github.com/YaoZengzeng/jos Part 1: PC Bootstrap +------------------+ <- ...

  8. hdu-5920 Ugly Problem(贪心+高精度)

    题目链接: Ugly Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  9. 关于jQuery的一些实用代码

    (1)修改默认编码:(将默认的utf-8,修改为GB2312) $.ajaxSetup({ ajaxSettings:{contentType:"application/x-www-from ...

  10. 第23章 SEH结构化异常处理(3)_终止处理程序

    23.3 终止处理程序 23.3.1 程序的结构 (1)框架 __try{ //被保护的代码块 …… } __finally{ //终止处理 } (2)__try/__finally的特点 ①fina ...