计算机中断
计算机中断
1 什么是中断
中断[1](英语:Interrupt),又称插断,在计算机科学中是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应予以注意,这种情况就称为中断。
2 中断是如何工作的
计算机中的中断机制是CPU和操作系统共同配合的结果。
-
CPU层面的机制:
中断在硬件层面是由CPU管理的。CPU中内置了处理中断的硬件电路,当接收到中断信号时,它会暂停当前正在执行的指令,将程序计数器(PC)和相关寄存器的内容保存起来,然后跳转到一个预定义的中断处理程序的入口地址。CPU需要具备检测中断信号、保存现场(当前程序的状态)、并执行相应的中断处理程序的能力。 -
操作系统层面的机制:
中断处理程序(Interrupt Service Routine, ISR)通常是由操作系统编写和管理的。操作系统负责:- 注册和管理中断处理程序。
- 响应不同的中断类型(如硬件中断、软件中断、时钟中断等)。
- 保存和恢复进程的上下文,确保中断处理完毕后能够恢复正常程序执行。
- 控制任务调度,在多任务环境下,当中断发生时,操作系统会决定是继续运行当前任务,还是切换到其他任务。
因此,中断机制的基础来自于CPU硬件支持,而操作系统负责管理中断的高层逻辑。两者紧密协作,确保中断处理的高效和系统的正常运行。
一般来说,中断的优先级高于普通进程
3 中断的种类
3.1 硬件中断
硬件中断是由计算机外部硬件设备(如键盘、鼠标、硬盘、网络接口等)或内部硬件组件(如定时器、控制器)生成的信号,用来通知CPU发生了某个事件,要求CPU暂停当前任务并立即进行处理。这是一种异步的通信方式,能够确保外部设备与CPU高效互动。
- 键盘中断:当你按下一个键时,键盘发送一个中断信号给CPU,CPU暂停当前任务,读取按键数据。
- 鼠标中断:移动鼠标时,鼠标发送中断信号给CPU,CPU响应并处理移动事件。
- 定时器中断:系统定时器会周期性地向CPU发送中断信号,用于管理任务调度和系统时钟。
3.2 软件中断
软件中断是由程序通过特定的指令主动触发的中断,它通常用于实现系统调用或处理特定的程序异常。与硬件中断不同,软件中断是由软件发出的,而不是由外部设备或硬件组件引发的。
- 系统调用(System Call): 软件中断最常见的用途是实现系统调用。当应用程序需要操作系统提供的服务(如文件读写、内存分配、网络通信等)时,它会触发一个软件中断。操作系统会捕获该中断并执行相应的服务,随后返回给应用程序。这种机制让用户程序能够安全、受控地访问操作系统的资源。
- 异常处理(Exception Handling): 当程序运行时发生某些异常(如除零错误、非法内存访问),CPU会自动触发软件中断,进入异常处理程序进行处理。
- 调试(Debugging): 软件中断也可以用于调试。例如,调试器通过在代码中插入断点,利用软件中断暂停程序的执行,检查当前状态,从而帮助开发者进行故障排查。
3.3 Linux 中断处理
Linux 将中断处理过程分成了两个阶段,也就是上半部和下半部:
- 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。 对应硬中断,快速执行
- 下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。 对应软中断,延迟执行
3.3.1 查看中断
- /proc/softirqs 提供了软中断的运行情况;
CPU0 CPU1
HI: 32 4
TIMER: 217168 160788
NET_TX: 58113 1
NET_RX: 73923 35
BLOCK: 12544 10
IRQ_POLL: 0 0
TASKLET: 2802 54
SCHED: 283839 258237
HRTIMER: 0 0
RCU: 116166 128092
具体字段解释如下:
- HI:高优先级软中断,用于处理非常紧急的软中断任务,极少使用。
- TIMER:定时器软中断,系统定时器触发的中断。用于定期任务(如进程调度、系统计时)的处理。
- NET_TX:网络传输(发送)软中断,处理网络数据包的发送。
- NET_RX:网络接收软中断,处理网络数据包的接收。
- BLOCK:块设备 I/O 的软中断,处理硬盘等块设备的 I/O 操作。
- BLOCK_IOPOLL:块设备 I/O 轮询软中断,处理块设备的 I/O 轮询操作,通常在高性能场景中用到。
- TASKLET:任务队列(Tasklets),用于延迟执行一些非紧急任务。
- SCHED:调度软中断,触发进程调度相关的任务。
- HRTIMER:高精度定时器软中断,用于高精度计时任务。
- RCU:RCU(Read-Copy Update)软中断,RCU 是 Linux 内核中的一种同步机制,通常用于读写锁的管理和延迟删除任务。
软中断实际上是以内核线程的方式运行的,每个 CPU 都对应一个软中断内核线程,这个软中断内核线程就叫做 ksoftirqd/CPU 编号。
wudanyang@dy-turbo-vm:~$ ps aux | grep softirq
root 16 0.0 0.0 0 0 ? S 02:08 0:00 [ksoftirqd/0]
root 24 0.0 0.0 0 0 ? S 02:08 0:00 [ksoftirqd/1]
- /proc/interrupts 提供了硬中断的运行情况。 硬件中断输出示例
4 参考
中断 - 维基百科,自由的百科全书: https://zh.wikipedia.org/wiki/中斷 ↩︎
本站总访问量次 本站访客数人次 本文总阅读量次