关于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

时间: 2024-12-13 15:41:12

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

AngularJS』一点小小的理解

『AngularJS』一点小小的理解 AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与开发框架不断的提出与发展,而就目前来说,除了游戏.IM(类似QQ).Office这类软件之外,新出的软件应用开始出现两个方向,一个是以Web为主的Web APP,一个是以移动端为主的移动APP.且,现有也有一种声音认为Web APP早晚会取代移动端原生APP,从而一统计算机软件的应用方式.暂且不论这种说

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

本文出自:http://blog.csdn.net/svitter node.js大家知道的可能比较多,但是jade大家可能就不知道了..GFW封杀掉google以后,今天在百度上找了好久也没有找到--哎,仍需前进. 肯定有在github上获取一些框架的小白和我一样,看了到了json,jade,less这些莫名奇妙的东西然后怅然不知所云. jade可以用来生成html文件,写法要简单很多.具体见:http://jade-lang.com/ 那么jade是什么呢?jade就是node 的一个框架,

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

2015年新年第一篇随笔, 祝福虽然有些晚,但诚意还在:新年快乐. 今天主要是想分享一异步工具类,在C/S架构中.先进行网络资源异步访问,然后将回调函数 Invoke到UI线程中进行UI处理. 这样的场景是及其常见的,因此特意封装了一工具类,用以简化操作. /// <summary> /// 异步工具类 /// </summary> public class TaskTools { /// <summary> /// 是否 在执行回调函数之前修改Running状态 //

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

[TOC] 本文基于Linux2.6.32内核版本号. 引言 软中断.tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的"下半部"(bottom half)演变而来. 下半部的机制实际上包含五种,但2.6版本号的内核中.下半部和任务队列的函数都消失了,仅仅剩下了前三者. 介绍这三种下半部实现之前.有必要说一下上半部与下半部的差别. 上半部指的是中断处理程序,下半部则指的是一些尽管与中断有相关性可是能够延后运行的任务. 举个样例:在网络传输中.网卡接收

关于接口测试的一点小小的感悟

接口测试的目的 这个算是老生常谈了,但我觉得只要聊到接口这个还是绕不过的,没有目标就没有评判标准,所以测试的目的还是很重要的. 先搬运一下维基百科上的英文解释(中文没找到,百度的就算了...): API testing is a type of software testing that involves testing application programming interfaces (APIs) directly and as part of integration testing to

【Android界面实现】关于Android中9patch图的一点小解释

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 关于为什么使用.9图,我就不长篇大论了,就是为了减少图片资源体积,我们这篇文章重点解决.9图的制作的一些小问题. .9的制作,实际上就是在原图片上添加1px的边界,然后按照我们的需求,把对应的位置设置成黑色线,系统就会根据我们的实际需求进行拉伸. 下图是对.9图的四边的含义的解释,左上边代表拉伸区域,右下边代表padding box,就是间隔区域,在下面,我们给出一个例子,方便大家理解. 先看下面两张图,

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

Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quartz.NET主要用到下面几个类: IScheduler --调度器 IJobDetail --作业任务 ITrigger --触发器 如果我们自己采用Timer来写类似的定时执行任务程序的话,相应的我们应该有:(以下均为设想,目的是让大家搞清楚Quartz.NET上面三个接口的关系) Schedul

关于抽象类和接口的一点小小的认知

抽象类可以继承具体的类 抽象类在实现接口的时候,可以不用实现接口的方法.但是子类一定要实现.因为子类不具有抽象方法,而抽象类具有抽象方法.因此,可以不用实现. 抽象类除了不能new对象,其他的和具体的类没啥太大的区别. 接口的话,只能在接口中定义抽象方法和静态常量. 抽象类是一个模板,继承的子类一定要实现它的抽象方法.当然也可以子类也是抽象类,那就可以不用实现了,只需要再声明为抽象方法就可以了. 接口给人的感觉是一种可插拔的感觉.既然是可插拔的,那么我们就可以用到很多地方了啊(当我们需要通用时)

OGNL_一点

ognl此表达式语言,是一门什么样的语言呢?下面然我为大家简单的讲解一点小小的关于它的内容吧! 然我来简单得解释说:OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言 重要的点:开源,方便,表达式语言; 我们选择使用ognl的原因就是,它相对于其他表达式语言的优势所具有的优势: 支持对象方法调用,如xxx.doSomeSpecial(): 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名]