本章简介
异常控制流
- 定义
- 现代系统通过使用控制流发生突变对系统各种状态的变化作出反应,我们把这些突变称为异常控制流(Exceptional Control Flow)
- 理解异常控制流的好处
- 理解重要的系统概念
- 理解应用程序是如何与操作系统交互的
- 编写有趣的新应用程序
- 理解并发
- 理解软件异常如何工作
本章讲解思路
- 与操作系统交互
- 这一章的重要性在于学习应用是如何与操作系统交互,交互是围绕ECF的,将从一个计算机系统中所有层次上各种形式的ECF展开
- 从异常开始,异常位于硬件与操作系统交界的部分
- 讨论系统调用,他们是应用程序提供到操作系统的入口点的异常
- 提升抽象的层次,描述进程号,他们位于应用和操作系统的交界之处
- 最后,讨论非本地跳转,这是ECF的一种应用形式
异常
异常处理
异常
- 异常就是控制流中的突变,用来响应处理器状态中的某些变化
事件
- 状态变化称为事件,事件可能和当前指令的执行直接相关
异常表
- 在任何情况,当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用,到一个专门设计用来处理这类事件的操作系统子程序(称为异常处理程序)
异常的剖析
异常跳转
- 处理程序将控制返回给当前指令Icurr,即当前事件正在执行的指令。
- 处理程序将控制返回给Inext,即如果没有发生异常,将会执行的下一条指令。
- 处理程序终止被中断的程序。
异常号
- 系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号,这些号码是由处理器的设计者或者操作系统内核分配的。
异常表
- 在系统启动时,操作系统分配和初始化一张称为异常表的跳转表,使得条目k包含异常k的处理程序地址。
异常的类别
异步异常
- 中断
- 中断是异步发生的,来自处理器外部I/O设备信号
- 返回结果后,程序继续执行下一条指令,就像没有发生中断一样
- 硬件中断的异常处理程序称为中断处理程序
同步异常(故障指令)
陷阱
- 有意的异常,执行一条指令的结果,最常用途——系统调用
- 在用户程序和内核之间提供一个像过程一样的接口
- 系统调用与普通函数调用的区别
- 普通的函数调用运行在用户模块中,用户模式限制了函数可以执行的指令类型,而且它们只能访问与调用函数相同的栈。
- 系统调用运行在内核模式中,内核模式允许系统调用执行指令,并访问定义在内核中的栈。
故障
- 故障由错误情况引起,一般是潜在可恢复的错误,它能够被故障处理程序修正。
- 常见的是缺页异常
终止
- 不可修复的错误引起,例如:DRAM与SRAM被损坏时发生的奇偶错误。
- 终止处理
- 终止处理程序将控制传递给一个内核abort例程,该例程终止这个应用程序
Linux/IA32系统定义异常
常见的异常
- 除法错误
- 一般保护故障
- 缺页
- 机器检查
IA32异常示例图
进程
进程
- 异常是允许操作系统提供进程的概念所需要的基本构造块
- 进程的经典定义是一个执行中的程序的实例
上下文
- 系统中的每个程序都是运行在某个进程的上下文中,上下文是由程序正确运行所需的状态组成的。
- 这个状态包括存放在存储器中的程序的代码和数据,它的栈,通用的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
进程是对应用程序的关键抽象
- 一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占的使用处理器。
- 一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用存储器系统。
逻辑控制流
定义
- 程序计数器PC的值叫做逻辑控制流
逻辑控制流图
案例
- 考虑一个运行三个进程的系统,处理器的一个物理控制流分发成了三个逻辑流。每个进程一个,三个逻辑流的执行是交错的。
- 进程A运行了一会儿,然后是进程B开始运行完成。然后,进程C运行了一会,进程A接着运行直到完成。最后,进程C可以运行到结束了。
- 图的关键点在于进程是轮流使用处理器的,每个进程执行它的流的一部分,然后被抢占其他进程。对于一个运行在这些进程之一的上下文中的程序,它看上去就像是在独占地使用处理器。
逻辑流形式
- 异常处理程序、进程、信号处理程序
- 线程和java进程
并发流
- 并发流
- 多个流并发地执行的一般现象称为并发,并发使计算机运行得更快
- 并发的思想与流运行的处理器核数或者计算机数无关。如果每个流在时间上重叠,那么它们就是并发。
- 并行流
- 并行流是并发流的一个真子集,如果两个流并发的运行在不同的处理器或者计算机上,那么我们程它们为并行流。
- 并行使计算机能做的更多,它们并行的运行,且并行地执行。
私有地址空间
定义
- 一个进程为每个程序提供它自己的私有地址空间
组成
- 地址空间底部是保留给用户程序的,包括通常的文本、数据、堆和栈段。
进程地址空间图
用户模式和内核模式
模式位
- 处理器通过使用某个控制寄存器中的一个模式位,来限制一个应用可以执行的指令以及它可以访问的地址空间范围。
- 当设置模式位时,进程就运行在内核模式中,一个运行在内核模式中的进程可以执行指令集中的任何指令,并且可以访问系统中任何存储器位置。
- 没有模式位时,进程就是运行在用户模式中。用户模式中的进程不允许执行特权指令,比如停止处理器,改变位模式,或者发起一个I/O操作。
模式转化
- 初始时
- 运行应用程序代码的进程初始时是在用户模式中。
- 用户模式转内核模式
- 唯一方法,调用中断、故障、或者陷入系统调用的异常
- 内核模式转用户模式
- 处理程序运行在内核模式中,当它返回到应用程序代码时,处理器就把内核模式改回为用户模式
- 初始时
上下文切换
- 定义
- 上下文就是内核重新启动一个被抢占的进程所需的状态
- 操作系统内核使用一种称为上下文切换的较高层形式的异常控制流来实现多任务。
- 上下文切换图
- 上下文切换
- 保存当前进程的上下文
- 恢复某个先前被抢占的进程被保存的上下文
- 将控制传递给这个新恢复的进程