do_irq中调用do_softirq的原因

来源:互联网 发布:云校软件下载 编辑:程序博客网 时间:2024/06/03 05:01
这个是Linux的策略。中断是紧急事务,按理都应该立即处理,不得耽误。从理论上来说,是不应该有softirq这种事物的。但在现实中,如果系统总是保证处理完所有中断才干其它事情,那必然就会长时间阻塞其它子系统和用户态程序。引入softirq就成为工程中一种折中。

但中断毕竟是紧急事务,系统在不繁忙的时候应该尽快处理它,所以才会在do_irq后接着调do_softirq。这里加了判断,在中断嵌套时不能做do_softirq,因为中断嵌套表示系统中断频繁了,不能因为处理中断阻塞其它子系统。所以在通常情况下,中断都是一次处理掉的


中断的下半部机制中,tasklet和软中断都是在do_softirq的调用上被执行的,是在中断上下文中被执行的,其中tasklet不允许在多个处理起上执行。。至于工作队列的方式,她是以另一个线程的方式实现的,初始化时创建,调用时唤醒,其实request_thread_irq是将中断线程化,包括利用定时器实现延时处理,这都不是在中断上下文中,所以在写驱动的时候这几种方式的实现一定要搞清楚。