操作系统中的中断是什么?

2025 年 4 月 28 日 | 阅读 9 分钟

中断是一种由硬件或软件发出的信号,用于指示一个进程或事件需要立即处理。它会通知处理器有一个高优先级的进程需要中断当前正在执行的进程。在 I/O 设备中,其中一条总线控制线专为此目的而设,称为 **中断服务例程** (ISR)。

当设备向进程发出中断请求时,处理器首先会完成当前指令的执行。然后,它会将 **程序计数器** (PC) 加载为 ISR 第一条指令的地址。在将程序计数器加载为地址之前,中断指令的地址会被移动到一个临时位置。因此,在处理完中断后,处理器可以继续进行原来的进程。

当处理器处理中断时,它必须告知设备其请求已被识别,以停止发送中断请求信号。此外,保存寄存器以便将来可以恢复被中断的进程会增加从接收中断到 ISR 执行开始之间的时间延迟。这被称为 **中断延迟**。

What is Interrupt in OS

一台计算机一次只能执行一个计算机指令。但是,由于它可以被中断,所以它可以管理程序或指令集的执行方式。这被称为 **多任务处理**。它允许用户同时执行许多不同的任务,而计算机则负责管理用户启动的程序。当然,计算机以极快的速度运行,使得所有用户任务似乎都在同时进行。

操作系统通常包含一些称为 **中断处理程序** 的代码。中断处理程序会为中断设置优先级,并在有多个中断等待处理时将它们保存在队列中。操作系统还有一个名为 **调度程序** 的小程序,它负责决定下一个要控制的程序。

中断类型

中断信号可能因硬件或软件事件而发出。它们分别被归类为 **硬件中断** 或 **软件中断**。

What is Interrupt in OS

1. 硬件中断

硬件中断是一种与硬件状态相关的条件,可能由外部硬件设备发出信号,例如 PC 上的中断请求 (IRQ) 线,或者被嵌入处理器逻辑中的设备检测到,以告知操作系统该设备需要关注。例如,按下键盘按键或移动鼠标会触发硬件中断,导致处理器读取按键或鼠标位置。

硬件中断可能与处理器时钟异步到达,并且可能在指令执行的任何时候发生。因此,所有硬件中断信号都通过与处理器时钟同步的条件进行处理,并且仅在指令执行边界起作用。

在许多系统中,每个设备都与一个特定的 IRQ 信号相关联。这使得能够快速确定哪个硬件设备正在请求服务并加快对该设备的响应速度。

在一些旧系统中,所有中断都转到同一个位置,然后操作系统使用专用指令来确定最高优先级的未屏蔽中断。在现代系统中,通常为每种类型的中断或每个中断源都有一个不同的中断例程,通常实现为一个或多个中断向量表。硬件中断进一步分为两种类型,例如:

  • 可屏蔽中断:处理器通常有一个内部中断屏蔽寄存器,允许选择性地启用和禁用硬件中断。每个中断信号都与屏蔽寄存器中的一个位相关联;在某些系统上,当设置位时启用中断,当清除位时禁用中断;而在其他系统上,设置位会禁用中断。当禁用中断时,处理器将忽略相关的中断信号。受屏蔽影响的信号称为 **可屏蔽中断**。
    中断屏蔽不会影响某些中断信号,因此无法禁用;这些称为 **不可屏蔽中断** (NMI)。NMI 指示需要立即处理且在任何情况下都不能忽略的高优先级事件,例如看门狗定时器的超时信号。
    **屏蔽** 中断是禁用它,而 **取消屏蔽** 中断是启用它。
  • 虚假中断
    虚假中断是指找不到源头的硬件中断。术语“幻影中断”或“幽灵中断”也可能用于描述这种现象。虚假中断往往是连接到电平敏感处理器输入的有线 OR 中断电路的一个问题。当系统出现故障时,可能很难识别此类中断。
    在有线 OR 电路中,通过中断线的偏置电阻产生的寄生电容充/放电会在处理器识别到中断源已被清除之前产生短暂的延迟。如果在中断服务例程 (ISR) 中清除中断设备的时间太晚,那么在 ISR 的当前实例终止之前,中断电路将没有足够的时间返回到静止状态。结果是处理器会认为还有一个中断正在等待,因为其中断请求输入端的电压既不高也不低,无法建立明确的内部逻辑 1 或逻辑 0。这种看似中断的中断没有可识别的源头,因此称为虚假中断。
    如果 ISR 没有考虑到可能发生此类中断的情况,虚假中断可能导致系统死锁或其他未定义的操作。由于虚假中断主要是有线 OR 中断电路的问题,因此在这些系统中,良好的编程习惯是 ISR 检查所有中断源的活动,如果没有任何源头正在中断,则不执行任何操作。

2. 软件中断

处理器在执行特定指令或满足某些条件时会请求软件中断。每个软件中断信号都与一个特定的中断处理程序相关联。

软件中断可能通过执行一条特殊的指令来有意触发,该指令在设计时执行时会调用中断。此类指令的功能类似于子程序调用,并用于各种目的,例如请求操作系统服务和与设备驱动程序交互。

软件中断也可能由于程序执行错误而意外触发。这些中断通常称为 **陷阱** 或 **异常**。

处理多个设备

当多个设备发出中断请求信号时,需要附加信息来决定首先考虑哪个设备。以下方法用于决定首先选择哪个设备:

