进程的切换和一般执行过程

(一)进程调度的时机

(1)关键问题

何为进程切换?就是进程调度时机到来时从就绪进程队列中能够挑选一个进程执行,占用CPU时间,那么就有两个关键问题:一是什么时间去挑选一个就绪进程(调度时机);而是如何让进程占用CPU(进程切换的过程)?

(2)硬中断与软中断

  • 硬中断(Interrupt)就是CPU的两根引脚(可屏蔽中断和不可屏蔽中断)。CPU在执行每条指令后检测两根引脚的电平,如果是高电平,说明有中断请求,CPU就会中断当前程序的执行后去处理中断。一般类似时钟/键盘/硬盘等外设都是以这种方式与CPU进行信号传递的。

  • 软中断(Exception)也被称为异常,其包括除零错误/系统调用/调式断点等在CPU执行指令过程中的发生的各种特殊情况统称为异常,异常会导致程序无法继续执行,而跳转到CPU预设的处理函数。异常包括故障/退出/陷阱三种。

(3)进程调度时机

1)schedule函数

Linux内核通过schedule函数实现进程调度,它在运行队列中找到一个进程,把CPU分配给它。所以调用该函数一次就是调度一次,调用该函数的时机就是进程调度的时机。调用schedule函数的两种方法如下:

  • 进程主动调用schedule(),如进程调用阻塞的系统调用等待外设或者主动睡眠。

  • 松散调用,内核代码可以随时根据需要调用schedule使当前内核路径让出CPU。

2)上下文

一般来说,CPU在任何时刻都处于以下三种情况之一:
  • 运行于用户空间,执行用户进程上下文。

  • 运行于内核空间,处于进程上下文。

  • 运行于内核空间,处理中断上下文。

3)进程调度的时机

  • 用户进程通过特定的系统调用主动让出CPU。

  • 中断处理程序在内核返回用户态时进行调度。

  • 内核线程主动调用schedule函数让出CPU。

  • 中断处理程序主动调用schedule函数让出CPU。

(二)Linux系统的运行过程

(1)Linux的一般执行过程

1)正在运行的用户态X。

2)发生中断(包括异常、系统调用)。

3)保护现场,此时完成上下文切换。

4)中断处理过程中或中断返回前调用schedule函数,其中switch_to做了关键进程上下文切换。

5)运行用户态进程Y。

6)恢复现场。

7)完成中断上下文切换,从进程Y内核态返回到进程Y的用户态。

8)继续运行用户态进程Y。

(2)几种特殊情况

1)通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;

2)内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略;

3)创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork;

4)加载一个新的可执行程序后返回到用户态的情况,如execve;

(3)Linux整体框架和执行过程



(4)进程调度相关代码跟踪实验

1)在虚拟机环境中打开一个shell命令窗口,运行MenuOS系统



2)通过增加-S -s启动参数打开调试模式,命令如下:

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s

3)另外开一个shell命令窗口进行gdb调试并设置断点

4)打开gdb,设置断点,其中switch_to为宏定义,不能设置断点,需到context_switch函数中单步执行查看调用

  • schedule函数断点

  • pick_next_task函数断点



  • context_switch函数断点

  • switch_to函数断点

(三)总结

中断在本质上都是软件或某些硬件发生了某情形的而通知处理器的行为,处理器进而停止正在运行的指令流,对这些通知做出相应的反应,级转去执行预定义的中断处理程序。除了主动让出CPU外,进程调度都需要在进程外进行,这就需要从进程的指令流里切换出来,中断能起到切出进程指令流的作用,中断处理程序是与进程无关的内核指令流。运行完内核代码后,CPU顺带检查一下是否需要进程调度。需要则切换进程,不需要则一路顺着函数调用堆栈正常中断返回iret,这样就自然回到原进程继续运行了。

2019-2020-1 20199305《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. Orleans的深入

    1.序列化  序列化配置有几个坑这里我写出来 2.负载均衡 3.定时器与提醒 4.服务启动执行代码 5.监控 序列化 新建实体类 引用的包 Microsoft.Orleans.Core V2.12 M ...

  2. 【JS】382- JavaScript 模块化方案总结

    本文包含两部分,第一部分通过简明的描述介绍什么是 CommonJS.AMD.CMD.UMD.ES Module 以及它们的常见用法,第二部分则根据实际问题指出在正常的 webpack 构建过程中该如何 ...

  3. 2.成产出现 max(vachar2)取值问题

    uat 测试结果正确max(9)>max(8),结果生产出现 max(9)>max(12) 原因:字符类型,默认比较第一个字符的ASCII码. 解决方式: max(to_number(va ...

  4. java_计算个人所得税

    // import java.util.Scanner;public class Test10{ public static void main(String[] args){ // 创建Scanne ...

  5. 获取本地计算机名称和Ip地址

    using System.Net; Dns.GetHostName();//获取本地计算机主机名 IPAddress[] IP = Dns.GetHostAddresses(Dns.GetHostNa ...

  6. golang中copy文件时,buffer设多大值合适,性能对比

    在go语言中,copy文件时,大文件使用buffer缓冲,可以明显加快时间, 但这个值多大合适呢? 除了考虑计算机的硬件资源,还要考虑CP文件的大小. 如果都是100m之内的小文件,一次CP完就可以. ...

  7. python单元测试unittest、setUp、tearDown()

    单元测试反应的是一种以测试为驱动的开发模式,最大的好处就是保证一个程序模块的行为符合我们设计的测试用例,在将来修改的时候,可以极大程度保证该模块行为仍然是正确的. 下面我编写一个Dict来,这个类的行 ...

  8. leaflet视频监控播放(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  9. Dc:7 Vulnhub Walkthrough

    靶机下载地址: https://www.vulnhub.com/entry/dc-7,356/ 主机扫描: http://10.10.202.161/ Google搜索下: SSH 登录 以上分析得出 ...

  10. python数据挖掘第三篇-垃圾短信文本分类

    数据挖掘第三篇-文本分类 文本分类总体上包括8个步骤.数据探索分析->数据抽取->文本预处理->分词->去除停用词->文本向量化表示->分类器->模型评估.重 ...