小任务
小任务(tasklet,有的书中翻译为“任务蕾”)是基于软中断实现的。为什么要提供小任务?因为小任务相对软中断有以下优势:
(1)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或删除
(2)同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区;一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的。
小任务根据优先级分为两种:低优先级小任务和高优先级小任务。
1. 数据结构
小任务的数据结构如下:
include/linux/interrupt.h
struct tasklet_struct
{
struct tasklet_struct *next; /* 用来把小任务添加到单向链表中 */
unsigned long state; /* 小任务状态,取值:0表示小任务没有被调度;(1<<TASKLET_STATE_SCHED)表示小任务被调度,即将被执行;(1<<TASKLET_STATE_RUN)表示只在多处理器系统中使用,表示小任务正在被执行 */
atomic_t count; /* 计数,0表示允许小任务被执行,非零值表示禁止小任务执行 */
void (*func)(unsigned long); /* 处理函数, */
unsigned long data; /* 传给处理函数的参数 */
};
每个处理器有两条单向链表:低优先级小任务链表和高优先级小任务链表。
kernel/softirq.c
struct tasklet_head {
struct tasklet_struct *head;
struct tasklet_struct **tail;
};
static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
static DEFINE_PER_CPU(s

最低0.47元/天 解锁文章
1347

被折叠的 条评论
为什么被折叠?