What is Interrupt in OS
  1. 轮询
    在轮询中,首先遇到的 IRQ 位被设置的设备将被首先服务,并调用相应的 ISR 来服务它。它易于实现,但通过查询所有设备的 IRQ 位会浪费大量时间。
  2. 向量中断
    在向量中断中,请求中断的设备通过在总线上发送一个特殊代码直接标识自身。这使得处理器能够识别生成中断的设备。特殊代码可以是 ISR 的起始地址,也可以是 ISR 在内存中的位置,这被称为 **中断向量**。
  3. 中断嵌套
    在此方法中,I/O 设备按优先级结构进行组织。因此,来自高优先级设备的请求会得到识别,而低优先级设备的请求则不会。处理器仅接受来自优先级高于自身的设备/进程的中断。
    处理器的优先级编码在 PS(进程状态寄存器)的几位中,可以通过写入 PS 的程序指令来更改。处理器仅在执行 OS 例程时处于监督模式,在执行应用程序之前会切换到用户模式。

中断处理

我们知道指令周期包含取指、解码、执行和读/写功能。在每个指令周期之后,处理器都会检查是否有中断需要处理。如果系统中没有中断,它将继续执行由指令寄存器给出的下一个指令周期。如果存在中断,它将触发中断处理程序。处理程序将停止当前正在处理的指令,将其配置保存在寄存器中,并从中断向量表中给出的位置加载中断的程序计数器。

在处理器处理完中断后,中断处理程序将从保存的寄存器中加载指令及其配置。进程将从中断处恢复执行。保存旧指令的处理配置并加载新中断配置的过程也称为 **上下文切换**。有不同类型的中断处理程序。

  1. **第一级中断处理程序** (FLIH) 是硬中断处理程序或快速中断处理程序。这些中断处理程序在进程执行时具有较高的抖动,它们主要是可屏蔽中断。
  2. **第二级中断处理程序** (SLIH) 是软中断处理程序和慢速中断处理程序。这些中断处理程序具有较低的抖动。

中断处理程序也称为中断服务例程 (ISR)。ISR 的主要特点是:

  • 中断可能在任何时间发生,并且它们是异步的,ISR 可以调用异步中断。
  • 中断服务机制可以调用多个源的 ISR。
  • ISR 可以处理可屏蔽和不可屏蔽中断。程序中的指令可以禁用或启用 ISR 的调用。
  • ISR 在执行开始时会禁用其他设备的终端服务。ISR 执行完成后,它将重新初始化中断服务。
  • ISR 允许嵌套中断以分流到其他 ISR。

中断延迟

当发生中断时,通过执行 ISR 来服务中断可能不会立即通过上下文切换开始。中断发生与 ISR 执行开始之间的时间间隔称为中断延迟。

  • Tswitch = 上下文切换所需时间
  • ΣTexec = 执行 ISR 的时间间隔总和
  • 中断延迟 = Tswitch + ΣTexec

CPU 如何响应中断

理解操作系统工作原理的关键点在于了解 CPU 在发生中断时所做的事情。CPU 硬件为每次中断执行相同的操作,从而允许操作系统从当前正在运行的用户进程手中夺取控制权。切换正在运行的进程以执行内核代码称为 **上下文切换**。

CPU 依赖几个寄存器中的数据来正确处理中断。一个寄存器保存指向当前正在运行进程的进程控制块的指针,并且每次将进程加载到内存时都会设置此寄存器。另一个寄存器保存指向包含指向操作系统内核中用于中断处理程序和系统调用的指令的指针的表的指针。当操作系统在启动时初始化时,此寄存器中的值和表的内容就会被设置。CPU 执行以下操作以响应中断:

  1. 使用指向当前进程控制块的指针,保存状态和所有寄存器值,以便在稍后重新启动进程时使用。
  2. CPU 模式位切换到监督模式。
  3. 使用指向中断处理程序表和中断向量的指针,确定要执行的内核代码的位置。中断向量是硬件中断的 IRQ,或者是用于软件中断的中断汇编语言指令的参数。
  4. 处理切换到内核的适当部分。
What is Interrupt in OS

CPU 使用表和中断向量来查找 OS 以响应中断的代码。下面的图显示了一个软件中断。

What is Interrupt in OS

随着计算机的运行,处理会在接收到硬件和软件中断时在用户进程和操作系统之间切换。

触发方法

每个中断信号输入都被设计为由逻辑信号电平或特定信号边沿(电平转换)触发。电平敏感输入会持续请求处理器服务,只要输入到特定(高或低)逻辑电平。边沿敏感输入对信号边沿做出反应:特定的(上升或下降)边沿将导致服务请求被锁存。当执行中断处理程序时,处理器会重置锁存器。

What is Interrupt in OS

1. 电平触发

电平触发中断是通过将中断信号保持在其特定的(高或低)活动逻辑电平来请求的。设备通过将信号驱动到活动电平并保持在那里来调用电平触发中断。当处理器发出命令时,通常是在设备被服务之后,它会取消信号。

处理器在每个指令周期中对中断输入信号进行采样。如果在采样时断言了信号,处理器将识别中断请求。

电平敏感输入允许多个设备通过有线 OR 连接共享一个公共中断信号。处理器进行轮询以确定哪些设备正在请求服务。在服务完一个设备后,处理器可能会再次进行轮询,并在必要时,在退出 ISR 之前服务其他设备。

2. 边沿触发

边沿触发中断是通过中断线上的电平转换(下降沿(高到低)或上升沿(低到高))发出的中断。希望发出中断的设备会将一个脉冲驱动到线上,然后将其释放到其非活动状态。如果脉冲太短以至于无法被轮询 I/O 检测到,那么可能需要特殊的硬件来检测它。