softirq/tasklet/workqueue区别

1. 同一个softirq可以在不同的CPU上同时运行,softirq必须是可重入的

2. 软中断是在编译期间静态分配的,它不像tasklet那样能被动态的注册或去除

3. tasklet是基于softirq实现,同一个tasklet只能同时在一个cpu上执行,tasklet无需关心互斥问题.

static void tasklet_action(struct softirq_action *a)
{
    while (list) {
        struct tasklet_struct *t = list;
        list = list->next;
        if (tasklet_trylock(t)) {
            if (!atomic_read(&t->count)) {
                if (!test_and_clear_bit(TASKLET_STATE_SCHED,
                            &t->state))
                    BUG();
                exynos_ss_irq(ESS_FLAG_SOFTIRQ_TASKLET,
                        t->func, irqs_disabled(), ESS_FLAG_IN);
                t->func(t->data);
                exynos_ss_irq(ESS_FLAG_SOFTIRQ_TASKLET,
                        t->func, irqs_disabled(), ESS_FLAG_OUT);
                tasklet_unlock(t);
                continue;
            }
            tasklet_unlock(t);
        }
    }
}

4. 不同的tasklet可以在不同cpu上运行,提高了SMP效率

5. workqueue工作在线程环境,可以休眠.

猜你喜欢

转载自blog.csdn.net/bin_linux96/article/details/79142518