赵瀚青原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

概述

本周学习的是linux内核中的进程调度,之前我们在操作系统中有讲解进程调度的分类,以及一些调度算法。而linux中的进程调度有所不同,首先老师讲解了进程调度和进程调度的时机,所有的用户态进程都只能被调度,而内核线程可以主动调度,而进程调度的实现都是通过schedule函数,然后讲解了进程上下文所包含的信息,然后讲解了切换寄存器状态所使用的switch to函数,每一个部分都单独分析了。然后讲解了LINUX架构和执行过程。虽然在操作系统中讲解过了进程调度,但是这个讲解得更加深入,是从内核的角度讲解了调度的原理,和执行过程。

课本内容

什么是进程调度

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

一、调度策略

4.1进程类型

  • I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待请求过程时处于阻塞状态。如交互式程序。

  • 处理器消耗型进程:时间大都用在执行代码上,除非被抢占否则一直不停的运行。

  • 综合型:既是I/O消耗型又是处理器消耗型。

  • 调度策略要在:进程响应迅速(响应时间短)和最大系统利用率(高吞吐量)之间寻找平衡。

4.2 调度概念

  • 优先级:基于进程价值和对处理器时间需求进行进程分级的调度。

  • 时间片:表明进程被抢占前所能持续运行的时间,规定一个默认的时间片。时间片过长导致系统交互性的响应不好,

  • 程序并行性效果差;时间片太短增大进程切换带来的处理器耗时。矛盾!

  • 间片耗尽进程运行到期,暂时不可运行状态。直到所有进程时间片都耗尽,重新计算进程时间片。

  • Linux调度程序提高交互式程序优先级,提供较长时间片;实现动态调整优先级和时间片长度机制。

  • 进程抢占:Linux系统是抢占式,始终运行优先级高的进程。

4.3 策略

  • 决定调度程序在何时让进程运行。

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

  • I/O消耗型:大多时间在提交或等待I/O请求。

  • 处理器消耗型:大多时间在执行代码。不属于I/O驱动类型。

4.3.2 进程优先级

  • 相同优先级按照轮转方式进行调度。

  • 调度程序总是选择时间片未用尽且优先级高的进程运行。

4.3.3 时间片

  • nice值作为权重将调整进程所使用的处理器时间使用比。

  • I/O消耗型:不需要长的时间片。

  • 处理器消耗型:需要越长越好的时间片。

4.3.4 调度策略的活动

文字编辑程序显然是 1/0 消耗型的,因为它大部分时间都在等待用户的键盘输入〈无论用户的输入速度有多快,都不可能赶上处理的速度λ 用户总是希望按下键系统就能马上响应。

视频编码程序是处理器消耗型的。

4.4 Linux调度算法

4.4.1 调度器类

以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选

择调度算哉。

4.4.2 Unix系统中的进程调度

4.4.3 公平调度

CFS的做怯是允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行进程,而不再采用分配给每个进程时间片的做法了,在所有可运行进程总数基础上计算出一个进程应该运行多久。 - -

nice 值在 CFS 中被

作为进程获得的处理器运行比的权重:越高的nice 值(越低的优先级)进程在得更低的处理器

使用权重。

可运行进程数量趋于无穷,每个最少也能获得 lms 的运行时间。

任何进程所获得的处理器时间是由它自己和其他所有可运行进程nice 值的相对差值决定的。

4.5 Linux调度的实现

4.5.1 时间记账

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

CFS 使用调度器实体结构(定义在文件<linux/sched.h>的 struct_sched _entity 中)来追踪进程运行记账。

CFS 使用 vruntime 变量来记录一个程序到底运行了多长时间以及它还应该再运行多久。

定义在kemeVsched_fair.c 文件中的 update_curr()函数实现了该记账功能。

update_ currO 计算了当前进程的执行时间,并且将其存放在变量delta_exec 中,update_ curr()是囱系统定时器周期性调用。

4.5.3 调度器入口

主要入口点是函数schedule(),它定义在文件kemel/sched.c中。

4.5.4 睡眠和唤醒

睡眠:为了等待一些事件。

内核的操作都相同 2 进程把自己标记成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用 schedule()选择和执行一个其他进程。

唤醒的过程刚好相反进程被设置为可执行状态,然后再从等待队列中移到可执行红黑树中。

4.6.1 用户抢占

  • 用户抢占在以下情况时产生:

  • 从系统调返回用户空间时;

  • 从中断处理程序返回用户空间时;

4.6.2 内核抢占

内核抢占会发生在:

