当前位置: 首页 > 工具软件 > Tasklet > 使用案例 >

软中断 tasklet 工作队列

潘振国
2023-12-01

软中断

1 软中断作为下半部机制的代表,
2 是随着SMP(share memory processor)的出现应运而生的
3 软中断是tasklet实现的基础(tasklet实际上只是在软中断的基础上添加了一定的机制)。
4 软中断一般是“可延迟函数”的总称
5 软中断可以在多个CPU上并行执行
6 软中断 可以并发运行在多个CPU上(即使同一类型的也可以)。所以软中断必须设计为可重入的函数(允许多个CPU同时操作),因此也需要使用自旋锁来保其数据结构。

struct softirq_action{ void (*action)(struct softirq_action *);};
描述每一种类型的软中断,其中void(*action)是软中断触发时的执行函数。

tasklet

1 由于软中断必须使用可重入函数,这就导致设计上的复杂度变高,作为设备驱动程序的开发者来说,增加了负担。

2 一种特定类型的tasklet只能运行在一个CPU上,不能并行,只能串行执行

3 软中断是静态分配的,在内核编译好之后,就不能改变。但tasklet就灵活许多,可以在运行时改变(比如添加模块时)。

4 软中断上下文能够睡眠吗?

软中断的数据结构不能 被任务调度器 调度,它属于中断上下文

工作队列

1 可以执行 阻塞和睡眠 软中断跟tasklet 是不可以的。
2 并发性差,因为工作线程跟cpu是一 一绑定的。

类型

struct workqueue_struct
struct work_struct

关键函数

1 创建工作队列
create_workqueue
create_singlethread_workqueue
备注:返回值是指针
如果使用默认的 workqueue ,则不执行 创建工作队列。
destroy_workqueue
参数:workqueue的指针
2 设置一个work,将work 与_func 进行绑定
INIT_WORK(_work, _func);
”两次参数都是 指针“
(func 函数里面没有return)
3 将work 放到 workqueue 中去执行
queue_work(workqueue, work);
”两次参数都是 指针“
如果使用默认的 workqueue,则直接使用 schedule_work

static inline bool schedule_work(struct work_struct *work)
{
    return queue_work(system_wq, work);
}

system_wq 是系统默认的 workqueue

可参考
Linux内核中的软中断、tasklet和工作队列详解

 类似资料: