Linux中断(interrupt)机制

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.

中断丢失 就有可能出现丢包,那样就会卡顿现象或者收报异常

参考资料:

原文:https://blog.csdn.net/wlf_go/article/details/80319417

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注