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