Dannysd 发表于 2015-01-22 13:57

[小白请教]关于软中断和tasklet为什么不一样


小白,正在努力入门中。。。。

本质上讲,tasklet也是软中断实现的,只不过是级别比软中断低而已

问题:


1)为什么同类的tasklet不能同时执行?而且在SMP的情况下,也只能是在同一个核心上执行

2)而软中断却可以,不但可以同时执行,而且还可以在不同的核心上同时执行?

原因是因为tasklet可以在进程上下文执行有关系吗?

请大神解惑,多谢多谢。

super皮波 发表于 2015-01-22 15:22

回复 1# Dannysd

本质上讲,tasklet也是软中断实现的,只不过是级别比软中断低而已

系统也提供高等级的tasklet,只是平常不使用而已,如下是所有的软中断类型


enum
{
        HI_SOFTIRQ=0,高等级的tasklet
        TIMER_SOFTIRQ,
        NET_TX_SOFTIRQ,
        NET_RX_SOFTIRQ,
        BLOCK_SOFTIRQ,
        BLOCK_IOPOLL_SOFTIRQ,
        TASKLET_SOFTIRQ, 低等级的tasklet,我们平常都在使用的这个
        SCHED_SOFTIRQ,
        HRTIMER_SOFTIRQ,
        RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */

        NR_SOFTIRQS
};

问题:


1)为什么同类的tasklet不能同时执行?而且在SMP的情况下,也只能是在同一个核心上执行

这是内核给我们提供的一种机制,如果你想在多核下同时执行的话,那就别使用tasklet。使用tasklet在同步上要比用软中断简单

2)而软中断却可以,不但可以同时执行,而且还可以在不同的核心上同时执行?

这个是可以的

原因是因为tasklet可以在进程上下文执行有关系吗?

不是,在进程上下文执行只能是工作队列

Dannysd 发表于 2015-01-22 16:20

回复 2# super皮波


    谢谢super皮波回复


      明白了,多谢

      还有点小问题,
      HI_SOFTIRQ就是软中断,最高级别
      TASKLET_SOFTIRQ就是实现tasklet的中断级别

       只是软中断通常是top-half和bottom-half在一块,迅速完成,基本可以不区分,比如,网络数据包接收算吗?

       而tasklet通常top-half先对硬件中断产生回应,再去用bottom-half执行剩下的工作,比如内存拷贝,键盘输入之类的

       这也是为什么说tasklet也是软中断实现的原因

       这么理解对吗?

super皮波 发表于 2015-01-22 17:06

回复 3# Dannysd

还有点小问题,
      HI_SOFTIRQ就是软中断,最高级别
      TASKLET_SOFTIRQ就是实现tasklet的中断级别

这两个都是tasklet,级别不同而已
void __init softirq_init(void)
{
        int cpu;

        for_each_possible_cpu(cpu) {
                int i;

                per_cpu(tasklet_vec, cpu).tail =
                        &per_cpu(tasklet_vec, cpu).head;
                per_cpu(tasklet_hi_vec, cpu).tail =
                        &per_cpu(tasklet_hi_vec, cpu).head;
                for (i = 0; i < NR_SOFTIRQS; i++)
                        INIT_LIST_HEAD(&per_cpu(softirq_work_list, cpu));
        }

        register_hotcpu_notifier(&remote_softirq_cpu_notifier);

        open_softirq(TASKLET_SOFTIRQ, tasklet_action);
        open_softirq(HI_SOFTIRQ, tasklet_hi_action);
}


       只是软中断通常是top-half和bottom-half在一块,迅速完成,基本可以不区分,比如,网络数据包接收算吗?

       而tasklet通常top-half先对硬件中断产生回应,再去用bottom-half执行剩下的工作,比如内存拷贝,键盘输入之类的

       这也是为什么说tasklet也是软中断实现的原因

       这么理解对吗?

       我觉得你还是没完全理解这块
      
       不管是软中断还是tasklet都是下半部的一种实现机制,都是在开中断的情况下去处理,tasklet机制是基于软中断来实现的,tasklet_action
       这个处理函数用来保证对同一个tasklet不能在其他的核上同时处理
   

Dannysd 发表于 2015-01-22 19:27

回复 4# super皮波


    谢谢super皮波耐心解答

    原来同属于下半部分实现机制,只是级别不同,明白啦~谢谢

weijitao 发表于 2015-01-30 11:26

同一个tasklet对象同一时刻只能在一个处理器上运行
调用tasklet_schedule来提交一个tasklet对象,假设为tasklet_obj,那么tasklet_schedule首先
会为该tasklet对象tasklet_obj.state打上一个标志TASKLET_STATE_SCHED,表明该tasklet对象被
提交但还没有被运行。
TASKLET_STATE_SCHED标志是确保tasklet串行化的第一道防线,但是如果该tasklet_obj对象已经被
调度到处理器CPU0上运行了,那么TASKLET_STATE_SCHED标志会被清除。
这意味着当一个tasklet_obj对象正在一个处理器上运行时,同一个tasklet_obj对象完全可以被提交
到另一个处理器,那么这种情况下如何确保tasklet串行化呢,答案是tasklet_obj.state上为SMP系统
增加的另一个标志位TASKLET_STATE_RUN

Dannysd 发表于 2015-01-31 21:15

回复 6# weijitao


    多谢weijitao 回复,简单易懂,太感谢了   :em02:
页: [1]
查看完整版本: [小白请教]关于软中断和tasklet为什么不一样