关于tasklet的一点小小的解释
大概有一些同学对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的一点小小的解释的更多相关文章
- AngularJS』一点小小的理解
『AngularJS』一点小小的理解 AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与 ...
- C# 异步工具类 及一点小小的重构经验
2015年新年第一篇随笔, 祝福虽然有些晚,但诚意还在:新年快乐. 今天主要是想分享一异步工具类,在C/S架构中.先进行网络资源异步访问,然后将回调函数 Invoke到UI线程中进行UI处理. 这样的 ...
- 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考
I will Make Impossible To I'm possible -----------LittleHann 看了2个多星期.终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现 ...
- Linux内核中的软中断、tasklet和工作队列具体解释
[TOC] 本文基于Linux2.6.32内核版本号. 引言 软中断.tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的"下半部"(bottom ...
- 『AngularJS』一点小小的理解
AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与开发框架不断的提出与发展,而就目前来说,除 ...
- 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能
Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quar ...
- 关于Node.js, Jade一点小小的介绍。
本文出自:http://blog.csdn.net/svitter node.js大家知道的可能比較多,可是jade大家可能就不知道了.. GFW封杀掉google以后.今天在百度上找了好久也没有找到 ...
- OGNL_一点
ognl此表达式语言,是一门什么样的语言呢?下面然我为大家简单的讲解一点小小的关于它的内容吧! 然我来简单得解释说:OGNL(Object-Graph Navigation Language),可以方 ...
- MySQL具体解释(5)-----------函数超全总结
mysql函数大全 对于针对字符串位置的操作.第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值. 假设str是空字符串,返回0.假设str是NULL,返 ...
随机推荐
- Redis源代码分析(23)--- CRC循环冗余算法RAND随机数的算法
他今天就开始学习Redis源代码的一些工具来实现,在任何一种语言工具.算法实现的原理应该是相同的,一些比較经典的算法.比方说我今天看的Crc循环冗余校验算法和rand随机数产生算法. CRC算法全称循 ...
- SQL_substr功能测试
原创作品.从 "深蓝blog" 博客,欢迎转载,请务必注明转载的来源.权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/articl ...
- Chapter 1 Securing Your Server and Network(3):使用托管服务帐号
原文:Chapter 1 Securing Your Server and Network(3):使用托管服务帐号 原文出处:http://blog.csdn.net/dba_huangzj/arti ...
- java提高篇(十三)-----字符串
可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...
- 3.cocos2dx它Menu,由menu为了实现场景切换
1 头文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; ...
- 如何对 GIT 分支进行规划? (转)
项目背景: 该项目是在2011年11月份使用Asp.net三层帮荷兰某个客户开发的机票预定系统 该客户主要是做中国与欧洲的旅行社业务,特别是最近两年由于中国的发展因此客户也越来越重视机票业务 于是他们 ...
- 对LevelDB的“升级版”存储引擎RocksDB的调研成果
Google的leveldb是个非常优秀的存储引擎.但还是有一些不尽人意的地方,比方leveldb不支持多线程合并.对key范围查找的支持还非常easy,未做优化措施,等等.而Facebook的Roc ...
- 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 ...
- HDU--3829--Cat VS Dog【最大点独立集】
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题意:动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些 ...
- 上传文件块client实现
首先由内容阻止所有文件(块大小的约束),然后对于每一个chunk构造单独的一个UDP 数据报进行传输,在应用层的開始是自己定义的包头,有块号,块长度,块指纹等元数据信息,这些信息便于接收端可以按序正确 ...