当前位置: 技术问答>linux和unix
为什么softirq/tasklet运行在中断上下文?
来源: 互联网 发布时间:2017-01-02
本文导语: 不是有ksoftirqd辅助内核线程吗? 所以我感觉softirq/tasklet应该有时候会运行在这个内核线程的上下文中。 但是,LKD 上面说softirq/tasklet运行在中断上下文,何解? | 在__do_softirq()里执行softirq前...
不是有ksoftirqd辅助内核线程吗?
所以我感觉softirq/tasklet应该有时候会运行在这个内核线程的上下文中。
但是,LKD 上面说softirq/tasklet运行在中断上下文,何解?
所以我感觉softirq/tasklet应该有时候会运行在这个内核线程的上下文中。
但是,LKD 上面说softirq/tasklet运行在中断上下文,何解?
|
在__do_softirq()里执行softirq前做了2个动作:
1. __local_bh_disable禁止下半部中断,实际上是禁止了抢占
2. local_irq_enable()使能硬件中断
因此在执行softirq时处于中断上下文(因为禁止了抢占,表明只有硬件中断ISR能够打断当前的softirq,但是其他的内核路径是不能够打断其执行的),而由于禁止了抢占,所以此时是不能调度的(禁止抢占表明无法调度至别的进程,而你如果调用会调度的函数可想而知会有什么问题)。
1. __local_bh_disable禁止下半部中断,实际上是禁止了抢占
2. local_irq_enable()使能硬件中断
因此在执行softirq时处于中断上下文(因为禁止了抢占,表明只有硬件中断ISR能够打断当前的softirq,但是其他的内核路径是不能够打断其执行的),而由于禁止了抢占,所以此时是不能调度的(禁止抢占表明无法调度至别的进程,而你如果调用会调度的函数可想而知会有什么问题)。
|
tasklet是借助软中断实现的,它被注册在某一个cpu上,只有这个cpu可以调度使用,当中断返回时,内核将设置软中断,然后选择时机调度执行,所以他就被设计在中断上下文。工作队列是独立的线程,所有cpu都可以调动,当中断返回后,内核可以随便选个时间调度执行,这是我的理解。
|
中断的处理分为上半部和下半部,下半部的实现方法有盘softirq, tasklet, 工作队列等。
|
+1
|
softirq先是跑在中断上下文中,如果处理的数据量超过所定的上限,就会放弃处理,而让softirqd内核线程接手处理。
|
tasklet是借助软中断实现的,它被注册在某一个cpu上,只有这个cpu可以调度使用,当中断返回时,内核将设置软中断,然后选择时机调度执行,所以他就被设计在中断上下文。工作队列是独立的线程,所有cpu都可以调动,当中断返回后,内核可以随便选个时间调度执行,这是我的理解。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。