首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >softirq和tasklet在哪个上下文中?

softirq和tasklet在哪个上下文中?
EN

Stack Overflow用户
提问于 2011-08-21 10:13:51
回答 3查看 13K关注 0票数 17

我知道有进程上下文和中断上下文,但我不明白当执行softirq或tasklet时,它在哪个上下文下运行。

我见过一些人使用术语“下半部分上下文”,如果有这样的术语,与其他术语相比有什么不同。

对softirq和tasklet的另一个问题是,为什么在执行过程中不允许休眠?

有人能帮我找出这些问题吗,谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-21 12:38:23

softirq和tasklet都是一种下半部机制。不允许休眠,因为它们在中断上下文而不是进程上下文中运行。如果允许休眠,那么linux就不能对它们进行调度,最终导致内核死机并出现dequeue_task错误。中断上下文甚至没有描述寄存器信息的数据结构,因此它们永远不能被linux调度。如果它被设计成具有该结构且可以被调度,则中断处理过程的性能将受到影响。

票数 21
EN

Stack Overflow用户

发布于 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"

有一些宏/函数可用于:

仅当调试模式处于打开状态时,

  • 才会打印函数名/宏信息(通过通常的printk()或line# ()),并将内核模式转储到当前上下文(进程或中断以及stack
  • print uses)
  • a简单断言()宏(!)line# (!)
  • a cpu密集型DELAY_LOOP (!)形式的标志)(对于必须在usermode上旋转的测试机非常有用在给定两个时间戳的情况下计算时间增量的睡眠functionality
  • a函数(timeval structs)
  • convert decimal to binary,和几个more.

Whew :-)

票数 15
EN

Stack Overflow用户

发布于 2014-10-17 14:55:38

我同意公认的答案和开云的答案,但他们没有提到ksoftirqd。如果CPU处于软中断和/或微线程的繁重负载下,它会调度它的ksoftirqd线程,该线程在进程上下文中处理提升的软中断和微线程。

所以我猜OP问题的答案是: softirqs可以在中断或进程上下文中运行。

更新:在run_ksoftirqd()上快速查看一下就会发现,调用__do_softirq()时禁用了本地irqs。因此,在技术上运行在进程上下文中时,同样的限制(如无休眠)也适用。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7135915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档