linux中,中断的处理方法 工作队列

1、前言

为了提高中断的执行速度,我们将不是特别耗时的任务交给下半部tasklet来做(tasklet在在中断的上下文中工作,无法休眠),但是,当有非常复杂的操作需要执行的时候,如果依旧采用下半部tasklet来做,虽然系统依旧可以响应中断,但是,应用应用程序是不能执行的。因为整个系统都在执行软中断或是硬中断。
将耗时的操作放在某一个线程(内核线程)去做,可以解决系统的卡顿问题,因为线程可以休眠。这就是工作队列。

2 内核线程的介绍:

内核会为我们自动创建一个kworker线程(一个CPU一个*),
在这里插入图片描述

每个线程里面,有一个worker_queue队列(工作队列),工作队列中,每个元素都是一个work结构体。

3 我们要使用线程来处理中断下半部的话,我们要做的事情是:

①、构造work结构体,完善结构体里面的成员,特别是成员函数.func(中断处理函数).
②、在中断的上半部中,将work结构体放入到work_queue队列(工作队列)中。我们使用函数schedule_work(&work),来实现添加功能。同时,这个函数还有一个功能就是唤醒kworker线程。
完成这两部以后,一旦kworker抢到时间运行时,就会从work_queue(工作队列)中,取出work执行。

4 内核线程的工作原理

内核线程是不会退出的while(1):
在这里插入图片描述
说明:
内核线程、工作队列(workqueue)都由内核创建了,我们只是使用。使用的核心是一个 work_struct 结构体。
在这里插入图片描述

使用工作队列时,步骤如下:
① 构造一个 work_struct 结构体,里面有函数;
② 把这个 work_struct 结构体放入工作队列,内核线程就会运行 work 中的函数。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cainiaofu/article/details/115724804