Linux中断(interrupt)机制
1 中断是什么?
Linux 内核需要对连接到计算机上的所有硬件设备进行管理,毫无疑问这是它的份内事。如果要管理这些设备,首先得和它们互相通信才行,一般有两种方案可实现这种功能:
轮询(polling) 让内核定期对设备的状态进行查询,然后做出相应的处理; 中断(interrupt) 让硬件在需要的时候向内核发出信号(变内核主动为硬件主动)。
第一种方案会让内核做不少的无用功,因为轮询总会周期性的重复执行,大量地耗用 CPU 时间,因此效率及其低下,所以一般都是采用第二种中断的方案。
简单的来说,中断是为了快速响应硬件的事件,打断进程的正常调度和执行,转而调用中断处理程序的一种方法。
服务完毕后再返回去继续运行被暂时中断的程序。
linux中把中断处理过程粉尘了两个阶段,也就是上半部和下半部。
上半部用来快速处理中断 ,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。
下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行
网卡收包的例子:
网卡接收到数据包后,会通过硬件中断的方式,通知内核有新的数据到了。这时,内核就应该调用中断处理程序来响应它。 对上半部来说,既然是快速处理,其实就是要把网卡的数据读到内存中, 然后更新一下硬件寄存器的状态(表示数据已经读好了),最后再发送一个**软中断**的信号, 通知下半部做进一步处理。而下半部被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序。 简单理解: 上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行; 而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行。
查看软中断和内核线程 (top命令里面的si参数)
cat /proc/softirqs CPU0 HI: 0 TIMER: 174597 NET_TX: 7074 网络接收中断 NET_RX: 276518 网络发送中断 BLOCK: 21801 BLOCK_IOPOLL: 0 TASKLET: 1 最常用软中断实现机制 SCHED: 0 内核调度 HRTIMER: 1024 RCU: 50727 锁
软中断实际上是内核线程的方式运行的,每个CPU都对应一个软中断内核线程,这个软中断内核线程就叫做ksoftirqd/CPU编号。
ps aux | grep softirq root 3 0.0 0.0 0 0 ? S 09:00 0:00 ==[ksoftirqd/0]==
注意,这些线程的名字外面都有中括号,这说明 ps 无法获取它们的命令行参数(cmline)。一般来说,ps 的输出中,名字括在中括号里的,一般都是内核线程。
查看硬中断
cat /proc/interrupts CPU0 0: 58 IO-APIC-edge timer 1: 10 IO-APIC-edge i8042 8: 0 IO-APIC-edge rtc0 9: 0 IO-APIC-fasteoi acpi 12: 156 IO-APIC-edge i8042 16: 245579 IO-APIC-fasteoi eth1 19: 37450 IO-APIC-fasteoi eth0 20: 28082 IO-APIC-fasteoi vboxguest 21: 24850 IO-APIC-fasteoi ahciNMI: 0 Non-maskable interruptsLOC: 1083883 Local timer interruptsSPU: 0 Spurious interruptsPMI: 0 Performance monitoring interruptsIWI: 52326 IRQ work interruptsRTR: 0 APIC ICR read retriesRES: 0 Rescheduling interruptsCAL: 0 Function call interruptsTLB: 0 TLB shootdownsTRM: 0 Thermal event interruptsTHR: 0 Threshold APIC interruptsMCE: 0 Machine check exceptionsMCP: 61 Machine check pollsERR: 0MIS: 0
硬中断可以分为以下几种:
可屏蔽中断(maskable interrupt)。硬件中断的一类,可通过在中断屏蔽寄存器中设定位掩码来关闭。
非可屏蔽中断(non-maskable interrupt,NMI)。硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭。典型
例子是时钟中断(一个硬件时钟以恒定频率—如50Hz—发出的中断)。
处理器间中断(interprocessor interrupt)。一种特殊的硬件中断。由处理器发出,被其它处理器接收。仅见于多处理器系统,以便于处理器间通信或同步。 伪中断(spurious interrupt)。一类不希望被产生的硬件中断。发生的原因有很多种,如中断线路上电气信号异常,或是中断请求设备本身有问题。
不同:
软中断是执行中断指令产生的,而硬中断是由外设引发的(硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等)。
硬中断的中断号是由中断控制器提供的,软中断的中断号是由指令直接指出,无需使用中断控制器。
硬中断是可屏蔽的,软中断不可屏蔽。硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间
,称为上半部。软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部
sar命令可以查看网络的收发情况,还可以观察网络收发的吞吐量BPS(每秒收发的字节数),还可以观察网络收发的PPS, 即每秒收发的网络帧数。
sar -n DEV 1 (间隔一秒输出一组数据)
2 中断能干什么?
2.1 中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力。
2.2 有了中断功能,PC系统就可以使CPU和外设同时工作,使系统可以及时地响应外部事件。
而且有了中断功能,CPU可允许多个外设同时工作。这样就大大提高了CPU的利用率,也提高了数据输入、输出的速度。
2.3,有了中断功能,就可以使CPU及时处理各种软硬件故障。
计算机在运行过程中,往往会出现事先预料不到的情况或出现一些故障,如电源掉电、存储出错,运算溢出等等。 计算机可以利用中断系统自行处理,而不必停机或报告工作人员
3 中断的缺点
中断会引起上线文切换,消耗CPU.
中断丢失 就有可能出现丢包,那样就会卡顿现象或者收报异常
参考资料: