软中断保留给系统中对时间要求严格以及最重要的下半部使用;目前,只有两个子系统(网络和SCSI)直接使用软中断;此外,内核定时器和tasklet都是建立在软中断上的;在使用软中断之前,要先确定为什么不能使用tasklet,tasklet可以动态生成,并且对加锁的要求不高,使用起来也很方便,性能也不错;当然,对于时间要求严格并能自己高效完成加锁的工作,软中断是正确的选择;

分配索引

在编译期间,通过在<linux/interrupt.h>中定义一个枚举类型来静态的声明软中断,内核用这些索引来表示优先级,索引号小的软中断在索引号大的软中断之前执行;

建立新的软中断必须在此枚举的类型中加入新的项;加入时,不能像其他地方一样,简单的把项增加到列表的末尾;相反,必须根据希望赋予她的优先级来决定加入的位置;习惯上,HI_SOFTIRQ通常作为第一项,而RCU_SOFTIRQ作为最后一项;新项可能插在BLOCK_SOFTIRQ和TASKLET_IRQ之间;

 enum
{
HI_SOFTIRQ=,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
IRQ_POLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ, /* Unused, but kept as tools rely on the
numbering. Sigh! */
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */ NR_SOFTIRQS
};
注册处理程序

在运行时,通过调用open_softirq()注册软中断处理程序,该函数有两个参数:软中断的索引号和处理函数;

 void open_softirq(int nr, void (*action)(struct softirq_action *));

如网络子系统注册中断的方式如下:

 open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);
 open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);

软中断处理程序执行的时候,允许响应中断,但是它自己不能休眠;在一个处理程序运行的时候,当前处理上的软中断被禁止;但其他处理器上仍可以执行别的软中断;如果同一个软中断在它被执行的同时再次触发了,那么另外一个处理器可以同时运行其处理程序;这意味着任何共享数据都需要严格的锁保护;这也是tasklet更受青睐的原因;大部分软中断处理程序,都通过使用单处理器数据或者其他一些技巧来避免显式的加锁,从而获得更出色的性能;

引入软中断的主要原因是其可扩展性;如果不需要扩展到多个处理器,那么,使用tasklet是好的选择;tasklet本质上也是软中断,只不过同一个处理程序的多个实例不能再多个处理器上同时运行;

软中断的触发

通过在枚举类型的列表中添加了新项之后,并调用open_softirq()进行了注册,新的软中断处理程序就能够运行了;raise_softirq()函数可以将一个软中断设置为挂起状态,让它在下次调用do_softirq()函数时投入运行;

raise_softirq()函数再触发一个软中断之前要先禁止中断,触发之后再恢复原来的状态;如果中断本来就已经被禁止了,那么可以调用raise_softirq_irqoff()函数,将会带来一些优化效果;

 void raise_softirq_irqoff(unsigned int nr);
void raise_softirq(unsigned int nr);

在中断处理程序中触发软中断是最常见的形式,在这种情况下,中断处理程序执行硬件设备的相关操作,然后触发相应的软中断,最后退出;内核在执行完中断处理程序以后,马上就会调用do_softirq()函数;于是软中断开始执行中断处理程序留给它去完成的剩余任务;

最新文章

  1. 7.5 数据注解特性--MaxLength&amp;&amp;MinLength
  2. 安卓与PC网络对接实现视频实时播放
  3. noi 2718 移动路线
  4. HYSBZ 4197 寿司晚宴
  5. Linux 怎么查看服务的启动进程所占用的目录
  6. JS删除script标签
  7. SRM593(1-250pt,500pt)
  8. BZOJ 3544: [ONTAK2010]Creative Accounting( BST )
  9. tomcat-theory
  10. 一起学Android之ProgressBar
  11. PowerPoint 中插入 Latex 公式
  12. docker备份mongodb数据,导入导出
  13. SSIS - 1.简介
  14. WPF DEV gridcontrol当前项的数据导出为mdb文件
  15. C++版 - LeetCode 144. Binary Tree Preorder Traversal (二叉树先根序遍历,非递归)
  16. 杭电ACM2002--计算球体积
  17. Spark学习笔记——基于MLlib的机器学习
  18. 2017年P4中国峰会北京站 会议小结
  19. Cocos2d-x 3.x 在wp8中调用系统字体的解决方案
  20. BZOJ 1208: [HNOI2004]宠物收养所 SET的妙用

热门文章

  1. express 和 vue-cli 的博客网站
  2. ubuntu创建kvm虚拟机
  3. python自定义小工具:密码匿名化、毫秒时间显示、人类易读字节
  4. selenium重定向新窗口
  5. 【shell】shell基础
  6. int类型按字节打印输出
  7. winform中使用缓存
  8. Exams(二分
  9. NLP传统基础(2)---LDA主题模型---学习文档主题的概率分布(文本分类/聚类)
  10. JAVA遇见HTML——JSP篇(1、JAVA WEB简介)