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检查是否有软中断需要执行,如果需要执行则调用注册的接口 ...
随机推荐
- SVG
目前SVG在国内的使用并不常见,并且关于svg的相关js库也不多,这里指出两款svg的库Snap.svg和svg.js,Snap.svg张鑫旭的博客上有关于他的使用APi http://www.zha ...
- shell for循环+case的脚本(监控程序状态)
分享一个shell for循环+case的脚本(监控程序状态) 分享一个for循环+case的脚本(监控程序状态并执行相关操作) ,供大家学习参考. 复制代码代码如下: #/bin/bash set ...
- hadoop2——新MapReduces——yarm详解
YARN总体上仍然是Master/Slave结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResourceManager负责对各个Nod ...
- 一个简单的makefile,一次性编译本文件夹下所有的cpp文件
代码: CXX := g++ CFLAGS := -g TARGET := xxx.exe SRCS := $(wildcard *.cpp) OBJS := $(patsubst %cpp,%o,$ ...
- 1500: [NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- Docker 安装jupyter notebook
1. 利用image运行一个container sudo docker run -it --net=host tingting --net=host:让container可以上网,安装原来的sudo ...
- delphi xe5 android 开发实现手机打电话和发短信
转载自 http://www.raysoftware.cn/ 其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功 ...
- 时序图(Sequence Diagram)
控制焦点Focus on Control 的取值: Alternative fragment(denoted “alt”) 与 if…then…else对应 Option fragment (deno ...
- uva 10881 - Piotr's Ants
这个题的突破点就在于蚂蚁不能够穿过对方,故相对位置不变: 另外,又可以把蚂蚁看成运动方向不变: 代码: #include<cstdio> #include<algorithm> ...
- 【GDOI2014 DAY2】Beyond (扩展KMP)
[题目] [题意] Jodie和Aiden在做游戏.Jodie在一个长度为l字符串环上走路,他每离开一个就会记下格子当前字符.他让Aiden在他走了一圈后叫他停下来.Aiden决定耍一下Jodie,在 ...