大概有一些同学对tasklet的串行化还有点困惑,其实在单处理器上最好理解,所以本帖主要讨论多处理器上tasklet如何实现串行化:同一个tasklet对象同一时刻只能在一个处理器上运行。


驱动程序中,tasklet是作为一种softirq形式出现的,所以对tasklet对象的提交一般发生在中断处理例程ISR中。一般一个
tasklet用来对同一种中断类型进行后续的处理,所以完全不必要通过动态生成tasklet对象的方式在每次中断到来时重新生成一个tasklet对
象来做后半段的处理。事实上Linux内核源码中,几乎所有的tasklet对象都是针对同一类型的中断只产生一个。如果有同学发现有例外的情况,请告诉
我,将非常感谢。

假设某个中断发生,由CPU0来处理,在它的ISR中会调用tasklet_schedule来提交一个tasklet
对象,假设为tasklet_obj,那么tasklet_schedule首先会为该tasklet对象tasklet_obj.state打上一个标
志:TASKLET_STATE_SCHED,表明该tasklet对象被提交但还没有被运行,前述的打标志的操作是个原子,代码里是
test_and_set_bit,这意味着如果同时有处理器CPU0和CPU1都来提交该tasklet_obj,那么只有一个会被成功提交,不过不用
担心一个tasklet对象没被提交成功的话会有啥副作用,因为在softirq的处理阶段,一个tasklet对象上的处理函数可以一并处理掉外设若干
次同一中断要做的事,最典型的,比如网卡连续接收到两个数据包,产生两个中断到两个不同处理器上,因为只有一个tasklet对象被提交,当该对象上的延
迟函数被执行时,它会将两个数据包都读到系统内存中。

TASKLET_STATE_SCHED标志是确保tasklet串行化的第一道防
线,但是如果该tasklet_obj对象已经被调度到处理器CPU0上运行了,那么TASKLET_STATE_SCHED标志会被清除,这意味着当一
个tasklet_obj对象正在一个处理器上运行时,同一个tasklet_obj对象完全可以被提交到另一个处理器,比如CPU1上。那么这种情况下
如何确保tasklet串行化呢,答案是tasklet_obj.state上为SMP系统增加的另一个标志位TASKLET_STATE_RUN,当一
个tasklet_obj对象被某一处理器开始调度运行时,tasklet_action,也就是对应的softirq处理例程会通过
tasklet_trylock来将该tasklet_obj对象的state成员打上标志TASKLET_STATE_RUN,这个操作同样是原子的,
因此只会有一个处理器成功完成测试及打标志的动作,没成功的那个处理器上的tasklet_action会把当前的tasklet_obj重新加入到其所
管理的tasklet_vec链表的尾部(因为一个相同的tasklet_obj对象已经在运行了,所以再期望其一并完成当前tasklet_obj所表
示的任务变得不再可靠,这不同于刚提交时的情形,所以内核对此的策略是,把当前希望运行但是发现已经有同一个tasklet_obj对象的延迟函数正在被
执行时,将当前对象加入到处理器tasklet_vec的链表尾部)。那先前成功的处理器就可以开始执行tasklet_obj对象上的延迟函数,执行完
毕该tasklet_obj对象将从它所在的处理器tasklet_vec链表中消失,除非再次提交。所以一个成功执行的tasklet_obj对象的状
态变化是:
TASKLET_STATE_SCHED(被成功提交)-->TASKLET_STATE_RUN | TASKLET_STATE_SCHED(被提交并且即将被调度运行)-->TASKLET_STATE_RUN(正在被调度执行中)。


一个不成功的tasklet要么在tasklet_schedule处就被泯灭掉,此时它根本不会出现在任何一个处理器的tasklet_vec链表中,
要么是在同一个tasklet对象正在其他处理器上被执行时被成功提交,但是它目前暂时无法被执行,会被放到它所属的处理器tasklet_vec链表的
尾部等待下一次被调度运行。

转自:http://blog.chinaunix.net/uid-23769728-id-3195496.html

关于tasklet的一点小小的解释的更多相关文章

  1. AngularJS』一点小小的理解

    『AngularJS』一点小小的理解   AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与 ...

  2. C# 异步工具类 及一点小小的重构经验

    2015年新年第一篇随笔, 祝福虽然有些晚,但诚意还在:新年快乐. 今天主要是想分享一异步工具类,在C/S架构中.先进行网络资源异步访问,然后将回调函数 Invoke到UI线程中进行UI处理. 这样的 ...

  3. 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考

    I will Make Impossible To I'm possible -----------LittleHann 看了2个多星期.终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现 ...

  4. Linux内核中的软中断、tasklet和工作队列具体解释

    [TOC] 本文基于Linux2.6.32内核版本号. 引言 软中断.tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的"下半部"(bottom ...

  5. 『AngularJS』一点小小的理解

    AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与开发框架不断的提出与发展,而就目前来说,除 ...

  6. 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能

    Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quar ...

  7. 关于Node.js, Jade一点小小的介绍。

    本文出自:http://blog.csdn.net/svitter node.js大家知道的可能比較多,可是jade大家可能就不知道了.. GFW封杀掉google以后.今天在百度上找了好久也没有找到 ...

  8. OGNL_一点

    ognl此表达式语言,是一门什么样的语言呢?下面然我为大家简单的讲解一点小小的关于它的内容吧! 然我来简单得解释说:OGNL(Object-Graph Navigation Language),可以方 ...

  9. MySQL具体解释(5)-----------函数超全总结

    mysql函数大全   对于针对字符串位置的操作.第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值. 假设str是空字符串,返回0.假设str是NULL,返 ...

随机推荐

  1. Redis源代码分析(23)--- CRC循环冗余算法RAND随机数的算法

    他今天就开始学习Redis源代码的一些工具来实现,在任何一种语言工具.算法实现的原理应该是相同的,一些比較经典的算法.比方说我今天看的Crc循环冗余校验算法和rand随机数产生算法. CRC算法全称循 ...

  2. SQL_substr功能测试

    原创作品.从 "深蓝blog" 博客,欢迎转载,请务必注明转载的来源.权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/articl ...

  3. Chapter 1 Securing Your Server and Network(3):使用托管服务帐号

    原文:Chapter 1 Securing Your Server and Network(3):使用托管服务帐号 原文出处:http://blog.csdn.net/dba_huangzj/arti ...

  4. java提高篇(十三)-----字符串

          可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...

  5. 3.cocos2dx它Menu,由menu为了实现场景切换

     1 头文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; ...

  6. 如何对 GIT 分支进行规划? (转)

    项目背景: 该项目是在2011年11月份使用Asp.net三层帮荷兰某个客户开发的机票预定系统 该客户主要是做中国与欧洲的旅行社业务,特别是最近两年由于中国的发展因此客户也越来越重视机票业务 于是他们 ...

  7. 对LevelDB的“升级版”存储引擎RocksDB的调研成果

    Google的leveldb是个非常优秀的存储引擎.但还是有一些不尽人意的地方,比方leveldb不支持多线程合并.对key范围查找的支持还非常easy,未做优化措施,等等.而Facebook的Roc ...

  8. Codeforces Round #107 (Div. 2)---A. Soft Drinking

    Soft Drinking time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  9. HDU--3829--Cat VS Dog【最大点独立集】

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题意:动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些 ...

  10. 上传文件块client实现

    首先由内容阻止所有文件(块大小的约束),然后对于每一个chunk构造单独的一个UDP 数据报进行传输,在应用层的開始是自己定义的包头,有块号,块长度,块指纹等元数据信息,这些信息便于接收端可以按序正确 ...