操作系统:中断和异常-爱代码爱编程
一、中断的类型
内中断(异常):与当前CPU的执行的指令有关,中断信号来自CPU内部
外中断:与当前CPU的执行的指令无关,中断信号来自CPU外部
(注:在大部分教材中,“中断”是狭义的中断,指外中断;而内中断则称为异常)
内中断分类:陷入中断、故障中断、异常中断
陷入中断:由陷入指令(非特权指令)引发,是应用程序故意引起。比如应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令——陷入指令,该指令会引发一个中断信号。执行陷入指令意味着应用程序主动放弃CPU的使用权,将CPU的使用权交给操作系统内核。 “系统调用”就是通过陷入指令实现的。
故障中断:由错误条件引起,可能被内核程序修复,内核程序修复后会把CPU使用权交还给应用程序,使应用程序继续执行。比如CPU执行除法指令发现除数是0,该指令是非法的。比如缺页故障。
异常中断:由致命错误引起,内核程序无法修复,因此一般不在将CPU的使用权交还给引发该中断信号的应用程序,而是直接终止该应用程序的运行。比如非法使用特权指令。
外中断的分类:时钟中断、I/O中断等
时钟中断:实现并发运行。由时钟部件发出中断信号,时钟部件每隔一个时间片(假设为50ms)就会给CPU发送一个时钟中断信号。起初,应用程序A在CPU上运行,执行一系列的指令,当时钟部件检测到应用程序A已经运行了50ms时,会向CPU发出中断信号。CPU检测到中断信号转化为内核态,由处理时钟中断信号的内核程序上CPU运行,处理完成后转换为用户态,将CPU的使用权交给应用程序B。应用程序B上CPU运行,执行一系列的指令,当时钟部件又检测到应用程序B已经运行了50ms,又会向CPU发出时钟中断信号……如此往复实现程序的并发运行。
I/O中断:由输入/输出设备发出中断信号。比如打印机在工作时,打印任务执行完毕后,回向CPU发出中断信号,CPU检测到中断信号转换为内核态,由相对应的内核程序去处理该中断信号
补充:CPU每执行一条指令都是例行去检查是否有中断信号
二、中断的作用
CPU上会运行两种程序——应用程序和内核程序。在合适的时间内,内核程序会主动让出CPU的使用权交给应用程序,但是应用程序无法主动让出CPU的使用权交给内核程序,只能通过中断来实现。中断是操作系统内核夺回CPU使用权的唯一途径。
如果没有中断,那么一旦应用程序上CPU运行,那么CPU就会一直运行这个程序,并发运行程序又从何而来?因此中断是实现并发运行必不可少的。
三、中断机制的基本原理
不同的中断信号需要由不同的中断处理程序(内核程序)去处理。当CPU检测到中断信号时,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中存放的位置。