1、tasklet可以动态分配,也可以静态分配,数量不限。
2、同一种 tasklet 在多个cpu上也不会并行执行,这使得程序员在撰写 tasklet function 的时候比较方便,减少了对并发的考虑(当然损失了性能)。
3、tasklet 在软件中断上下文中运行,所以 tasklet 代码必须是原子的。而工作队列函数在一个特殊内核进程上下文运行,有更多的灵活性,且能够休眠。
4、tasklet 执行的很快, 短时期, 并且在原子态,除了中断top half可以抢占其执行,其他的进程上下文(无论该进程的优先级多么的高)是不会影响其执行的。
tasklet 提供了许多有趣的特色:
一个 tasklet 能够被禁止并且之后被重新使能; 它不会执行直到它被使能与被禁止相同的的次数.
如同定时器, 一个 tasklet 可以注册它自己.
一个 tasklet 能被调度来执行以正常的优先级或者高优先级. 后一组一直是首先执行.
taslet 可能立刻运行, 如果系统不在重载下, 但是从不会晚于下一个时钟嘀哒.
一个 tasklet 可能和其他 tasklet 并发, 但是对它自己是严格地串行的 -- 同样的 tasklet 从不同时运行在超过一个处理器上. 同样, 如已经提到的, 一个 tasklet 常常在调度它的同一个 CPU 上运行.
tasklet 使用:
Tasklet 的使用比较简单,只需要定义tasklet及其处理函数并将两者关联
例子:
Void my_tasklet_func(unsigned long)
静态创建:static DECLARE_TASKLET(my_tasklet,my_tasklet_func,data)
动态创建:void tasklet_init(struct tasklet_struct t,
void (func)(unsigned long), unsigned long data)
代码 DECLARE_TASKLET 实现了定义名称为 my_tasklet 的 tasklet 并将其与 my_tasklet_func 这个函数绑定,而传入这个函数的参数为data。
需要调度 tasklet 的时候引用一个 tasklet_schedule() 函数就能使系统在适当的时候进行调度,如下所示
Tasklet_schedule(&my_tasklet
tasklet_schedule:将tasklet加入到调度链表里面,tasklet就能得到执行,每调用这个函数一次,tasklet只能执行一次,要再次执行需要重新调用这个函数。
tasklet_hi_schedule:比tasklet_schedule优先级更高,可以得到更快处理。
tasklet_hi_schedule_first:和tasklet_hi_schedule差不多,只是更安全。
tasklet_disable:禁止tasklet,即使tasklet_schedule已经把tasklet调度链表里,也得不到执行,必须要用tasklet_enable使能才可以。如果当前tasklet正在运行,tasklet_disable会等待执行完,然后禁止,返回。
tasklet_disable_nosync:和tasklet_disable一样,如果当前tasklet在运行,这个函数不会等待完成就先返回,当tasklet完成退出后,再禁止。
tasklet_enable:使能tasklet,和tasklet_disable要成对使用。
tasklet_kill:设备关闭和模块卸载的时候,调用来杀死tasklet。如果当前tasklet在运行,会等待完成后,再杀死。
tasklet_init:初始化tasklet。