我知道有进程上下文和中断上下文但我不明白在执行softirq或tasklet时,它在哪个上下文中运行。
我看到有些人使用“下半部分上下文”一词,如果有这样的术语,与其他人相比有什么不同。
softirq和tasklet的另一个问题是为什么在执行期间不允许睡眠?
任何人都可以帮我识别这些问题,谢谢!!
答案 0 :(得分:16)
softirq和tasklet都是下半部分机制。不允许睡眠,因为它们在中断上下文而不是进程上下文中运行。如果允许sleep,则linux无法安排它们,最终导致内核崩溃并出现dequeue_task错误。中断上下文甚至没有描述寄存器信息的数据结构,因此它们永远不会被linux调度。如果它被设计为具有该结构并且可以被调度,则将实现中断处理过程的性能。
答案 1 :(得分:12)
@kai:你的qs reg哪个上下文执行了?
从技术上讲,softirq的做在中断上下文中运行 - “softirq”上下文;它只是它不是“hard-irq”上下文(这是发生硬件中断时的上下文)。
因此,在softirq处理程序中,就Linux提供的“查找”宏而言:
in_interrupt:是| in_irq:没有| in_softirq:是的in_serving_softirq:是的
但要注意(小心!!! :): “适用于中断处理程序的所有限制也适用于下半部分。因此,下半部分无法休眠,无法访问用户空间,也无法调用调度程序。” - LDD3。
杰梅因回答了你的其余问题。
[更新] 另外,我想指出一个人可以定义简单而优雅的宏,以便在需要时帮助打印调试信息。多年来,我已将这些宏和便利例程放入头文件中;你可以看一下download it here: "A Header of Convenience"。
有以下宏/函数:
哇: - )
答案 2 :(得分:6)
我同意接受的答案和Kaiwan的回答,但他们没有提到ksoftirqd。如果CPU负载很多softirqs和/或tasklet,它会调度其ksfotirqd线程,该线程在进程上下文中处理引发的softirqs和tasklet。
所以我猜OP的问题的答案是:softirqs可以在中断或进程上下文中运行。