文章目录
- 1.3_2 中断和异常
- (一)中断的作用
- (二)中断的类型
- 1、内中断
- 2、外中断
- 3、中断分类总结
- (三)中断机制的基本原理
- 总结
1.3_2 中断和异常
(一)中断的作用
CPU上会运行两种程序,一种是操作系统内核程序(是整个系统的管理者),一种是应用程序。
在合适的情况下(详见第二章进程管理),操作系统内核会把CPU的使用权主动让给应用程序。
“中断”是让操作系统内核夺回CPU使用权的唯一途径。
一旦发生中断,就会让CPU停止当前执行的应用程序,转而去执行相应的操作系统内核程序。
即,“中断”会使CPU由用户态变为内核态,使操作系统重新夺回对CPU的控制权。
如果没有“中断”机制,那么一旦应用程序上CPU运行,CPU就会一直运行这个应用程序。
而如果CPU一直执行同一个应用程序,又何来“多道程序并发”这件事情呢?
所以,没有中断技术,就没办法实现“并发”。甚至可以说,没有中断技术,就没有操作系统。
1)内核态 —> 用户态:执行一条特权指令——修改PSW标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权。
2)用户态 —> 内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权。
(二)中断的类型
- 内中断:与当前执行的指令有关,中断信号来源于CPU内部。
- 外中断:与当前执行的指令无关,中断信号来源于CPU外部。
1、内中断
例子1:应用程序执行特权指令
如果应用程序中被植入了一条特权指令,那么,当CPU执行到这条特权指令时,会因指令非法而触发中断信号,CPU会拒绝执行这一条特权指令。
接下来,CPU会自动地转变为内核态,并且会开始执行“处理中断信号”相关的内核程序。
这就是一个内中断的典型例子。应用程序执行非法指令,从而引起CPU重新接管控制权。
例子2:应用程序执行非特权指令(除法指令,但除数为0)
除了这种情况(用户态下执行特权指令),也有非特权指令引起的内中断,例如:执行除法指令时发现除数为0。
总之,若当前执行的指令是非法的(指令本身是非法的,或者指令中的一些参数非法),则会引发一个中断信号。
例子3:应用程序主动请求操作系统接管(陷入指令)
有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令——陷入指令,该指令会引发一个内部中断信号。
执行“陷入指令”,意味着应用程序主动地将CPU控制权还给操作系统内核。“系统调用”就是通过陷入指令完成的。
注意:“陷入指令”是一种特殊的指令,但绝对不是特权指令。“陷入指令”是在用户态下执行的一条指令(并没有被CPU拒绝执行),既然如此,“陷入指令”肯定不是特权指令。
2、外中断
例子1:时钟中断(由时钟部件发来的中断信号)
时钟部件:每隔一个时间片(如50ms),会给CPU发送一个时钟中断信号。
例如,有两个应用程序。当应用程序1的指令1、指令2执行之后,时间已经达到50ms,因此时钟部件发送一个时钟中断信号。
无论是内中断还是外中断,都是中断。既然是中断,那么CPU遇到它时,就会变为内核态,转而执行对应的“处理中断的内核程序”。在此处是“处理时钟中断的内核程序”。
当“处理时钟中断的内核程序”执行完毕后,又要回归用户态,去继续执行应用程序了。
那么,此时是继续执行应用程序1的后续指令,还是执行应用程序2?
由于刚才应用程序1已经用了一个时间片了,接下来,公平起见,它会让应用程序2上CPU运行。
操作系统内核决定接下来让另一个应用程序上CPU运行。
应用程序2的执行同理,在一个时间片后,进行时钟中断,并在接下来转而执行应用程序1……
**注:**由上述过程可以得知,两个应用程序是如何依靠时钟中断实现并发运行、相互切换的。可见,“中断”在计算机当中有多大的作用。
例子2:I/O中断——由输入/输出设备发来的中断信号
例如,有的应用程序会请求打印机的打印服务。在打印机打印完毕后,打印机会向CPU发送中断信号,用来通知CPU:它的输入/输出任务已经完成了,可以去进行其他操作了。
同理,这也是一个中断,因此CPU会执行相应的“处理中断的内核程序”,在此处叫做“处理I/O中断的内核程序”。
总之,上述两个例子中,中断信号都来自于CPU外部,与当前执行的指令内容没有关系。
注:CPU在每一条指令执行结束时,都会例行检查是否有外中断信号。
3、中断分类总结
中断的分类
1)内中断(也称:异常、例外)
与当前执行的指令有关,中断信号来自CPU内部。
a.陷阱、陷入(trap):由陷入指令引发。实际上,这是应用程序”故意“引发的,用来请求操作系统提供相应服务。
b.故障(fault):由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把CPU的使用权还给应用程序,让它继续执行下去。如:缺页故障(详见第三章)。
c.终止(abort):由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如:除数为0、非法使用特权指令。
例如除数为0,这是程序本身的bug,内核程序当然没办法修复它,只能把它干掉。
2)外中断(也称:中断)
与当前执行的指令无关,中断信号来自CPU外部。
a.时钟中断
b.I/O中断请求
注意:
内中断、外中断这两个名称,可以很形象地理解两者的本质区别。
但实际上在很多教材、考试中,内中断也称“异常、例外”,而外中断则直接称为“中断”。
因此,在教材中、考试中,很多时候遇到的“中断”就是一种狭义的中断——特指外中断。
而本节中提到的“中断”是广义的中断——包括内中断、外中断。
总之:大多数的教材、试卷中,“中断”特指狭义的中断,即外中断,而内中断一般称为“异常”。
(三)中断机制的基本原理
这么多的中断类型,不可能用同一种中断处理程序来处理。所以,CPU要根据中断类型的不同,去找到相对应的中断处理程序。
不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。
显然,中断处理程序一定是内核程序,需要运行在“内核态”。
具体细节见计组这门课,对于操作系统,理解到此即可。