第四章 进程调度

进程调度程序:确保进程能有效工作的一个内核子程序

决定将哪个进程投入运行,何时运行已经运行多长时间

进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统

原则:只要有可以执行的进程,那么就总会有进程正在执行

基本工作:在一组处于可运行状态的进程中选择一个来执行

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内核分析第四章读书笔记的更多相关文章

  1. Linux内核分析第四章 读书笔记

    Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...

  2. Linux内核分析第一二章读书笔记

    linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...

  3. linux内核分析 第4章读书笔记

    第四章 进程调度 一.抢占与非抢占 1.非抢占式进程调度 进程会一直执行直到自己主动停止运行 2.抢占式进程调度 Linux/Unix使用的是抢占式的方式,强制的挂起进程的动作就叫做抢占. 二.进程优 ...

  4. linux内核分析 第5章读书笔记

    第五章 系统调用 一.与内核通信 系统调用在用户控件进程和硬件设备之间添加了一个中间层,作用有: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运行在虚拟系统中,而在用 ...

  5. Linux内核分析第三章读书笔记

    第三章 进程管理 3.1 进程 进程就是处于执行期的程序 进程就是正在执行的程序代码的实时结果 线程:在进程中活动的对象.每个线程都拥有一个独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是 ...

  6. Linux内核分析第五章读书笔记

    第五章 系统调用 在操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口在应用程序和内核之间扮演了使者的角色,保证系统稳定可靠,避免应用程序肆意妄行. 5.1 与内核通信 系统调用在用户空 ...

  7. linux内核分析 第3章读书笔记

    第三章 进程管理 一.进程 1.进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 进程是处于执行期的程序以及相关的资源的总称. 进程包括代码段和其他资源. 2.线程 执行线程, ...

  8. linux内核分析 第18章读书笔记

    十八章 调试 一.内核调试概述 1.需要面对的 一个确定的bug 一个藏匿bug的内核版本 相关的内核代码的知识和运气 2.艰难的调试工作 重现bug很困难:大部分bug通常都不是行为可靠而且定义明确 ...

  9. linux内核分析 第7章读书笔记——《深入理解计算机系统》

    第七章 链接 --<深入理解计算机系统> 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 一.编译器 大多数编译系统提供编译驱动 ...

随机推荐

  1. java调用Linux执行Python爬虫,并将数据存储到elasticsearch中--(java后台代码)

    该篇博客主要是java代码,如需相应脚本及java连接elasticsearch工具类代码,请移步到上一篇博客(https://www.cnblogs.com/chenyuanbo/p/9973685 ...

  2. Visual Studio 2015的安装与测试单元的配置与使用

    首先感谢吴小勇同学的教程,及其详尽周全.详见http://www.cnblogs.com/xiaoyongwu/p/5289964.html     那么正式开始,事实上在撰写这篇博文的时候,这个图标 ...

  3. Nginx使用教程(一):Nginx编译参数详解

    从源代码编译应用程序时通常有三个步骤:配置,编译和安装. 配置步骤允许您选择一些在程序编译后无法编辑的选项,因为它对程序二进制文件有直接影响. 因此,这是一个非常重要的阶段,你需要仔细选择,如果你想避 ...

  4. Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。

    java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待) ...

  5. 【九校3D2T3】世界第一的猛汉王

    [问题描述] 卡普地公司举办了「世界第一的猛汉王」全球大会,来自世界各地的猛汉为了争夺「猛汉王」的名号前来一决高下.现在举行的是弓箭组选拔赛.卡普地公司为比赛新建了一张PVP地图——「猛汉竞技场」.有 ...

  6. Ajax进阶

    "POST":请求 POST请求:(一共三个方法)<!DOCTYPE html><html lang="en"><head> ...

  7. Windows安装pip方法

    1.下载pip 地址:https://pypi.python.org/pypi/pip#downloads 注意选择tar.gz压缩包,目前最新版本为9.0.1,这里选择的版本是:pip-9.0.1. ...

  8. 合并多个Excel文件

    这条分享来自百度经验https://jingyan.baidu.com/article/e6c8503cb6ed7ee54e1a1811.html

  9. 项目Alpha冲刺(团队)-第六天冲刺

    格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 作业目标:描述第六天冲刺的项目进展.问题困难.心得体会 ...

  10. (一) 天猫精灵接入Home Assistant- hass对接天猫精灵

    1如何利用论坛的认证服务器对接天猫精灵 说起天猫精灵的接入,最早是由c1pher(25989406)大神通过开发自定义技能接入,后面qebabe大神进行了改进,可以直接通过HASS API读取hass ...