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

(一)进程调度的时机

(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. 使用脚本安装 Docker

    使用脚本安装 Docker 1.使用 sudo 或 root 权限登录 Centos. 2.确保 yum 包更新到最新. $ sudo yum update 3.执行 Docker 安装脚本. $ c ...

  2. js打乱数组排序

    用到的知识点:Math.random()//用于打乱数组索引 random() 方法可返回介于 0(包含) ~ 1(不包含) 之间的一个随机数. var arr=[1,2,3,4,5,6]; for( ...

  3. Ubuntu 18.04系统中不能ssh外网远程

    前言 今天我不小心动了电插板,导致服务器断电,用远程命令开机,居然很长时间没反应,索性就亲自按电源键重启.服务器正常开机启动,ssh可以内网访问,远程命令内网有效果,就是外网不行.经过分析排查,是不是 ...

  4. CCF-CSP题解 201509-3 模板生成系统

    简单的替换一下字符串. 注意数组开大点. #include<bits/stdc++.h> const int maxm = 100; const int maxn = 100; using ...

  5. django基础之day05,orm字段参数,自定义需要的字段,orm中的事务操作

    orm字段和参数 charfield varchar integerfield int bigintegerfield bigint emailfield varchar(254) datefield ...

  6. 浅析堆栈段,BBS段,数据段,代码段

    文章目录 1. 进程,线程 2. 堆栈段 3. BBS段 4. 代码段 5. 数据段 6. 例子 7. 总结 1. 进程,线程 所谓进程是指在系统中能独立运行并作为资源分配的基本单位,程序段,数据段和 ...

  7. LeetCode刷题总结-树篇(上)

          引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...

  8. 分布式系统的发展演变以及RPC简介

    场景 什么是分布式系统 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统. 分布式系统是建立在网络之上的软件系统. 注: 博客: https://blog.csdn.net/b ...

  9. 在Linux 中搭建 Mysql

    在本次搭建,出现了各种问题,一直解决不掉,建议各位小伙伴不要像我一样,像一个无头的苍蝇一样,这有问题就解决这个问题,没有意识本质实在的问题. 主要问题(加星,标重点):一定要看自己的linux 版本, ...

  10. RDP矢量数据压缩算法

    在绘制对象边缘时涉及到了这个算法,记录一下. 该算法递归进行,首先设定一个阈值,在点集的第一个点和最后一个点间拉一条线段,找出剩下的点集中离线段最远的一个点,如果该点到线段的距离小于阈值则舍弃中间的所 ...