tasklet机制与softirq

一、初始化函数

静态:DECLARE_TASKLET(name, func, data);atom

动态:队列

struct tasklet_struct
{
 struct tasklet_struct *next;
 unsigned long state;
 atomic_t count;
 void (*func)(unsigned long);
 unsigned long data;
};进程

void tasklet_init(struct tasklet_struct *t,
    void (*func)(unsigned long), unsigned long data)it

{编译

      t->next = NULL;
      t->state = 0;
      atomic_set(&t->count, 0);
      t->func = func;
      t->data = data;变量

}并行

struct tasklet_struct mytasklet;    // 定义tasklet_struct结构体call

tasklet_init(&mytasklet,  tasklet_handler, &mydata);   // 初始化 data能够是 变量/函数/结构体等的地址,如struct mydata mydata;next

void tasklet_handler(unsigned long data) {    // callback函数

        struct mydata *p = (struct mydata *)data;

        ...

}

tasklet_schedule(&mytasklet);    // 初始化以后须要交给tasklet_schedule来调度

tasklet_kill(&mytasklet); // 移除tasklet

与softirq的不一样:tasklet只能在一个CPU上运行,而同一个softirq能够同时在多个CPU core上运行;

                            软中断的静态分配的,内核编译好以后就不能改变,但tasklet就要灵活许多,好比动态加载模块

                            因此在不须要并行运行软中断时就应该选择tasklet

共同点:tasklet与softirq都不能睡眠,不能阻塞,只能被其余中断的上半部分打断

工做队列能够睡眠,而且能够具备更大的延时执行,tasklet代码必须以原子方式执行,会在很短的时间很快地执行

工做队列是在进程上下文执行,也就是执行过程当中运行其余进程抢占;而tasklet是在中断上下文中运行,只有其余中断响应能够打断tasklet的运行, 保证了原子操做。

相关文章
相关标签/搜索