tasklet:调度一个tasklet,表明我们只是希望内核选择某个其后的时间来执行调度的函数。与定时器类 似,tasklet也会在“软件中断”上下文以原子模式执行。
tasklet API:
#include <linux/interrupt.h>
struct tasklet_struct{
/* ... */
void (*func)(unsigned long);
unsigned long data;
};
void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);
DECLARE_TASKLET(name, func, data);
DECLARE_TASKLET_DISABLED(name, func, data);
tasklet提供的特性
一个tasklet可在稍候被禁止或者重新启用;只有启用次数和禁止次数相同时,tasklet才会被执行。
和定时器类似,tasklet可以自己注册自己。
tasklet可被调度以在通常的优先级或者高优先级执行。高优先级的tasklet总会首先执行。
如果系统负荷不重,则tasklet会立即得到执行,但始终不会晚于下一个定时器滴答。
一个tasklet始终会在调度自己的同一个CPU上运行。
工作队列:
工作队列类似于tasklet,它们都允许内核代码请求某个函数在将来的时间被调用。
与tasklet的区别:
tasklet在软中断上下文中运行,因此,所有的tasklet代码都必须是原子的。相反,工作队列函数在一个特殊内核进程的上下文中执行,因此它具有更好的灵活性。尤其可以休眠。
tasklet始终运行在被初始提交的同一处理器上,但这只是工作队列的默认方式
内核代码可以请求工作队列函数的执行延迟给定的时间间隔。