《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 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...
随机推荐
- 软工实践——团队作业需求规格说明书——原型UI设计
登录界面 还包含忘记密码和注册的功能 注册界面 注册成功后会有弹窗提示,且一个手机号只能注册一次. 忘记密码界面 通过手机收到的验证码更改密码. 项目界面 登陆之后的页面就是这个项目界面.在拥有的界面 ...
- CSS3 新增的文本属性
一.CSS1&2中的文本属性(W3C标准) text-indent CSS1 检索或设置对象中的文本的缩进 letter-spacing CSS1 检索或设置对象中的文字之间的间隔 word- ...
- 2018.4.26 Mac安装Redis5.0.3版本服务器
Mac安装Redis服务器 安装 1.到官网下载 选择稳定版本 打开官网:https://redis.io/ 2.下载完成后,打开命令行工具,执行解压命令 tar zxvf redis-5.0.3.t ...
- 利用 share code 插件同步代码片段
利用 Settings Sync可以同步 VS code 配置,但它只能同步插件,利用 Settings Sync 再配合 share code 插件可以同步自定义代码片段,可以把 VS code ...
- single number和变体
给array of integers. 裡面有一个数字是单独出现 其他都会出现两次(而且一起出现)ex: [1,2,2,3,3]要判断哪个数字是单独出现的. 以这个例子的话就是 1 LZ 一开始先说 ...
- Python2.7-浙江省实时天气爬取
先对中国天气网的实时天气数据进行了研究,数据在http://www.weather.com.cn/weather1d/101010100.shtml中,可以通过城市代码进行爬取,但实况数据是用JS动态 ...
- 写脚本时出现: Permission denied
例如对文件 remove.sh sudo chmod -R 777 remove.sh
- HDU 2767 Proving Equivalences(至少增加多少条边使得有向图变成强连通图)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 用python2.7.9 写个小程序搜索某个目录下行有某关键字
# -*- coding: utf-8 -*-import sysreload(sys)sys.setdefaultencoding("utf-8")import os def p ...
- ceph状态信息靠谱查询
1)检查集群的状态汇总信息: [root@haha1 clouder]# ceph -s cluster 8e136e25-77ab-4e0b-b24b-232a7b466cfe health HEA ...