https://www.crifan.com/files/doc/docbook/interrupt_related/release/htmls/index.html
中断interrupt
单说中断一般指的是硬件中断,外部设备发生了某些事件,通知CPU,然后CPU跳转到相应的ISR(中断处理程序 interrupt service routine),执行完再回来执行下一条指令。
为什么要有中断
针对外设IO的场景:
因为外设IO要远慢与CPU的指令执行速度,CPU指令执行的速度是ns级别的,而外设IO的速度是ms级别的。
假如没有中断要操作外设,CPU一步步按指令顺序执行,CPU给外设发送一个指令,外设开始执行相应的动作,然后CPU开始读取外设的状态,因为CPU指令的执行很快,结果就是CPU执行了多次读取结果的指令(轮询),得到的结果都是外设IO未完成,浪费了CPU时间。
而中断是CPU该干嘛干嘛,不用轮询,等外设的活干完了,再自动发送一个中断给CPU。
轮询poll的含义是:循环等待事件完成
异常 exception
异常时当前指令做出了非法操作,不如除0,内存的非法访问
陷阱 trap
陷阱又叫软件中断,软件的含义是这种中断是由指令完成的,在x86系统中,就是对应的int指令。CPU执行了int指令,然后跳转到对应的软中断处理函数中,陷阱是软件本身的,是程序员故意实现的,常用用于调试。
广义的中断
广义的中断指种植打断正在执行的CPU,所以前面介绍的中断、异常、陷阱都可以叫中断。
Linux的中断
Linux将中断的处理过程分成了连个阶段:上半部和下半部
- 上半部就是硬中断,直接处理硬件请求。快速执行
- 下半部内核触发,软中断,以内核线程方式运行。
上半部会打断CPU的执行,立即处理中断处理程序。下半部每个CPU都对应一个软中断内核线程,比如叫ksoftirqd/0
,0就是CPU编号。
/proc/softirqs
提供了软中断的运行情况;
/proc/interrupts
提供了硬中断的运行情况。
1 |
|