《Linux内核设计与实现》第四章学习笔记——进程调度
《Linux内核设计与实现》第四章学习笔记——进程调度
姓名:高艺桐 学号:20135109
一、多任务
1、多任务操作系统的含义
多任务操作系统就是能同时并发地交互执行多个进程的操作系统。
- 无论在单处理器或者多处理器机器上,多任务操作系统都能使多个进程处于堵塞或者睡眠状态,也就是说,实际上不被投入执行,直到工作确实就绪。
- 相反,这些进程利用内核阻塞自己,直到某一事件(键盘输入、网络数据、过一段时间等)发生。
2、多任务操作系统的分类
- 非抢占式多任务
- 抢占式多任务
3、Linux的抢占式多任务模式
(1)抢占:强制的挂起动作
(2)时间片:分配给每个可运行进程的处理器时间段。有效管理时间片能使调度程序从系统全局的角度做出调度决定,这样做还可以避免个别进程独占系统资源。
(3)让步:进程主动挂起自己的操作
二、Linux的进程调度
1、O(1)调度程序
缺点:缺少交互进程
2、反转楼梯最后期限调度算法
优点:吸收了队列理论,引入公平调度的概念,“完全公平调度算法”
三、策略
1、I/O消耗型和处理器消耗型的进程
(1)I/O消耗型
- 指进程的大部分时间用来提交I/O请求或是等待I/O请求。因此,这样的进程经常处于可运行状态,但通常都是运行短短的一会儿。
- 举例:多数用户图形界面程序(GUI)、Unix系统、Linux
(2)处理器消耗型
- 处理器耗费型进程把时间大多用在执行代码上。除非被抢占,否则它们通常都一直不停地运行,因为它们没有太多的1/0 需求。
- 举例:无限循环执行,如sshkeygen 或者MATLAB
(3)特殊情况
- X Window 服务器既是I/O消耗型,也是处理器消耗型
- 平衡点:进程响应迅速(响应时间短)和最大系统利用率(高吞吐量)。
2、进程优先级
- 调度算法中最基本的一类就是基于优先级的调度,这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。
- 通常做法是是(其并未被Linux 系统完全采用)优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。
(1)使用nice值的优先级
- 范围是从-20 到+19,默认值为0 :越大的nice 值意味着更低的优先级
- Linux 系统中,nice值则代表时间片的比例
(2)实时优先级
- 其值是可配置的,默认情况下它的变化范围是从0到99(包括0和99)
- 越高的实时优先级数值意味着进程优先级越高
3、时间片
(1)时间片是一个数值,它表明进程在被抢占前所能持续运行的时间。
(2)在Linux操作系统中
- Linux 的CFS 调度器并没有直接分配时间片到进程,它是将处理器的使用比划分给了进程。
- 在Linux中使用新的CFS调度器,其抢占时机取决于新的可运行程序消耗了多少处理器使用比.如果消耗的使用比比当前进程小,则新进程立刻投入运行,抢占当前进程。否则,将推迟其运行。
四、Linux调度算法——完全公平调度(CFS)
1、相关概念
- 目标延迟:每个进程都按其权重在全部可运行进程中所占比例的“时间片”来运行,为了计算准确的时间片,CFS为完美多任务中的无限小调度周期的近似值设立了一个目标。而这个目标称作“目标延迟”,越小的调度周期将带来越好的交互性,同时也更接近完美的多任务。
- 最小粒度:当可运行任务数量趋于无限时,它们各自所获得的处理器使用比和时间片都将趋于0,造成了不可接受的切换消耗,CFS 为此引人每个进程获得的时间片底线,这个底线称为最小粒度。默认情况下这个值是lms。
2、决定因素
任何进程所获得的处理器时间是由它自己和其他所有可运行进程nice值的相对差值决定的。任何nice值对应的绝对时间不再是一个绝对值,而是处理器的使用比。
3、所属类型
针对普通进程的调度器类——允许多重不同的可动态添加的调度算法并存,调度属于自己范畴的进程
4、组成部分
- 时间记账
- 进程选择
- 调度器入口
- 睡眠和唤醒
五、Linux调度的实现
1、时间记账
一个进程的时间片被减少到0时,它就会被另一个尚未减到0的时间片可运行进程抢占。
- CFS使用调度器实体结构来追踪进程运行记账(定义在文件<linux/sched.h>的struct_sched _entity)
- CFS使用vruntime变量(虚拟实时)来记录一个程序到底运行了多长时间以及它还应该再运行多久,而且可以知道谁应该是下一个被运行的进程,以ns为单位
2、进程选择
红黑树是一种以树节点形式存储的数据,这些数据都会对应一个键值。Linux中,红黑树称为rb位时,它是一个自平衡二叉搜索树。
- 挑选下一个任务:CFS调度器选取所有进程中vruntime最小的那个进程为待运行的下一个进程(CFS调度算法的核心),对应的是树中最左侧的叶子节点,实现函数为__pick_next_entity()
- 向树中加入进程,发生在进程变为可运行状态(被唤醒)或通过fork()调用第一次创建进程时,由函数enqueue_entity()实现
- 从树中删除进程的动作发生在进程堵塞(变为不可运行态)或者终止时(结束运行),有辅助函数__dequeue_entity()完成
3、调度器入口
进程调度的主要入口点是函数schedule(),该函数中唯一重要的事就是调用pick_next_task()
4、睡眠和唤醒
(1)睡眠(被阻塞)——进程处于一个特殊的不可执行状态
- 常见原因:文件I/O
- 内核操作:进程把自己标记成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用schedule()选择和执行一个其他进程。
- 等待队列:由等待某些事件发生的进程组成的简单链表,内核用wake_queue_ head _t 来代表等待队列。可通过DECL成立WAITQUEUE ()静态创建,也可以由init_waitqueue _head()动态创建
(2)唤醒——唤醒指定的等待队列上的所有进程
- 唤醒操作通过函数wake_up()进行,它调用函数try_to_wake_up(),该函数负责将进程设置为TASK_RUNNING状态,调用enqueue_task()将此进程放入红黑树中
- 如果被唤醒的进程优先级比当前正在执行的进程的优先级高,还要设置need _resched 标志
- 注意虚假唤醒
六、抢占和上下文切换
1、抢占
(1)用户抢占
内核即将返回用户空间的时候,如果need_resched标志被设置,会导致schedule()被调用,此时会发生用户抢占
- 从系统调用返回用户空间时
- 从中断处理程序返回用户空间时
(2)内核抢占
每个进程的thread_info引人preempt_count计数器。该计数器韧始值为0,每当使用锁的时候数值加1,释放锁的时候数值减1。当数值为0的时候,内核就可执行抢占,具体发生在:
- 中断处理程序正在执行,且返回内核空间之前
- 内核代码再一次具有抢占性的时候
- 如果内核中的任务显式地调用schedule()
- 如果内核中的任务阻塞
2、上下文切换
- 一个可执行进程切换到另一个可执行进程
- 当一个新进程被选出来准备投入运行时,schedule()会调用context_switch()函数负责处理
七、实时调度策略
1、SCHED_FIFO
- 简单、先入先出
- 不使用时间片
- 如果SCHED_FIFO级进程处于可执行状态,就会一直执行,直到它自己受阻塞或显式地释放处理器为止
2、SCHED_RR
- 实时轮流调度算法:带有时间片的SCHED_FIFO
- 当SCHED_RR任务耗尽它的时间片时,同一优先级的其他实时进程被轮流调度
3、实时优先级范围默认为0-99
八、与调度有关的系统调用
1、与调度策略和优先级相关的系统调用
sched_setscheduler()和sched_getscheduler()分别用于设置和获取今后才能的调度策略和实时优先级。
2、与处理器绑定有关的系统调用
用户可以通过sched_setaffinity()设置不同的一个或几个位组合的位掩码,而调用sched_getaffinity()则返回房钱的cpus_allowed掩码。
3、放弃处理器时间
Linux通过sched_yield()系统调用,提供了一种让进程显式地将处理器时间让给其他等待执行进程的机制。
《Linux内核设计与实现》第四章学习笔记——进程调度的更多相关文章
- Linux内核设计与实现 第四章
1. 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程). 这个管理程序就是调度程序,功能: 决定哪些进 ...
- 《Linux内核分析》之第四章读书笔记
4.1多任务 多任务操作系统:同时并发地交互执行多个进程的操作系统 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于内存,但是并不处于可运行状态.这些进程利用内核堵塞自己,直到某一事件 ...
- 《Linux内核设计与实现》第四章学习笔记
<Linux内核设计与实现>第四章学习笔记 ——进程调度 姓名:王玮怡 学号:20135116 一.多任务 1.多任务操作系统的含义 多任务操作系统就是能同时并发地交 ...
- 《Linux内核设计与实现》第四周读书笔记——第五章
<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...
- linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍
<linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功 ...
- 《Linux内核设计与实现》Chapter 3 读书笔记
<Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...
- 《Linux内核设计与实现》Chapter 1 读书笔记
<Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...
- 《Linux内核设计与实现》Chapter 2 读书笔记
<Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...
- 《Linux内核设计与实现》Chapter 5 读书笔记
<Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...
随机推荐
- 洛谷 P4707 【重返现世】
题目分析 题目就是求第K种原料的出现期望时间. 考虑广义min-max容斥. \(\text{kthmax}(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\bin ...
- 【洛谷】【最小生成树】P1195 口袋的天空
[题目背景:] 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. [题目描述:] 给你云朵的个数N,再给你M个关系,表示哪些 ...
- 测试udp服务的端口是否可用
测试tcp服务的端口是否可用,可以使用: telnet ip port 但是如果这个用在upd服务上,就会报错, 因为telnet走的是tcp协议, 比如说192.168.80.131在8888端 ...
- Oracle create tablespace 创建表空间语法详解
CREATE [UNDO] TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ...... ...
- 配置typeAliasesPackage支持通配符包路径扫描
mybatis的xml文件中需要写类的全限定名,较繁琐,可以配置自动扫描包路径给类配置别名,两种配置方式. 方式一: mybatis-config.xml中配置 <typeAliases> ...
- jsp el的内置对象
一.el内置对象(11个): pageScope (掌握) requestScope (掌握) applicationScope (掌握) sessionScope (掌握) param (了解) p ...
- 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明
程序发布后出现问题: 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明 解决办法: 1.安装了odac12. ODTwithODAC121010.z ...
- 提高SQL查询效率的30种方法
转载:提高SQL查询效率的30种方法 内容摘录如下: 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中 ...
- 对寄存器ESP和EBP的一些理解
PS:EBP是当前函数的存取指针.即存储或者读取数时的指针基地址:ESP就是当前函数的栈顶指针. 每一次发生函数的调用(主函数调用子函数)时,在被调用函数初始时,都会把当前函数(主函数)的EBP压栈, ...
- 2.2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——列表
也许最常用的Unix命令是ls了,它是'list'的简写(Listing 8) Listing 8 用ls以列表的形式显示文件和目录(内容输出跟各自电脑有关) $ ls Desktop Downloa ...