linux中断处理(linux内核设计与实现第三版)

      最近看linux内核设计和实现,看到第七章 中断和中断处理,在这里总结一下。


中断处理程序是内核中很有用的部分,但是存在一些局限

1)中断处理程序以异步方式执行,并且它有可能会打断其他重要代码(甚至包括其他中断处理程序)的执行。

因此,为了避免被打断的代码停止时间过长,中断处理程序应该执行得越快越好。

2)如果当前有一个中断处理程序正在执行,在最好的情况下(如果IRQF_DISABLED有被设置),

与该中断同级的其他中断会被屏蔽,在最坏的情况下(如果设置了IRQF_DISABLED),

当前处理器上所有的其他中断都会被屏蔽。因为禁止中断后,硬件与操作系统无法通信,

因此,中断处理程序执行得越快越好。

3)由于中断处理程序往往需要对硬件进行操作,所以他们通常有很高的时限要求

4)中断处理程序不在进程上下文中运行,所以它们不能阻塞。这限制了它们所做的事情。

所以中断处理程序只能作为整个硬件中断处理流程的一部分的原因就很明显了。

一、最新的linux内核(2.6开始),中断处理分上半部,下半部(推后执行工作)。

  1、 整个中断处理流程就被分为两半,上半部是中断处理程序,内核通过对它的异步执行,完成对硬件中断的即时响应;
下半部就是执行与中断处理密切相关但中断处理程序本身不执行的工作。 

ps: 上半部简单快速,执行的时候禁止一些或者全部中断;下半部稍后执行,而且执行期间可以响应所有的中断。

2、下半部状态图


从上图可以看出最新的内核,下半部处理机制只有三种了,软中断、tasklet以及工作队列(Work queues).

1)软中断
软中断保留给系统中对时间要求最严格以及最重要的下半部使用。
目前,只要两个子系统直接使用软中断,它们就是网络和SCSI。

2)tasklet
tasklet是利用软中断实现的。
大多数情况下,为了控制一个寻常的硬件设备,tasklet机制都是实现自己的下半部的最佳选择。

**************************************************************************************************************************************
每个处理器都有一组辅助处理软中断(和tasklet)的内核线程。
因为软中断被触发的频率有时可能很高,更不利的是,处理函数有时还会自行重复触发。
如果软中断本身出现的频率就高,再加上它们又有将自己重新设置为可执行状态的能力,那么就会导致用户空间进程无法获得足够的处理器时间,因此出于饥饿状态。
而且单纯的对重新触发的软中断采取不立即处理的的策略,也无法让人接收。
在设计软中断的时候,开发者就意识到需要一些折中。最终在内核中实现的方案是不会立即处理重新触发的软中断。而作为改进,当大量的软中断出现的时候,
内核会唤醒一组内核线程来处理这些负载。这些线程在最低的优先级上运行(nice值是19),这能避免它们跟其他重要的任务抢夺资源。每个处理器都有一个这样的线程。
所以线程的名字都叫ksoftirqd/n,区别在于n,它对应处理器的编号。
****************************************************************************************************************************************

3)工作队列
工作队列(work queues)是另外一种将工作推后执行的形式,它和我们前面讨论的所有其他形式都不相同。
工作队列可以把工作推后,交由一个内核线程去执行---------这个下半部分总是会在进程上下文中执行。
如果你需要用一个可以重新调度的实体来执行你的下半部处理,你应该使用工作队列。它是唯一能在进程上下文中运行的下半部实现机制,
也只有它才可以睡眠。 这意味着在你需要获得大量的内存时,在你需要获得信号量时,在你需要执行阻塞式的I/O 操作时,它都会非常有用。
如果你不需要用一个内核线程来推后执行工作,那么就考虑使用tasklet吧。

二、下半部机制的选择
1、如果被考察的代码本身多线索化的工作就做得非常好,比如网络子系统,它完全使用单处理变量,那么软中断就是非常好的选择。
对于时间要求严格和执行频率很高的应用来说,它执行得也很快。
2、如果代码多线索化考虑得并不充分,那么选择tasklet意义更大。它的接口非常简单,而且,由于两个同种类型的tasklet不能同时执行,所以实现起来也会简单一些。、
3、如果你需要把任务推后到进程上下文中完成,那么在这三者中就只能选择工作队列了。如果进程上下文比不是必须的条件(明确点说,就是如果并不需要睡眠),
那么软中断和tasklet可能更合适。

如果讲到易于使用,工作队列就最简单,使用缺省的events队列简答不费吹飞之力。截下来是tasklet,它的接口也很简单。最后才是软中断,它必须静态创建,
并且需要慎重考虑其实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值