陷阱和中断的区别

前言

一次鼠标点击,键盘敲击或是 U 盘插入,操作系统都能快速响应,这是因为操作系统是按照事件驱动范式来设计的,前面所说的事件都属于外部事件,操作系统内部执行程序时也会有事件发生,比如除法溢出,程序返回等等,这些都属于内部事件。不管是哪种事件,都会触发操作系统的应对策略,并且这些策略的执行不是发生在普通应用程序执行时的用户态,而是一种特权模式,被称为内核态

陷阱 Trap

陷阱是一个非常生动的描述,程序的执行过程就好像一只老鼠寻找食物一样,如果一不小心突然碰到了人为设置的陷阱(比如夹子),那么就只能任人摆布了。准确地说,陷阱是由用户进程中的异常触发产生的同步中断。一般来说,是内部事件产生的异常,正如前言所说的,除以 0,非法地址访问或者是程序调试时设置的断点。陷阱会让操作系统进入内核态并执行相应的处理程序,处理完成后再返回用户态继续执行之前的程序,这就是它的同步性。

trap-execution

因此,陷阱可以被看作是异常的一种。发生时,操作系统会将栈寄存器,指令寄存器和通用寄存器入栈,这就是我们常说的保存上下文;对应的,恢复上下文就是这些寄存器出栈,程序从上次暂停的地方恢复执行。

举个例子,比如第一次学 C 语言时,我们会在 main 函数中写下这样的代码:

printf("%s\n", "Hello World");

printf 背后是许多系统调用(可以用strace命令查看),即通过端口往显存的某块区域写下字符串 "Hello World"

中断 Interrupt

中断是要求操作系统立即注意的硬件或软件信号,它通知 CPU 需要马上放下手头上的事,转而去执行另一些需要紧急执行的事情。在这种情况下,当前执行的进程会被暂停。

所有的现代计算机都是中断驱动的。程序的执行开始后,CPU 会执行一系列指令,直到它完成或者遇到中断为止。此外,一种特殊的控制总线被称为 ISR(Interrupt Service Routine) 处理所有 I/O 设备的中断。

CPU 内部有一个用于接收中断信号的中断引脚。中断引脚连接一些硬件设备比如键盘或者网卡等。当在键盘上按下一个键时,一个中断信号就产生了,随后,操作系统改变上下文并且调用键盘中断处理程序,执行完成后再切换到之前的进程。

interrupt-execution

一般来说,多个硬件设备使用中断控制器共享同一个中断引脚,为了确定是哪一个设备产生的中断,处理器会询问中断控制器,然后根据信号找到中断调度表,跳转到指定位置执行相应的中断处理程序。

中断是异步的,这是因为 CPU 在执行完一条指令后会检查中断寄存器,以 8086 系统举例,会检查 IF 标志寄存器,对于可屏蔽中断来说,如果 IF1,CPU 在执行完当前指令之后会响应中断并且执行优先级较高的那个,如果 IF0,则不响应中断,直接执行下一条指令。这个异步指的是 CPU 当前的执行流和中断处理程序之间的关系。

总结

陷阱相当于是操作系统级别的回调函数,中断则是为了支持指硬件与程序的并行。

版本控制

Version Action Time
1.0 Init 2021-12-28
1.1 Update summary 2022-01-04