异常
当cpu在执行运行在用户态下的程序时,发生了一些没有预知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关进程中,也就是切换到了内核态,如缺页异常。
外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令而转到与中断信号对应的处理程序去执行,如果前面执行的指令时用户态下的程序,那么转换的过程自然就会是 由用户态到内核态的切换。如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。
中断和异常的区别
中断分为外中断和内中断。
外中断——就是我们指的中断——是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;
内中断——就是异常——是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。
异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。
中断则是由于系统中某事件引起的,该事件与现行指令无关。
相同点:都是CPU对系统发生的某个事情做出的一种反应。
区别:中断由外因引起,异常由CPU本身原因引起。
中断的引入——为了支持CPU和设备之间的并行操作
异常的引入——表示CPU执行指令时本身出现的问题
中断(外中断)的常见事件有:I/O中断,时钟中断,硬件故障
异常(内中断)的常见事件有:系统调用,页故障、页错误,保护性异常,断点指令,其他算数型异常(算数溢出等)
类别 | 原因 | 同步/异步 | 返回行为 |
中断(外中断) interrupt | 来自I/O部件或其他硬件设别 | 异步 | 总是返回到下一条指令 |
陷入trap | 有意识安排的错误 | 同步 | 返回到下一条指令 |
故障fault | 可恢复的错误 | 同步 | 返回到当前指令 |
终止abort | 不可恢复的错误 | 同步 | 不会返回 |