读书笔记:LLD3(5)tasklet 和工作队列

tasklet:调度一个tasklet,表明我们只是希望内核选择某个其后的时间来执行调度的函数。与定时器类                 似,tasklet也会在“软件中断”上下文以原子模式执行。

tasklet API:

#include

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始终运行在被初始提交的同一处理器上,但这只是工作队列的默认方式

内核代码可以请求工作队列函数的执行延迟给定的时间间隔。

你可能感兴趣的:(读书笔记:LLD3(5)tasklet 和工作队列)