免费注册 查看新帖 |

Chinaunix

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

tasklet小述 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-09 14:01 |只看该作者 |倒序浏览

tasklet小述
2008-06-12 12:47
一、tasklet使用
1、声明一个tasklet
动态:
void tasklet_init(struct tasklet_struct *t,
        void (*func)(unsigned long), unsigned long data)
静态:
#define DECLARE_TASKLET(name, func, data) \
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
#define DECLARE_TASKLET_DISABLED(name, func, data) \
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
实际上是创建一个tasklet_struct结构。
2.调度你的tasklet
tasklet_schedule(t);
以上面所创建的tasklet_struct t作为参数。
二、小结:
    tasklet是作为中断下半部的一个很好的选择,它在性能和易用性之间有着很好的平衡。较之于softirq,tasklet不需要考虑SMP下的并行问题,而又比workqueues有着更好的性能。
   
    tasklet通常作为硬中断的下半部来使用,在硬中断中调用tasklet_schedule(t)。每次硬中断都会触发一次tasklet_schedule(t),但是每次中断它只会向其中的一个CPU注册,而不是所有的CPU。完成注册后的tasklet由tasklet_action()来执行,在SMP环境下,它保证同一时刻,同一个tasklet只有一个副本在运行,这样就避免了使用softirq所要考虑的互斥的问题。再者,tasklet在执行tasklet->func()前,再一次允许tasklet可调度(注册),但是在该tasklet已有一个副本在其他CPU上运行的情况下,它只能退后执行。总之,同一个硬中断引起的一个tasklet_schedule()动作只会使一个tasklet被注册,而不同中断引起的tasklet则可能在不同的时刻被注册而多次被执行。
tasklet的互斥。由于同一个tasklet不能有多个副本同时运行,所以不需要在多CPU之间互斥。在tasklet运行的过程中,它会被硬中断打断(这也是软中断的优点),所以如果tasklet和其他中断之间的互斥有可能存在。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/75633/showart_1959650.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP