第八章 进程的切换和系统的一般执行过程

1.进程调度的时机

  • 硬中断和软中断

    • 中断:在本质上都是软件或者硬件发生了某种情形而通知处理器的行为,处理器进而停止正在运行的指令流(当前进程),对这些通知做出相应的反应,即转去执行预定义的中断处理程序(内核代码)。
    • ntel定义的中断类型主要有:
      • 硬中断:就是CPU的两根引脚(可屏蔽中断和不可屏蔽中断)。
      • 软中断/异常:包括除零错误、系统调用、调试断点等在CPU执行命令过程中发生的各种特殊情况统称为异常。异常会导致程序无法继续执行,而跳转到CPU预设的处理函数。异常分为以下三种:
        • 故障:出现问题,可以恢复到当前指令。
        • 退出:不可恢复的严重故障,导致程序无法继续运行,只能退出。
        • 陷阱:程序主动产生的异常。
  • 进程调度时机

    • schedule()函数:Linux内核通过schedule函数实现进程调度。调用schedule函数一次就是调度一次,调用schedule函数的时候就是进程调度的时机。调度schedule()函数的两种方法:

      • 进程主动调用schedule():如果进程调用阻塞的系统调用等待外设或主动睡眠等,最终都会在内核中调用到schedule函数。
      • 松散调用:内核代码中可以随时调用schedule()函数使当前内核路径让出CPU;也会根据need_resched标记做进程调度,内核检测到need_resched决定是否调用schedule函数。
    • 上下文:一般来说,CPU在任何时刻都处于以下三种情况之一
      • 运行于用户空间,执行用户进程上下文;
      • 运行于内核空间,处于进程(一般是内核线程)上下文;
      • 运行于内核空间,处于中断(中断处理程序ISR,包括系统调用处理过程)上下文。
    • 进程调度时机就是内核调用schedule()函数的时机。 进程调度时机情况总结如下:
      • 用户进程通过特定的系统调用主动让出CPU;
      • 中断处理程序在内核返回用户态时进行调度;
      • 内核线程主动调用schedule函数让出CPU;
      • 中断处理程序主动调用schedule函数让出CPU(包括以上两点)。

2.调度策略和算法

  • 进程的分类:

    • 分类1:

      • I/O消耗型进程
      • 处理器消耗型进程
    • 分类2:
      • 交互式进程
      • 批处理进程
      • 实时进程
    • 根据进程的不同分类,Linux采用不同的调度策略:
      • 对于实时进程,Linux采用FIFO或者RR的调度策略;
      • 对于其他进程,Linux采用CFS调度器,核心思想是“完全公平”。
  • 调度策略
    • 实时进程的调度策略(优先级0~99,静态设定)

      • SCHED_FIFO 先进先出
      • SCHED_RR 轮转策略(时间片)
    • 普通进程的调度策略
      • SCHED_NORMAL,使用CFS调度管理程序,普通进程只有nice值,映射到优先级为100~139。按优先级占比计算占用CPU的时间。
  • CFS调度算法(完全公平调度算法)
    • 基本原理:基于权重的动态优先级调度算法。
    • 调度周期:进程越多,周期越长;上限默认8ms;一个时间周期内队列的所有进程都会至少被调度一次。
    __sched_period = nr_running(进程数)*sysctl_sched_min_granularity(默认值为0.75ms)
    • 理论运行时间:每次可获取CPU后最长可占用时间为ideal_runtime.
    ideal_runtime = __sched_period * 进程权重/队列运行总权重
    • 虚拟运行时间:每个进程拥有一个vruntime,每次需要调度时就运行队列中拥有最小的vruntime的进程来运行,最长运行时间为ideal_runtime.
    if se->load.weight != NICE_0_LOAD
    vruntime+= delta_exec;
    else
    vruntime+= delta_exec *NICE_0_LOAD/se.load->weight

3.进程上下文切换

  • 为了控制进程的执行,内核必须有能力挂起正在CPU中运行的进程,并恢复执行以前挂起的进程,这个行为称为进程切换
  • 进程上下文包含了进程执行的所有信息:
    • 用户地址空间:进程代码、数据和用户堆栈等;
    • 控制信息:进程描述符、内核堆栈;
    • 硬件上下文:存储相关寄存器的值。
  • 实际代码中进程切换由两个步骤组成:
    • 切换页全局目录(RC3)以安装一个新的地址空间,这样不同的虚拟地址经过不同的页表转为不同的物理地址;
    • 切换内核态堆栈和硬件上下文。

4.Linux系统的运行过程

  • Linux系统的一般执行过程:正在运行的用户态进程X切换到用户态进程Y的过程:

    • 1.正在运行的用户态进程X;
    • 2.发生中断(包括异常,系统调用等),硬件完成以下动作:
      • save cs:eip/esp/eflags:当前CPU上下文压入用户态进程X的内核堆栈;
      • load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack)
    • 3.SAVE_ALL,保存现场
    • 4.中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换;
    • 5.标号1,之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行);
    • 6.restore_all,恢复现场;
    • 7.iret-pop cs:eip/ss:esp/eflags,从Y进程的内核堆栈中弹出(2)中硬件完成的压栈内容;
    • 8.继续运行用户态进程Y。

5.Linux系统构架与执行过程概览

  • 操作系统的基本概念

  • Linux操作系统的整体构架示意图

  • ls命令执行过程示意图

6.进程调度相关源代码跟踪和分析

配置运行MenuOS系统

另外打开一个shell命令窗口进行gdb远程调试,设置gdb远程调试和设置断点如下:

使用c继续运行:

使用list查看断点处的代码。可以看到MenuOS运行到schedule函数停下来,schedule函数是进程调度的主体函数,schedule()函数断点截图如下:

pick_next_task函数是schedule函数中的重要函数,负责根据调度策略和调度算法选择下一个进程,pick_next_task函数断点截图如下所示:

context_switch函数是schedule函数中实现进程切换的函数,context_switch函数断点截图如下所示:

switch_to是context_switch函数中进行进程关键上下文切换的函数。switch_to内部是内嵌汇编代码,无法跟踪调试。

2019-2020-1 20199324《Linux内核原理与分析》第九周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  6. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. POJ - 1753 Flip Game (IDA*)

    题意:4*4的棋盘摆满棋子,有黑有白,翻转一个棋子的同时也将翻转其上下左右的棋子(翻转后黑变白,白变黑),问使棋盘上所有棋子颜色相同,最少翻转的棋子数. 分析: 1.每个棋子至多翻转1次.翻转偶数次与 ...

  2. 从谷歌Pixel3不堆硬件看智能手机下一个十年将被AI制霸

    别看现在的智能手机行业热闹异常--厂商混战.新品频出.噱头涌现,但能引领手机行业发展趋势的依旧是苹果和谷歌.如果说苹果的iPhone树立了一个个智能手机行业进化的标杆,那么谷歌其实就是在为安卓手机的发 ...

  3. sqlserver 联接查询的一些注意点

    1.内连接的安全性 (1) inner join 是ANSI SQL-92 语法.等值联接是ANSI SQL-89 的语法 ,两者已相同方式解释.在性能上没有差别 (2)但是强烈建议使用ANSI SQ ...

  4. h5-伸缩布局-小案例

    1.伸缩布局案例1-基本页面布局 1.1.html <div class="layout"> <header></header> <mai ...

  5. C++ STD Gems06

    generate.generate_n.sample.iota #include <iostream> #include <vector> #include <strin ...

  6. python的库有多少个?python有多少个模块?

    这里列举了大概500个左右的库: !   Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主 ...

  7. 碎碎念(DP)

    链接:https://ac.nowcoder.com/acm/contest/3006/F来源:牛客网 题目描述 在ACM比赛里,除了CE以外都是有效的提交.每一个提交都会有其评测的结果,或是AC,或 ...

  8. HZNU-ACM寒假集训Day7小结 背包DP

    背包问题 01背包 状态:f(i,j) 表示只能装前i个物品的情况下,容量为j的背包所能达到的最大总价值 状态转移方程:  f(i,j)=max(f(i-1,j),f(i-1,j-w[i])+v[i] ...

  9. POJ 1149:PIGS 网络流经典题

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18345   Accepted: 8354 Description ...

  10. struct寻址&for反汇编

    //for 反汇编 #include<stdio.h> int main() { ; ; ;i<;i++) { s=s+; } s=; ;i>=;i--) { s=s+; } ...