中断处理程序正在执行,且返回内核空间之前
内核代码再一次具有可抢占性
如果内核中的任务显式地调用 schedule()
如果内核中的任务阻塞(这同样也会导敖调用 schedule()

4.7 实时调度策略

两种策略

SCHED_FIFO和 SCHED_RR

SCHED_FIFO 实现了一种简单的、先入先出的调度算怯

SCHED_RR 是带有时闹片的 SCHED_FIFO,一种实时轮流调度算挂.

4.8 与调度相关的系统调用

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

sched_setparam()和sched__getparam()分别用于设置和获取进程的实时优先级

nice()函数会调用内核的 set_ user_ nice()函数,这个函数会设置进程的 task_struct 的 static_prio 和prio 值。

本周实验

实验内容:

  • 理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否准确;

  • 使用gdb跟踪分析一个schedule()函数 ,验证您对Linux系统进程调度与进程切换过程的理解

实验步骤

一、使用gdb跟踪分析schedule()函数

开启qemu以及gdb

设置断点



按c继续,可以发现core.c里面调用了schedule()。

用list查看代码

单步执行发现__schedule()

继续单步执行,直到发现context_switch:

之后继续执行,可以进入context_switch()函数并发现了switch_to()和__switch_to()

linux系统的一般执行过程

  • 正在运行
  • 发生中断,可能陷入内核,CPU自动保存加载
  • SAVE_ALL保存现场
  • 调用schedule,switch_to进程上下文切换
  • 标号1之后运行Y(之前有进行准备动作)
  • restore_all恢复现场
  • 继续运行用户态进程Y

20135320赵瀚青LINUX第八周学习笔记的更多相关文章

  1. 20135320赵瀚青LINUX第七周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周学习的内容主要是讨 ...

  2. 20135320赵瀚青LINUX第五周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 按照刘老师的周从三个角 ...

  3. 20135320赵瀚青LINUX第六周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 这周主要讲解的是进程. ...

  4. 20135320赵瀚青LINUX第四章读书笔记

    概述 什么是进程调度 进程调度:在可运行态进程之间分配有限处理器时间资源的内核子系统. 一.调度策略 4.1进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状 ...

  5. 20135320赵瀚青LINUX第三章读书笔记

    第三章 进程管理 3.1 进程 进程的定义: 是处于执行期的程序以及它所包含的资源的总称. 线程的定义: 是在进程中活动的对象. 每个线程都拥有一个独立的程序计数器.进程栈和一组进程寄存器. 内核调度 ...

  6. 20135320赵瀚青LINUX第十八章读书笔记

    概述:调试工作艰难是内核级开发区别于用户级开发的一个显著特点 18.1准备开始 内核调试往往是一个令人挠头不已的漫长过程.幸运的是,在这些费劲的问题中也有不少比较简单而且容易消灭的小bug,运气好你可 ...

  7. 20135320赵瀚青LINUX第五章读书笔记

    第五章--系统调用 5.1 与内核通信 作用 1.为用户空间提供一种硬件的抽象接口 2.保证系统稳定和安全 3.除异常和陷入,是内核唯一的合法入口. API.POSIX和C库 关于Unix接口设计:提 ...

  8. 期末总结20135320赵瀚青LINUX内核分析与设计期末总结

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 对LINUX内核分析与设计这 ...

  9. 20135320赵瀚青LINUX内核分析第一周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.概述 第一周的学习内容主 ...

随机推荐

  1. spring AOP底层原理实现——jdk动态代理

    spring AOP底层原理实现——jdk动态代理

  2. JS-对象查找父级

    之前在寻找两个以上的父级,一直傻傻的用parent().parent()... 今天,需要写五个,当然以前也是写过五个的,但是今天总想着换个简单的方式,至少不要.parent().parent().p ...

  3. Android 简单案例:可移动的View

    CrossCompatibility.rar 1. VersionedGestureDetector.java import android.content.Context; import andro ...

  4. 【BZOJ4196】[Noi2015]软件包管理器 树链剖分

    [Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...

  5. mysql动态sql 整理多个字段

    原始表: 整理后的表: 方案一(动态sql): BEGIN #Routine body goes here... DECLARE v1 ); DECLARE v2 ); #DECLARE v3 VAR ...

  6. tarjan算法求缩点+树形DP求直径

    hdu4612 Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  7. Javascript计算星座

    今天看群里一哥们折腾得挺热乎,手痒随便写了一个DEMO,供初学者参考. 重点,写程序先定注释,明确思路后再写具体代码. //星座定义 var constellations = [ {"Sta ...

  8. docker 2375 vulnerability and self-signatuer certifications

    Docker暴露2375端口,引起安全漏洞 今天有小伙伴发现Docker暴露出2375端口,引起了安全漏洞.我现在给大家介绍整个事情的来龙去脉,并告诉小伙伴们,怎么修复这个漏洞. 为了实现集群管理,D ...

  9. Python绘图教程

    1.二维绘图 a. 一维数据集 用 Numpy ndarray 作为数据传入 ply 1. import numpy as np import matplotlib as mpl import mat ...

  10. Java spring mvc多数据源配置

    1.首先配置两个数据库<bean id="dataSourceA" class="org.apache.commons.dbcp.BasicDataSource&q ...