【问题标题】:Exactly when tasklet runs after it is schedule by ISR?究竟是什么时候 tasklet 在 ISR 安排后运行?
【发布时间】:2015-05-01 01:53:23
【问题描述】:

我编写了 ISR,我的 tasklet 立即运行。 但是,我看到有人说 tasklet 只有在得到 CPU 关注时才会运行。这是一个非常通用的术语CPU 注意力,所以我为那些响应者背诵。我的意思是 CPU 的注意力到底是哪一刻转移到 tasklet 执行以及 CPU 的状态发生了什么?

其次,如果假设我不断收到硬中断,那么 tasklet 什么时候有机会运行?小任务可能没有机会运行吗?内核如何处理这些事情?

【问题讨论】:

    标签: linux linux-kernel linux-device-driver embedded-linux


    【解决方案1】:

    TL;DR:Tasklet 由调度程序处理的 ksoftirq 线程运行。


    Tasklet 只是 softirq 的一种形式(由它们以TASKLET_SOFTIRQ 优先级处理),因此运行 tasklet 的规则适用于它们。根据 Robert Love 的书《Linux Kernel 发展”:

    1. 在从硬件中断代码路径返回中
    2. ksoftirq 内核线程中
    3. 在任何显式检查并执行挂起的软中断的代码中,例如网络子系统

    如果threadirqs=true(内核启动参数)是默认值,情况(1)似乎不起作用。


    UPD:关于 ksoftirq 与调度程序关系的一些说明。

    这似乎发生了:

    1. hardirq 处理程序中,您唤醒 ksoftirq(由于 tasklet_schedule()
    2. 因此wake_up_process() 检查ksoftirq 是否可以抢占当前线程
    3. 如果 (2) 为真,TIF_NEED_RESCHED 标志已设置
    4. hardirq 返回时(ret_from_intr - 在 x86 中)TIF_NEED_RESCHED 标志被检查
    5. 如果 (4) 为真,则调用 schedule() 尝试选择下一个要执行的线程。

    ksoftirq 很有可能会在 (2-3) 中被视为抢占候选并在 (5) 中被选中,但如果有竞争者,ksoftirq strong> 必须等到下一个 schedule() 循环 - 当前线程投降(即休眠)、时钟滴答发生、系统调用或新中断。

    【讨论】:

    • 同意!!我的问题有点不同
    • @Manish,术语“完全”不适用于内核调度程序,因为ksoftirq 线程被视为与其他线程一样。您可以尝试找出“最坏情况”,但这取决于您的系统有多忙。
    • 这意味着,如果我继续硬 irq,它可能无法运行。我的意思是说,ksoftirqd 会在系统处于重负载状态时出现。但是假设在 __do_softirq 放弃控制后立即生成新的中断。所以在这种情况下,tasklet 不会被执行,这种情况就像“软锁定”。您说“忙”意味着 tasklet 可能无法运行!请对此有所了解。
    • 只信任内核线程调度器;内核神奇的调度算法将确保你的 tasklet 最终运行。它不应该是你关心的确切时间。如果系统繁忙到根本无法执行您的 tasklet,那么您将遇到更大的问题......
    • @tangrs:你的意思是它可能会或可能不会执行取决于CPU是否
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2014-09-09
    • 2017-12-11
    • 2023-02-25
    相关资源
    最近更新 更多