哪个上下文是软线程和微线程



我知道有进程上下文和中断上下文,但我不明白何时执行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的情况下被调用。因此,当技术上在进程上下文中运行时,同样的限制(如不休眠)也适用。

相关内容

  • 没有找到相关文章

最新更新