硬件中断通常都需要在最短的时间内执行完毕,如果将所有硬件中断相关的处理都放在硬件中断处理程序中,那么就达不到这个目的。

通过linux提供的软中断和tasklet,可以将硬件中断处理程序中可以延迟处理的部分放到软中断和tasklet中处理。

1,软中断

linux内核定义了软中断的主要数据结构softirg_vec数组,该数组包含类型为softirg_action的32个元素,即0-31,这也代表软中断的优先级。softirg_action数组包含两个字段:一个函数指针,一个参数指针。通过这两个字段,可以执行任何函数。

在linux2.6中,只有前六个元素被使用。 如下图。在硬件中断中,可以将可延迟的部分以softirg_action的形式插入到软中断的某个优先级中,然后在硬件中断处理完以后,就会触 发软件中断的执行,执行时机在下面会有详细描述。

二,tasklet

tasklet是在软中断之上实现,在实现上做了一些优化,它与软中断的区别:

1,软中断 ,即使是同一类型的软中断,可以并发的运行在多个CPU上,所以内核程序员需要考虑同步问题。

2,类型不同的tasklet可以在多个CPU中并发执行,但相同类型的tasklet就不行,因此用tasklet,不用考虑同步问题,简化了设备驱动程序开发者的工作。

tasklet建立在HI_SOFTIRQ和TASKLET_SOFTIRQ两个软中断之上,分别称为:tasklet和高优先级的tasklet。因为HI_SOFTIRG比TASKLET_SOFTIRQ优先级高,所以后者总比前者先执行,除此之外,没有其它区别。

tasklet和高优先级的tasklet分别存放在tasklet_vec和tasklet_hi_vec数组中。以tasklet_vec为例,假如有8个CPU,那么它包含8个tasklet_head元素,每个元素都指向一个tasklet_struct组成的链表。tasklet_struct包含了一个tasklet所有的信息。

三,软中断和tasklet执行时机

直接贴图,如下。

为了保持软中断的低延迟性,软中断处理程序会一直运行把所有的挂起的软中断处理完。但这样会有一个问题就是它会运行很长时间,因而大大延迟用户态进程的执行。

因此,处理程序只做固定次数的循环,就返回。如果没有处理完,就启用一个内核线程来处理它们。

内核线程为重要而难以平衡的问题提供了解决方案,问题如下:

1,如果软中断过多,如果一直处理软中断,就会造成用户进程的饥渴。

2,如果人为的忽略部分软中断,在下一个执行周期执行它们,在最坏的情况下需要等待一个时钟中断(1/100秒)到来才能执行到,这对于网络开发者来说是不可以接受的。

内核线程优先级较低,因此用户进程就有机会运行,在机器空闲时,挂起的软中断就很快会被被执行。

四,内核线程

不多说,直接上图。下面这段话,说得很明白,感觉就是一个普通的进程,只不过它只运行在内核态罢了。

五,工作队列

在linux2.6中引入了工作队列,一句话,它其实就是用上面的内核线程来实现,只不过上面的内核线程只是在软中断处理不过来时的一种替代方案,而工作队则是完全由内核线程来实现。程序员只需要将执行任务放在工作队列中,然后就会有内核线程来执行它们。

为什么使用工作队列呢?因为有些可阻塞函数,例如访问磁盘,不能在软中断中执行。而工作队列执行在内核线程的上下文中,所以是可以执行这些阻塞函数的。

上面内容可以总结为一句话:内核提供了很多任务执行机制,程序员只需要选择一个合适的机制,将任务通过API放到里面,内核就会达到程序员的目的。

linux内核--软中断与tasklet的更多相关文章

  1. [Linux内核]软中断、tasklet、工作队列

    转自:http://www.cnblogs.com/li-hao/archive/2012/01/12/2321084.html 软中断.tasklet和工作队列并不是Linux内核中一直存在的机制, ...

  2. Linux内核实践之tasklet机制【转】

    转自:http://blog.csdn.net/bullbat/article/details/7423321 版权声明:本文为博主原创文章,未经博主允许不得转载. 作者:bullbat 源代码分析与 ...

  3. 内核软中断之tasklet机制

    1. 软中断IRQ简介 软中断(SoftIRQ)是内核提供的一种基于中断的延时机制, Linux内核定义的软中断有以下几种: enum { HI_SOFTIRQ=0, /*高优先级的tasklet*/ ...

  4. [Linux内核]软中断与硬中断

    转自:http://blog.csdn.net/zhangskd/article/details/21992933 本文主要内容:硬中断 / 软中断的原理和实现 内核版本:2.6.37 Author: ...

  5. Linux内核软中断

    1 软中断概述 软中断是实现中断下半部的一种手段,与2.5以前版本的下半段机制不同.软中断可以同时运行在不同的CPU上. 1.1 软中断的表示 内核中用结构体softirq_action表示一个软中断 ...

  6. Linux中断分层--软中断和tasklet

    1. Linux中断分层 (1)上半部:当中断发生时,它进行相应的硬件读写,并“登记”该中断.通常由中断处理程序充当上半部.(一般情况下,上半部不可被打断) (2)下半部:在系统空闲的时候,对上半部“ ...

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

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

  8. 《深入理解Linux内核》软中断/tasklet/工作队列

    软中断.tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来.下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任 ...

  9. Linux内核实现透视---软中断&Tasklet

    软中断 首先明确一个概念软中断(不是软件中断int n).总来来说软中断就是内核在启动时为每一个内核创建了一个特殊的进程,这个进程会不停的poll检查是否有软中断需要执行,如果需要执行则调用注册的接口 ...

随机推荐

  1. php练习2——乘法表,变量的使用

    目标:输出九九乘法表 程序: 结果: 目标: 程序variable01.html和variable01.php 结果:

  2. php 接口 implements 使用

    主要对类名,类所拥有的方法,以及所传参数起约束和规范做用,感觉跟php abstract 抽象类又有点像. 一,接口的定义和调用 <?php interface face1 { const pa ...

  3. 如何处理ajax中嵌套一个ajax

    在做项目的时候 遇到过第二次了 当我第二次去问'公子'的时候 被吐槽了 原来我以前遇到过 只是忘记了...他老人家竟然还记得... ajax由于他的异步特性 在第一次请求中的循环中嵌套第二个ajax会 ...

  4. Windows server2008 搭建ASP接口访问连接oracle数据库全过程记录--备用

    真的是太不容易了,以前的时候在window server 2003上面搭建了一套asp+oracle的接口系统,就费了好大的劲儿,其实那会迷迷瞪瞪的也不知道怎么的就弄好了,也懒得管了.OK,从昨天到今 ...

  5. Mozilla公布WebVR API标准草案

    随着信息技术的迅速发展,虚拟现实(Virtual Reality,VR)技术在近些年不断完善,其应用范围也变得十分广泛.为了搭建逼真的虚拟场景,VR技术一般都需要用到大量精美的图像和复杂的动作.因此, ...

  6. csu 10月 月赛 A 题

    Welcome to CSU OnlineJudge Problem A: Small change Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 15 ...

  7. how to develop mobile web

    http://blog.templatemonster.com/2010/05/11/how-make-mobile-website-6-easy-tips/ http://mobile.smashi ...

  8. ubuntu系统下创建软件桌面快捷方式

    转自ubuntu系统下创建软件桌面快捷方式 默认情况下,ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制- ...

  9. Being a Hero

    zoj3241:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3241 题意:一个国家的地图是一张n个点m条边的有向图.你保 ...

  10. 【HDU 5381】 The sum of gcd (子区间的xx和,离线)

    [题目] The sum of gcd Problem Description You have an array A,the length of A is nLet f(l,r)=∑ri=l∑rj= ...