linux中,中断的处理方法的改进 中断线程化

前言

之前使用的用内核线程去处理中断(任务队列),对于单CPU系统来说,是很高效的一种方式,但是随着CPU越来越多,这种方法就显得不是很高效。因为,一个CPU只能创建一个内核线程Kworker。多个中断的work都是由一个worker线程来处理。这会导致内核线程kworker对CPU的占用率过高,而其他CPU却空着。这对于多CPU系统来说,显然不能被接收!!

1 改进

改进的地方在于:我们不用再自己定义work结构体,也无需再使用函数schedule_work(&work)。
我们可以使用request_threaded_irq()函数来指定我们为某个中断分配何种中断处理函数:

request_threaded_irq(哪个中断,上半部函数(可以为空),中断处理函数)

他会给每个中断单独创建一个内核线程。这样,当中断发生的时候,上半部函数就会执行,上半部执行结束以后,他会唤醒内核线程。在内核线程中,执行中断处理函数。
这样,对于每个中断,都有机会被创建成一个独立的线程,每个线程,都可以在任意一个CPU上执行。对于多CPU(SMP)系统来说,是非常有意义的。

2 request_irq 和request_threaded_irq的区别:

request_irq()这个函数用于为申请一个中断,是request_threaded_irq的一个包装(request_threaded_irq中的参数thread_fn(在线程中运行的函数)
在request_irq()中为NULL)。所以,没有办法通过request_irq 来实现中断线程化,要申请支持中断线程化的只能使用request_threaded_irq。
在这里插入图片描述
我们可以值提供thread_fn()函数,系统就会为我们创建一个内核线程。当中断发生的时候们就会执行上半部的函数,在上半部中,唤醒某个内核线程,这个线程就会执行thread_fn()函数。

3 内核机制

在这里插入图片描述

4 总结:

下半部要做的事情不是很长,且不复杂:tasklet
下半部要做的事情很长,且复杂:工作队列
对于多CPU ,可以为每个中断分配一个线程,这样,每个中断都可以在任意一个CPU得到响应。

猜你喜欢

转载自blog.csdn.net/cainiaofu/article/details/115724988
今日推荐