中断描述
中断是系统用来响应硬件设备请求的一直机制,它会打断进程的正常调度何执行,然后调用内核中的中断处理程序来响应设备的请求,只有收到中断信号,CPU才处理中断时间,没有收到信号时候,可以继续执行其它工作, 可以看出中断是一种一步的事件处理机制,由于中断处理程序会打断其它进程的运行,所以为了减少正常运行调度影响,中断处理程序需要尽可能快的运行,如果中断本身要做的事情不对,那么处理起来也不会太耗时,但是中断要处理的事情很多,中断服务程序就有可能执行很长时间,由于中断处理程序在响应中断时,还会临时关闭其它请求过来中断。着就会导致这个中断处理完成之前,其它中断都无法响应导致丢失
软中断
为了解决中断处理程序执行时间过长,导致其它中断请求丢失的问题,linux将中断处理过程分为两个阶段,上半部和下半部
- 上半部:快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感工作。
- 下半部:用来延迟处理上半部未完成的工作,通常以内核线程的方式运行
网卡接收数据包例子:
网卡接受到数据包后,会通过硬件中断
方式,通知内核有新的数据到了,这时,内核就应该调用中断处理程序来相应它
- 上半部:也就是我们通常说的
硬中断
,特点是快速执行,就是把网卡的数据读到内存中,然后更新一下硬件寄存器的状态(表示数据已经都好了),最后在发送软中断信号,通知下半部分进一步处理 - 下半部:也就是
软中断
,特点是延迟执行,下半部被中断信号唤醒,需要冲内存中找到网络数据,在按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序
实际上,上半部会打断CPU正在执行的任务,然后立即执行中断处理程序。而下半部分内核线程的方式执行,并且每个CPU都对应一个软中断内核线程,名字为ksoftirqd/CPU编号
,比如说,0号cpu对应的软中断内核线程的名字就是 ksftirqd/0
注意:软中断不只包括了上述的硬件设备中断处理程序的下半部,一些内核自定义的时间也属于软中断,比如内核调度和RCU锁(read-copy update的缩写,RCU是Linux内核中最常用的锁之一)等
查看软中断和内核线程
- /proc/softirqs 提供了软中断的运行情况;
- /proc/interrupts 提供了硬中断的运行情况
$ cat /proc/softirqs
CPU0
HI: 1
TIMER: 64325468
NET_TX: 113
NET_RX: 2203298
BLOCK: 0
BLOCK_IOPOLL: 0
TASKLET: 39
SCHED: 0
HRTIMER: 0
RCU: 41173220
- 注意软中断类型,第一列为软中断类型
- 注意软中断分布在cpu的情况,第一行为CPU编号
查看软中断线程
$ ps aux | grep softir
root 3 0.0 0.0 0 0 ? S 2019 0:03 [ksoftirqd/0]
总结
中断处理分为上半部和下半部
- 上半部:对应硬件中断,用于快速处理中断
- 下半部:为
软中断
,用于异步处理上半部未完成的工作 - /proc/softirqs 提供了软中断的运行情况;
- /proc/interrupts 提供了硬中断的运行情况
网友评论