免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1193 | 回复: 0
打印 上一主题 下一主题

7.Bottom halves and Deferring Work [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-12 14:30 |只看该作者 |倒序浏览

    中断句柄只是中断处理的第一部分,因为下面一些限制,必须要有另外一部分来完整的处理中断:
    1.中断句柄是异步运行的,只要发生中断就会进入中断句柄,而中断的发生是异步的,也就是说随时可以发生。因此中断句柄可能会中断一些正在执行的重要代码,包括另外一个中断句柄。因此,中断浔?枰?】赡芸斓拇?斫崾??lt;/FONT>
    2.中断句柄运行时需要关中断,最好情况是禁止了当前的中断级(未设置SA_INTERRUPT),最坏的情况是所有的中断被中断(设置SA_INTERRUPT)。当然,关中断只是运行中断句柄时必要的步骤,适当的时候还是需要打开的。同样这也决定了中断句柄要尽快结束。
    3.中断句柄一般都是时间紧迫的任务,因为他们处理的是硬件。
    4.中断句柄不运行在进程上下文,因此不能被堵塞。
    因此,中断处理分成了两部分,第一部分就是中断句柄(top halves),一旦发生中断就必须执行;第二部分叫做bottom halves,用来处理剩下的那些不那么紧急的工作,目的很简单,就是让中断句柄尽可能快的返回。
    当然,中断句柄必须做些事情,比如确认收到中断,以及从硬件复制数据,这些事情是时间敏感的,因此必须在中断句柄中进行。
    剩下的事情就轮到bottom halves了,比如处理复制到内存的数据,什么是剩下的事情并没有硬性的规定,完全取决于驱动程序的作者。一般来说虽然不能认为哪一种划分是错的,但很容易能够找到次优解,基本原则就是尽可能减少中断句柄的持续时间。
    这是划分工作的一些小提示:
    1.如果工作是时间敏感的,放到中断句柄中。
    2.如果工作是与硬件本身相关的,放到中断句柄中。
    3.如果工作需要确保不被其他中断(尤其是同一个中断)中断,放到中断句柄中。(好吧,第一个中断是名词,表示除了正在处理的中断外发生的新的中断,第二个中断指的是正在处理一个中断是,又发生了一个同样的中断,第三个中断是动词。)
    4.其他的,放到bottom halves。
    写驱动程序时应该问问自己:哪些是必须放到中断句柄的,哪些是可以放到bottom halves里的。
    到这里应该已经清楚为什么要把中断处理分成两部分,不过bottom halves 要在什么时候调用?当然是在从现在开始将来系统不那么忙的某个时候。通常bottom halves总是在中断句柄返回之后马上运行,这个时候所有的中断都是打开的,因此bottom halves也还是有可能会被新中断打断的,不过对于处理器来说,100ms也是很长的时间了。
    Linux的发展史上出现了许多bottom halves处理机制,即便是现在的2.6内核,也有3种机制在同时使用,既然能同时存在,自然是各有用途,或者说各有各适合的场合。
    在早期,linux只有一个bottom halves,下面用BH来代替,这是个很简单的接口,当然也很适合那个时代。BH提供了一个静态创建的列表,包括32个BH,这样就可以使用一个32位的整型位图来标志。每一个BH都是全局同步的,也就是说无论什么情况下都只能有一个BH执行,即使在不同的处理器上也不能有第二个BH存在。这很容易通过刚才说的位图来控制。这个接口是容易使用但不灵活的,简单但是一个瓶颈。
    再后来,出现了task queues。内核定义了一个队列族,每一个队列包含了一个函数列表。驱动程序可以把需要调用的函数注册到某一个合适的队列中,排队的函数在某一个时间运行,这取决于位于哪一个队列中。Task queues还是不够灵活,仍然不能取代BH,对于处理像网络那样的performance-critical的子系统还是过于笨重。
   2.3开始引入了softirq和tasklet完全取代了BH。Softirq也是32个静态定义的bottom halves,不过与BH不同的是,softirq是可以同时在任一个处理器上运行的,即使是同样的两个同类型的也可以并发运行。Tasklet跟task没有关系,只是建立在softirq之上的,可以认为tasklet只是两个特殊的softirq。两个不同的tasklet可以在不同的处理器上并发运行,但是同样的tasklet不能同时运行。Tasklet是性能和易用性的一个很好的折中,对于大多数bottom-half处理来说,tasklet已经足够,softirq适合性能要求比较高的场合,如网络,scsi设备。另外,softirq是要在编译时静态注册的,而tasklet是可以动态注册的。
   2.5之后,work queue取代了task queue,这是运行在进程上下文的简单易用的一个方案。
    需要说明的是softirq只是一种bottom half机制。"Bottom half"是一个操作系统的通用名词,在linux中断处理体系中处理延期工作的机制都是bottom half。当然早期linux只有一种bottom half机制,这种机制也就被称为bottom half,或者BH,不过现在这种机制已经被丢弃。

to be continued...


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/10080/showart_1715811.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP