linux内核--软中断与tasklet
硬件中断通常都需要在最短的时间内执行完毕,如果将所有硬件中断相关的处理都放在硬件中断处理程序中,那么就达不到这个目的。
通过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的更多相关文章
- [Linux内核]软中断、tasklet、工作队列
转自:http://www.cnblogs.com/li-hao/archive/2012/01/12/2321084.html 软中断.tasklet和工作队列并不是Linux内核中一直存在的机制, ...
- Linux内核实践之tasklet机制【转】
转自:http://blog.csdn.net/bullbat/article/details/7423321 版权声明:本文为博主原创文章,未经博主允许不得转载. 作者:bullbat 源代码分析与 ...
- 内核软中断之tasklet机制
1. 软中断IRQ简介 软中断(SoftIRQ)是内核提供的一种基于中断的延时机制, Linux内核定义的软中断有以下几种: enum { HI_SOFTIRQ=0, /*高优先级的tasklet*/ ...
- [Linux内核]软中断与硬中断
转自:http://blog.csdn.net/zhangskd/article/details/21992933 本文主要内容:硬中断 / 软中断的原理和实现 内核版本:2.6.37 Author: ...
- Linux内核软中断
1 软中断概述 软中断是实现中断下半部的一种手段,与2.5以前版本的下半段机制不同.软中断可以同时运行在不同的CPU上. 1.1 软中断的表示 内核中用结构体softirq_action表示一个软中断 ...
- Linux中断分层--软中断和tasklet
1. Linux中断分层 (1)上半部:当中断发生时,它进行相应的硬件读写,并“登记”该中断.通常由中断处理程序充当上半部.(一般情况下,上半部不可被打断) (2)下半部:在系统空闲的时候,对上半部“ ...
- Linux内核中的软中断、tasklet和工作队列具体解释
[TOC] 本文基于Linux2.6.32内核版本号. 引言 软中断.tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的"下半部"(bottom ...
- 《深入理解Linux内核》软中断/tasklet/工作队列
软中断.tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来.下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任 ...
- Linux内核实现透视---软中断&Tasklet
软中断 首先明确一个概念软中断(不是软件中断int n).总来来说软中断就是内核在启动时为每一个内核创建了一个特殊的进程,这个进程会不停的poll检查是否有软中断需要执行,如果需要执行则调用注册的接口 ...
随机推荐
- 相看系统中用户的信息 passwd, shadow
用用户的信息都保存在 etc/passwd 和 etc/shadow 文件中,其中 shadow 保存的是经过加密码的 能过 cat etc/passwd 和 cat etc/shadow 来查看相关 ...
- [C#]async/Await 使用小计
如果指定使用 异步 或 异步 修饰符,方法是异步方法,可以实现以下两个函数. • 清单异步方法可以使用 Await 或指定的 等待 悬挂点. 等待运算符通知编译器异步方法不能继续点的过去,直到等待 ...
- uploadify插件的使用
插件: uploadify.css jquery.uploadify.js bootstrap html代码: <input type="file" name="u ...
- 使用Unidac内置连接池
第一步: 放一个TUniconnection并设置相关属性 之后直接使用TUniconnection对象即可 跟踪unidac源码uni单元1540行中可以看到 Connect方法调用CreateIC ...
- 【javascript 动态添加数据到 HTML 页面】
今天简单的学习了一下有关对象字面量的定义和 javascript 如何取出对象字面量的值的知识,javascript 动态添加数据到 HTML 页面的问题. [学习目标]有如下的一组数据通过 Ajax ...
- [GUIDE] How to install Scipy in Maya Windows 64 bit - Google 网上论坛 - Google Chrome
I've seen a lot of queries about getting scipy working in Maya (Windows 64 bit) with a few not 100% ...
- “父窗口拖动的时候Popup不随着父窗口移动”问题的解决方案
我们用WPF用的Popup时候会发现,当 StaysOpen=True 的时候,因为Popup不会消失,在父窗口移走的时候Popup仍旧在原地...作者在国外网站上无意间发现了这个解决方案,拿出来给大 ...
- 第 7 章 门面模式【Facade Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 好,我们继续讲课.大家都是高智商的人,都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内 ...
- 网页增重不可控?试试 OneAPM Cloud Test
再次发生了!HTTP Archive 报告在收集了 50 万个最受欢迎的网站的技术信息,经过整理分析后指出:2015 年,网页的平均「体重」增加了 16%,达到了 2,262 KB,近似于 2014 ...
- [科普贴]为何Flash被淘汰?附Chrome看视频最完美教程!
Adobe 公司放弃 移动 平台的 Flash 支持已经是板上钉钉的事了, Google Play 的 Flash 插件也会在 8 月份下架,这在一定程度上也会促进 HTML5 的发展和普及,因此我个 ...