我知道有进程上下文和中断上下文,但我不明白当执行softirq或tasklet时,它在哪个上下文下运行。
我见过一些人使用术语“下半部分上下文”,如果有这样的术语,与其他术语相比有什么不同。
对softirq和tasklet的另一个问题是,为什么在执行过程中不允许休眠?
有人能帮我找出这些问题吗,谢谢!
发布于 2011-08-21 12:38:23
softirq和tasklet都是一种下半部机制。不允许休眠,因为它们在中断上下文而不是进程上下文中运行。如果允许休眠,那么linux就不能对它们进行调度,最终导致内核死机并出现dequeue_task错误。中断上下文甚至没有描述寄存器信息的数据结构,因此它们永远不能被linux调度。如果它被设计成具有该结构且可以被调度,则中断处理过程的性能将受到影响。
发布于 2011-11-25 12:32:55
@kai:你的qs reg在哪个上下文中执行下半部分?
从技术上讲,softirq确实运行在中断上下文中-- "softirq“上下文;只是它不是"hard-irq”上下文(硬件中断发生时的上下文)。
因此,在softirq处理程序中,就Linux提供的“lookup”宏而言:
in_interrupt:是| in_irq:否| in_softirq:是| in_serving_softirq:是
但要注意(注意!:):“所有适用于中断处理程序的限制也适用于下半部分。因此,下半部分不能睡眠,不能访问用户空间,也不能调用调度程序。”-- LDD3。
Jermaine回答了你剩下的问题。
更新另外,我想指出的是,我们可以定义简单而优雅的宏,在需要的时候帮助打印调试信息。多年来,我已经将这些宏和方便的例程放在一个头文件中;您可以将其签出并执行download it here: "A Header of Convenience"。
有一些宏/函数可用于:
仅当调试模式处于打开状态时,
的
Whew :-)
发布于 2014-10-17 14:55:38
我同意公认的答案和开云的答案,但他们没有提到ksoftirqd。如果CPU处于软中断和/或微线程的繁重负载下,它会调度它的ksoftirqd线程,该线程在进程上下文中处理提升的软中断和微线程。
所以我猜OP问题的答案是: softirqs可以在中断或进程上下文中运行。
更新:在run_ksoftirqd()上快速查看一下就会发现,调用__do_softirq()时禁用了本地irqs。因此,在技术上运行在进程上下文中时,同样的限制(如无休眠)也适用。
https://stackoverflow.com/questions/7135915
复制相似问题