免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3278 | 回复: 6
打印 上一主题 下一主题

[内核入门] [小白请教]关于软中断和tasklet为什么不一样 [复制链接]

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-22 13:57 |只看该作者 |倒序浏览

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

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

问题:


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

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

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

请大神解惑,多谢多谢。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 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可以在进程上下文执行有关系吗?

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

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
3 [报告]
发表于 2015-01-22 16:20 |只看该作者
回复 2# super皮波


    谢谢super皮波回复


        明白了,多谢

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

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

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

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

       这么理解对吗?

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
4 [报告]
发表于 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不能在其他的核上同时处理
   

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
5 [报告]
发表于 2015-01-22 19:27 |只看该作者
回复 4# super皮波


    谢谢super皮波耐心解答

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

论坛徽章:
0
6 [报告]
发表于 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

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
7 [报告]
发表于 2015-01-31 21:15 |只看该作者
回复 6# weijitao


    多谢weijitao 回复,简单易懂,太感谢了   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP