异常

1. 异常

  这里说的异常不是通常所说的软件编程中的"异常处理",而是指令流的一种突变,用来响应系统中的某些变化。异常是由硬件和操作系统共同实现的,处理器执行当前指令时,处理器检测到系统发生了某个事件,便调用异常处理程序来处理这个事件,如下图所示:

  

 异常处理之后,有三种可能:

  终止程序指令流的执行;

  返回到被中断的指令继续执行(当前指令);

  返回到下一条指令继续执行;

 

2. 异常表

  操作系统会分配和初始化一张异常表,异常表中的条目指出异常处理程序的地址,每个异常都有一个异常号,即在异常表中的索引。异常表的起始地址保存在异常表基址寄存器中。

 

3. 异常的分类

 异常可以分为四种类型:中断、陷阱、故障、终止。

(1)中断

  中断是来自CPU外部I/O设备的信号,例如:磁盘I/O中断、定时器中断等。中断对应的异常处理程序叫做中断处理程序,中断返回后会执行指令流中的下一条指令。

(2)陷阱

  陷阱是一种有意为之的异常,是执行当前指令的结果,陷阱用来实现系统内核和用户程序之间的一个过程调用的接口,即系统调用。陷阱返回后也是执行指令流中的下一条指令。

  Linux系统提供了多种系统调用,如:结束进程、读写文件等。

(3)故障

  故障是执行当前指令时遇到了错误,当故障发生时,转到故障处理程序执行,执行完后,可能返回到被中断的原指令继续执行(例如:缺页异常),也有可能故障不可恢复而直接终止(例如:段错误)。

(4)终止

  终止是执行当前指令时遇到了不可恢复的致命错误,通常是硬件错误,程序直接终止。

 

4. 上下文切换

  操作系统内核使用上下文切换机制来实现多个任务的并发执行,操作系统通过上下文切换机制将控制流转移到新的进程,上下文切换建立在前述的基本异常基础之上。

  上下文切换通常包括三个步骤:

  (1)保存当前进程的上下文

  (2)恢复下面要执行的进程的(之前被抢占的进程)上下文

  (3)将控制转移到下面要执行的进程

 

5. 信号

  信号是一种高层的软件形式的异常,信号通常用于进程间的通信。

  (1)发送信号

  内核通过更新进程上下文中的某个状态来发送一个信号给目的进程。

  (2)接收信号

  目的进程对信号作出反应就表示接收了该信号,目的进程可以执行信号处理程序(用户层函数)来处理信号或者简单的忽略该信号

  目的进程正在执行某个信号处理程序时,收到另一个信号,则该信号便成为待处理信号。对于每种类型,至多只允许有一个待处理信号,已经有一个待处理信号之后,同一个类型后来的信号将被丢弃。

 

 

参考资料 《深入理解计算机系统》

posted @ 2015-08-22 23:20  jqc  阅读(330)  评论(0编辑  收藏  举报