1.概述
Linux中的工作队列机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程,并可以根据当前系统cpu的个数创建线程的数量。工作队列是一中将工作推后执行的形式。把工作推后,交由一个内核线程执行。允许被重新调度,甚至是睡眠。共分为三种形式:
- 共享工作队列:Linux内核为了方便用户编程,默认实现了一个所有进程都可以使用的工作队列。
- 自定义内核工作队列:为了避免工作不能及时被执行。但过多的自定义工作队列会给系统造成过大的开销
- 延时工作队列:当调用调度函数后,要延时一段时间才会执行工作函数
2.内核共享工作队列:
- API:
* DECLARE_WORK:静态定义work_struct结构
* INIT_WORK:动态初始化work_struct结构
* schedule_work:对工作进行调度
- 内核共享工作队列使用步骤
* 编写工作函数代码
* 定义一个struct work_struct结构
* 在适当地方使用schedule_work调度工作
3.自定义内核工作队列
API:
* create_workqueue:创建一个工作队列,为系统中的每个cpu都创建一个内核线程
* create_singlethread_workqueue:只为当前cpu创建一个内核线程
* queue_work:调度执行一个指定workqueue中的任务
* destroy_workqueue:释放workqueue队列
4.延时工作队列
API:
* DECLARE_DELAYED_WORK:静态定义struct delayed_work结构
* INIT_DELAYED_WORK:动态初始化struct delayed_work
* schedule_delayed_work:调度指定内核共享延时workqueue中的任务
* queue_delayed_work_on:调度执行内核共享延时中的任务
5.内核微线程tasklet
- 简介:
tasklet机制是中断处理下半部分最常用的一种方法。
- API:
* DECLARE_TASKLET:静态定义struct tasklet_struct,激活状态
* DECLARE_TASKLET_DISABLED:静态定义taskled_struct结构,禁止状态
* tasklet_init:初始化tasklet_struct结构体,用于动态创建
* tasklet_disable:禁止某个指定的tasklet小任务
* tasklet_enable:使能某个tasklet小任务
* tasklet_schedule:调度tasklet
* tasklet_kill:将一个已经被调度的tasklet杀死,即将其恢复到未调度的状态
- 编程步骤
* 定义tasklet工作函数:struct tasklet_struct mytasklet
* 定义tasklet结构变量:DECLARE_TASKLET_DISABLED
* 初始化tasklet结构,绑定工作函数:tasklet_init
* 在适当地方调度工作函数:taskelt_schedule
* 销毁tasklet:tasklet_kill