我知道有进程上下文和中断上下文,但我不明白何时执行softirq或微线程,它在哪个上下文下运行。
我看到有人用"下半上下文"这个词,如果有这个词,和其他人有什么区别?
另一个问题是,为什么在执行过程中不允许使用sleep ?
谁能帮我找出这些问题,谢谢!软线程和微线程都是一种底层机制。休眠是不允许的,因为它们运行在中断上下文中而不是进程上下文中。如果允许睡眠,那么linux将无法调度它们,最终导致内核panic,并出现dequeue_task错误。中断上下文甚至没有描述寄存器信息的数据结构,因此它们永远不能被linux调度。如果它被设计成具有这种结构并且可以被调度,那么中断处理过程的性能将受到影响。
@kai:您的qs regg在哪个上下文中执行?
从技术上讲,softirq的确实在一个中断上下文中运行——"softirq"上下文中;只是它不是"hard-irq"上下文(即硬件中断发生时的上下文)。
因此,在一个softirq处理程序中,根据Linux提供的'lookup'宏:
in_interrupt: yes | in_irq: no | in_softirq: yes | in_serving_softirq: yes
但是要注意(当心!!)):所有适用于中断处理程序的限制也适用于下半部分。因此,下半部不能休眠,不能访问用户空间,也不能调用调度器。"——LDD3。
Jermaine回答了你剩下的问题。
(更新)此外,我想指出的是,可以定义简单而优雅的宏,在需要时帮助打印调试信息。多年来,我把这些宏和方便例程放在一个头文件中;你可以在这里查看并下载:"A Header of Convenience"。
有以下宏/函数:
- 与funcname/line# info一起打印调试信息(通过通常的printk()或trace_printk()),并且仅当DEBUG模式为On时
- dump内核模式栈
- 打印当前上下文(进程或中断以及ftrace使用的形式的标志) 一个简单的assert()宏(!)
- 一个cpu密集型的DELAY_LOOP(对于必须在处理器上旋转的测试平台很有用)
- 相当于用户模式睡眠功能
- 计算给定两个时间戳(时间结构)的时间增量的函数
- 将十进制转换为二进制,
呼:-)
我同意接受的答案和Kaiwan的答案,但是他们没有提到ksoftirqd
。如果CPU处于软线程和/或微线程的繁重负载下,它会调度ksoftirqd
线程,该线程在进程上下文中处理引发的软线程和微线程。
所以我猜OP的问题的答案是:软件可以在中断或进程上下文中运行。
更新:快速查看run_ksoftirqd()
,可以发现__do_softirq()
在禁用本地irqs的情况下被调用。因此,当技术上在进程上下文中运行时,同样的限制(如不休眠)也适用。