Linux内核分析第四章读书笔记
第四章 进程调度
进程调度程序:确保进程能有效工作的一个内核子程序
决定将哪个进程投入运行,何时运行已经运行多长时间
进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统
原则:只要有可以执行的进程,那么就总会有进程正在执行
基本工作:在一组处于可运行状态的进程中选择一个来执行
4.1 多任务
多任务操作系统:能同时并发地交互执行多个进程的操作系统
多任务系统可划分成两类:非抢占式多任务,抢占式多任务
抢占:强制的挂起动作
进程的时间片:分配给每个可运行进程的处理器时间段
在非抢占式多任务模式下,除非进程自己主动停止运行,否则它会一直执行
让步:进程主动挂起的操作
缺点:调度程序无法对每个进程该执行多长时间做出统一规定
Unix一开始就采用的是抢占式的多任务
4.2 Linux的进程调度
O(1)调度器-->反转楼梯最后期限调度算法-->完全公平调度算法CFS
4.3 策略
4.3.1 I/O消耗型和处理器消耗型的进程
I/O消耗型:进程的大部分时间用来提交I/O请求或是等待I/O请求,但它等待的I/O请求最后总会阻塞
处理器消耗型:进程把时间大多用在执行代码上,除非被抢占,否则它们通常都一直不停地运行。极端例子:无限循环地执行
进程可以同时展示这两种行为
平衡量:进程响应速度(响应时间短),最大系统利用率(高吞吐量)
Unix系统的调度程序更倾向于I/O消耗型程序
4.3.2 进程优先级
基于优先级的调度:优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度
两种不同优先级范围
nice值:范围-20到+19,默认值为0,越大的nice值意味着更低的优先级,低nice值得进程可以获得更多的处理器时间
实时优先级:其值可配置,默认情况下变化范围0到99,越高的实时优先级数值意味着进程优先级越高
4.3.3 时间片
时间片:表明进程在被抢占前所能持续运行的时间
时间片过长导致系统交互的响应表现欠佳
时间片过短明显增大进程切换带来的处理器耗时
I/O消耗型不需要长的时间片,处理器消耗型的进程则希望越长越好
4.4 Linux调度算法
4.4.1 调度器类
Linux调度器是以模块方式提供的,目的:允许不同类型的进程可以有针对性嘚选择调度算法
调度器类,允许多种不同的可动态添加的调度算法并存。
每个调度器都有一个优先级,基础的调度器代码定义在kernel/sched.c文件中,按照优先级顺序遍历调度类
完全公平调度(CFS)是一个针对普通进程的调度类,在Linux中称为SCHED_NORMAL,定义在文件kernel/sched_fair.c
4.4.2 Unix系统中的进程调度
概念:进程优先级和时间片
时间片:进程运行多少时间
实质问题:分配绝对的时间片引发的固定的切换频率,给公平性造成了很大变数
CFS采用的方法是对时间片分配方式进行根本性的重新设计:完全摒弃时间片而是分配给进程一个处理器使用比重
4.4.3 公平调度
出发点:进程调度的效果应如同系统具备一个理想中的完美多任务处理器
每个进程将能获得1/n的处理器时间——n是指可运行进程的数量
给予n个进程中每个进程同样多的运行时间
首先要确保系统性能不受损失
CFS的做法是允许每个进程运行一段时间、循环轮转、运行最少的进程作为下一个运行进程
越高的nice值进程获得最低的处理器使用权重
为了计算准确的时间片,CFS为完美多任务中的无限小调度周期的近似值设立了一个目标——目标延迟,越小的调度周期将带来越好的交互性
当可运行任务数量趋于无限时,它们各自所获得的处理器使用比和时间片都将趋于0,CFS为此引入每个进程获得的时间片底线,称为最小粒度,默认情况下这个值是1ms,确保切换消耗被限制在一定范围内
任何进程所获得的处理器时间是由它自己和其他所有可运行进程nice值得相对差值决定的,nice值对时间片的作用不再是算术加权,而是几何加权
任何nice值对应的绝对时间不再是一个绝对值,而是处理器的使用比
CFS称为公平调度器是因为它确保给每个进程公平的处理器使用比
4.5 Linux调度的实现
位于文件kernel/sched_fair.c
四个组成部分:时间记账,进程选择,调度器入口,睡眠和唤醒
4.5.1时间记账
所有的调度器都必须对进程运行时间做记账,当一个进程的时间片被减少到0时,它就会被另一个尚未减到0的时间片可运行进程抢占
1.调度器实体结构
需要确保每个进程只在公平分配给它的处理器时间内运行
CFS使用调度器实体结构来追踪进程运行记账
调度器实体结构作为一个名为se的成员变量,嵌入在进程描述符struct task_struct内
2.虚拟实时
vruntime变量存放进程的虚拟运行时间,该运行时间的计算是经过了所有可运行进程总数的标准化
虚拟时间以ns为单位
CFS使用vruntime变量来记录一个程序到底运行了多长时间以及它还应该再运行多久
定义在kernel/sched_fair.c文件中的update_current()函数实现了该记账功能
4.5.2 进程选择
CFS调度算法的核心:选择具有最小vruntime的任务
CFS使用红黑树来组织可运行进程队列,并利用其迅速找到最小vruntime值得进程
红黑树称为rbtree,它是一个自平衡二叉搜索树
红黑树是一种以树节点形式储存的数据,这些数据都会对应一个键值
可以通过这些键值来快速检索节点上的数据
1.挑选下一个任务
2.向树中加入进程
3.从树中删除进程
4.5.3 调度器入口
进程调度的主要入口点是函数schedule,它定义在文件kernel/sched.c
调用进程调度器的入口:选择哪个进程可以运行,何时将其投入运行
调用pick_next_task(),它以优先级为序,从高到低,依次检查每一个调度类,并且从最高优先级的调度中,选择最高优先级的进程
4.5.4 睡眠和唤醒
休眠的进程处于一个特殊的不可执行状态
进程把自己标记成休眠状态,从可执行红黑树中移动,放入等待队列,然后调用schedule()选择和执行一个其他进程。唤醒的过程刚好相反:进程被设置为可执行状态,然后再从等待队列中移到可执行红黑树中
1.等待队列
2.唤醒
4.6 抢占和上下文切换
从一个可执行进程切换到另一个可执行进程,定义在kernel/sched.c中的context_switch()函数负责处理
调用声明在<asm/mmu_context.h>中的switch_mm(),该函数负责把虚拟内存从上一个进程映射切换到新进程中
调用声明在<asm/system.h>中的switch_to(),该函数负责从上一个进程的处理器状态切换到新进程的处理器状态
4.6.1 用户抢占
内核无论是在中断处理程序还是在系统调用后返回,都会检查need_resched标志,如果它被设置了,那么,内核会选择一个其他进程投入运行
用户抢占在一下情况时产生:
从系统调返回用户空间内
从中断处理程序返回用户空间时
4.6.2 内核抢占
只要没有锁,内核就能抢占
锁是非抢占区域的标志
内核抢占会发生在:
中断处理程序正在执行,且返回内核空间之前
内核代码再一次具有可抢占性的时候
如果内核中的认为显式地调用schedule()
如果内核中的认为阻塞
Linux内核分析第四章读书笔记的更多相关文章
- Linux内核分析第四章 读书笔记
Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...
- Linux内核分析第一二章读书笔记
linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...
- linux内核分析 第4章读书笔记
第四章 进程调度 一.抢占与非抢占 1.非抢占式进程调度 进程会一直执行直到自己主动停止运行 2.抢占式进程调度 Linux/Unix使用的是抢占式的方式,强制的挂起进程的动作就叫做抢占. 二.进程优 ...
- linux内核分析 第5章读书笔记
第五章 系统调用 一.与内核通信 系统调用在用户控件进程和硬件设备之间添加了一个中间层,作用有: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运行在虚拟系统中,而在用 ...
- Linux内核分析第三章读书笔记
第三章 进程管理 3.1 进程 进程就是处于执行期的程序 进程就是正在执行的程序代码的实时结果 线程:在进程中活动的对象.每个线程都拥有一个独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是 ...
- Linux内核分析第五章读书笔记
第五章 系统调用 在操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口在应用程序和内核之间扮演了使者的角色,保证系统稳定可靠,避免应用程序肆意妄行. 5.1 与内核通信 系统调用在用户空 ...
- linux内核分析 第3章读书笔记
第三章 进程管理 一.进程 1.进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 进程是处于执行期的程序以及相关的资源的总称. 进程包括代码段和其他资源. 2.线程 执行线程, ...
- linux内核分析 第18章读书笔记
十八章 调试 一.内核调试概述 1.需要面对的 一个确定的bug 一个藏匿bug的内核版本 相关的内核代码的知识和运气 2.艰难的调试工作 重现bug很困难:大部分bug通常都不是行为可靠而且定义明确 ...
- linux内核分析 第7章读书笔记——《深入理解计算机系统》
第七章 链接 --<深入理解计算机系统> 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 一.编译器 大多数编译系统提供编译驱动 ...
随机推荐
- log4.net 配置-控制台输出带颜色的日志
一般对控制台输入的日志我们使用的 Appender 为 ConsoleAppender ,日志为白色文字. 当我们想到 DEBUG,INFO,WARN,ERROR 每种日志设置一种颜色时我们需要将 ...
- 「SNOI2019」通信
题目 还好我没生在陕西啊 首先发现这个题不能\(dp\),数据范围不大,好像一种网络流的样子啊 哎等等,这样向后面连边不是一个\(DAG\)吗,这不是最小权路径覆盖的板子吗 于是我们套路的拆点,对于一 ...
- esp8266(1) 手机+Arduino+esp8266通信
ESP8266 Android与Arduino通信 功能描述: 1 Arduino上电,它通过软串口(Arduino的 2号和3号脚)发送命令,配置espson8266为 AP模式,wifi名 DDD ...
- day14 Python函数
函数def,严格来讲有个return返回值 过程就是没有return返回值的函数 #过程 def test01(): msg = 'liuhaoran' print(msg) #函数 def test ...
- 乱入Linux界的我是如何学习的
欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux. 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在网上 ...
- Android使用属性动画ValueAnimator动态改变SurfaceView的背景颜色
以下是主要代码,难点和疑问点都写在注释中: /** * 开始背景动画(此处为属性动画) */ private void startBackgroundAnimator(){ /* *参数解释: *ta ...
- 查看Orcale数据里的表是否有变化
由于我们公司一个数据库两个应用在使用,导致一个应用修改了数据库,另一个应用用的缓存而不知道有更新还是原来的结果.原来的处理方式是采用session缓存的方式,用户登出了就清空缓存,这样只需要重新登录一 ...
- 奇怪的组数length属性
Java中的数组其实也是一个对象,但是确实是一个特殊的对象,实在是太特殊了,继承自Object, 多出一个属性length,改写了clone方法. 我debug了数组对象的运行时的Class对象, ...
- CF809D Hitchhiking in the Baltic States LIS、平衡树
传送门 看到最长上升子序列肯定是DP 设\(f_i\)表示计算到当前,长度为\(i\)的最长上升子序列的最后一项的最小值,显然\(f_i\)是一个单调递增的序列. 转移:对于当前计算的元素\(x\), ...
- WPF C#截图功能 仿qq截图
原文:WPF C#截图功能 仿qq截图 先上效果图 源码下载地址:http://download.csdn.net/detail/candyvoice/9788099 描述:启动程序,点击窗口butt ...