Linux 中断之下半部机制
2015-12-01 12:33
591 查看
前言
有些事情开了就等于跳悬崖了。 中断之下半部机制。__start
下半部的机制还是因为中断上下文不可以睡眠,并且内核需要它快速响应所以,将它分成了两个部分,一个是前半部,一个是下半部。中断处理程序以异步的方式执行,并且它有可能会打断其他重要的代码的执行。因此为了避免被打断代码停止时间过长。中断处理程序应该执行的越快越好。就像前面所说的,中断处理程序往往需要对硬件进行操作,所以有很高的时限要求。并且不能在进程上下文中运行因为他们不可以被打断。
上半部的要求
如果一个任务对时间非常敏感,将其放在中断处理程序如果一个任务和硬件相关,将其放在中断处理程序中执行
如果一个任务要保证不被其他中断打断,将其放在中断处理程序中执行。
其他所有任务,考虑放置在下半部执行
使用下半部的原因
唯一的原因就是提高系统的响应能力,提高系统的性能。下半部的环境
下半部现阶段有三个机制:工作队列,软中断,tasklet.其实tasklet 是基于软中断实现的,而工作队列是另一退后的方式。
几种推后机制的区别
首先对比软中断与tasklet .软中断:系统级别的静态编译的程序,不能动态的注册或注销,擅长处理高并发的中断,比如网卡。它有32个接口,可以在所有处理器上同时执行,即使两个类型相同也可以。
tasklet: 这是基于软中断的一种灵活的实现,它是动态的可分配的,两个不同的tasklet 可以在不同的处理器上同时执行,但是类型相同的tasklet 不能同时执行。由此可见这其实又是一种折中的产物。但是他可以动态的注册。使用性较强。
比较这两种机制的异同:
相同之处:执行环境都在中断上下文,这就保证了他们都是不能中断的。
不同之处:tasklet 同类型不能同时执行
工作队列:另一种推后机制,工作队列可以把工作推后,交由一个内核线程执行这个下半部分总是在进程的上下文中执行。它是唯一能在进程上下文中运行的下半部实现机制。它和之前的两个东西不同,它是在进程上下文中的,是和进程上下文一样被调度的。
一个tasklet 的模块实例
[c]#include<linux/module.h>
#include<linux/init.h>
#include<linux/interrupt.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zmrlinux");
MODULE_DESCRIPTION("tasklet");
unsigned long dev = 1;
void my_tasklet_handler(unsigned long data);
//DECLARE_TASKLET(my_tasklet,my_tasklet_handler,dev);
void my_tasklet_handler(unsigned long data){
int i = 10;
while(i > 0){
printk("hello world\n");
i--;
}
}
struct tasklet_struct my_tasklet;
static int __init test_task(void){
tasklet_init(&my_tasklet,my_tasklet_handler,dev);
tasklet_schedule(&my_tasklet);
printk("hello world\n");
return 0;
}
static void __exit test_out(void){
printk("ByBy\n");
}
module_init(test_task);
module_exit(test_out);
[/c]
执行结果:
查看原文:http://zmrlinux.com/2015/12/01/linux-%e4%b8%ad%e6%96%ad%e4%b9%8b%e4%b8%8b%e5%8d%8a%e9%83%a8%e6%9c%ba%e5%88%b6/
相关文章推荐
- linux下的程序调试工具gdb
- linux下软链接和硬链接的区别 【转】
- linux下VI模式中上下左右键和回退键出现字母
- linux开机到登陆的启动过程描述 【转】
- 老男孩linux培训某节课前考试试题及答案分享 【转】
- 每天一个linux命令(52):scp命令
- 每天一个linux命令(51):rcp命令
- 每天一个linux命令(50):telnet命令
- 每天一个linux命令(49):ss命令
- 深入理解Linux修改hostname
- Linux命令收集
- linux时间时区设置修改及时间同步
- 每天一个linux命令(48):netstat命令
- 每天一个linux命令(47):traceroute命令
- 每天一个linux命令(46):ping命令
- 每天一个linux命令(45):route命令
- 每天一个linux命令(44):ifconfig命令
- Zookeeper入门-Linux环境下异常ConnectionLossException解决
- Zookeeper入门-Linux环境下异常ConnectionLossException解决
- Zookeeper入门-Linux环境下异常ConnectionLossException解决