8.0 异常控制流
控制流
- 处理器只是简单地读取和执行一个指令序列(一次执行一条指令)
- 这个指令序列就是处理器的控制流 ( control flow or flow of control)
改变控制流
- 改变控制流的两种机制:
- 跳转和分支(Jumps and branches)
- 调用和返回(Call and return)
- 能够对(由程序变量表示的)程序状态的变化做出反应
- 不足:难以对系统状态的变化做出反应
- 磁盘或网络适配器的数据到达
- 除零错误
- 用户的键盘输入( Ctrl-C )
- 系统定时器超时
- 上述系统变化不能用程序变量表示
- 现代计算机系统需要针对“控制流发生突变”的情况做出反应,称为“异常控制流”机制
异常控制流(Exceptional Control Flow)
- 发生在计算机系统的所有层次
- 低层机制(硬件层)
- 1.异常 (Exceptions)
- 硬件检测到的事件会触发控制转移到异常处理程序
- 操作系统和硬件共同实现
- 1.异常 (Exceptions)
- 高层机制
- 2. 进程切换(Process context switch)
- 通过操作系统和硬件定时器实现
- 3. 信号(Signals)
- 操作系统实现
- 4. 非本地跳转(Nonlocal jumps): setjmp() and longjmp()
- C运行库实现
- 2. 进程切换(Process context switch)
总结
- 异常Exceptions
- 需要非常规控制流的事件
- 外部产生——中断
- 内部产生——陷阱和故障
- 进程Processes
- 任何给定的时间,系统中都有多个活动进程
- 但是,在单个内核上,一个时刻只能有一个进程执行
- 每个进程似乎完全拥有处理器和私有内存空间(的控制)
- 创建进程
- fork:1次调用、2次返回
- 进程退出
- exit:1次调用、0次返回
- Reaping and waiting for processes
- Call wait or waitpid
- 加载和运行程序
- execve (或exec函数的其他变体)
- 一次调用,0次返回(如没有错误)
8.1 异常
-
异常是指为响应某个事件将控制权转移到操作系统内核中的情况
- 内核指操作系统常驻内存的部分
- 事件示例:被零除、算术运算溢出、缺页、 I/O请求完成、键盘输入
- 每种类型的事件有一个唯一的异常号(Exception numbers )k
- 异常号k是到异常表的索引(又名中断向量)
- 任何时候异常k发生,则异常k的处理程序立刻被调用
异常表(中断向量表)是一张跳转表,表目k包含异常k的处理程序代码的地址