Linux内核深度解析之中断、异常和系统调用——中断下半部之小任务

小任务

小任务(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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值