文章目录
一、tasklet介绍
1、tasklet简介
tasklet属于Linux中断底半部的实现方法之一,它能够将工作延后执行。tasklet和软中断都是基于软中断的方式实现的。软中断的延后处理函数可以同时运行在多个CPU核上,效率很高,而tasklet延后处理函数同一时刻只能运行在一个CPU核上。
2、tasklet特点
- tasklet有一个对应的延后处理函数,用于执行不紧急、耗时较长的内容。
- tasklet本身基于软中断实现,所以其延后处理函数不能进行休眠操作。
- tasklet的优先级高于进程(如:工作队列),低于硬件中断。
二、tasklet实现
1、tasklet数据结构
1)struct tasklet_struct
(include/linux/interrupt.h
)
struct tasklet_struct
{
struct tasklet_struct *next;
unsigned long state;
/* @count: 0 - enable, 1 - disable */
atomic_t count;
/* @func: tasklet延后处理函数,用于处理不紧急且耗时较长的内容,不能进行休眠操作 */
void (*func)(unsigned long);
/* @data: 传递给 @func的参数 */
unsigned long data;
};
三、tasklet用法
1、API函数
函数 | 功能 |
---|---|
tasklet_init | 初始化tasklet。 |
DECLARE_TASKLET | 定义并初始化tasklet。 |
DECLARE_TASKLET_DISABLED | 定义并初始化tasklet,tasklet处于disable状态,即禁止该tasklet被tasklet schedule调度。 |
tasklet_schedule | 向内核登记tasklet延后处理函数,将来内核在适当的时候会执行其延后处理函数。 |
tasklet_kill | 从队列中删除某个tasklet |
… | … |
2、编程步骤
- 定义并初始化一个tasklet对象,指定延后处理函数,是否需要传递参数可自行决定。
- 编写延后处理函数,执行不紧急、耗时较长的内容,不能进行休眠操作。
- 在某个地方登记tasklet延后处理函数,如:在顶半部中断处理函数中进行登记,也可以单独登记。
3、举一反三
附录
1、参考资料
- 以上源码内容参考自:Linux-4.15.18