当前位置:  技术问答>linux和unix

为什么softirq/tasklet运行在中断上下文?

    来源: 互联网  发布时间:2017-01-02

    本文导语:  不是有ksoftirqd辅助内核线程吗? 所以我感觉softirq/tasklet应该有时候会运行在这个内核线程的上下文中。 但是,LKD 上面说softirq/tasklet运行在中断上下文,何解? | 在__do_softirq()里执行softirq前...

不是有ksoftirqd辅助内核线程吗?
所以我感觉softirq/tasklet应该有时候会运行在这个内核线程的上下文中。
但是,LKD 上面说softirq/tasklet运行在中断上下文,何解?

|
在__do_softirq()里执行softirq前做了2个动作:
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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 谁对linux下的softirq有研究?
  • do_softirq 问题,初级
  • 高分求教:softirq中还用得着bh版本spin_lock_bh吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3