ISR计划之后,tasklet是否正确运行?
我写了我的ISR,我的tasklet立即运行。 但是 ,我看到有人说,只有在CPU受到关注时才运行它。 这是一个非常通用的CPU注意事项,所以我为这些响应者背诵。 我的意思是确切的时刻CPU注意去执行任务和CPU的状态发生了什么?
其次,如果假设我继续进行硬中断,那么tasklet何时有机会运行? tasklet可能没有机会运行吗? 内核如何处理这些事情?
TL; DR:Tasklet由Scheduler处理的ksoftirq线程运行。
Tasklet只是softirq的一种形式(它由TASKLET_SOFTIRQ
优先级处理),所以运行tasklet时的规则适用于它们。 在这里,他们根据Robert Love的书“Linux Kernel Development”:
如果threadirqs=true
(内核引导参数)是默认值,那么情况(1)似乎不起作用。
UPD :关于与Scheduler的ksoftirq关系的一些说明。
这似乎发生了:
tasklet_schedule()
) wake_up_process()
检查ksoftirq是否可以抢占当前线程 TIF_NEED_RESCHED
标志 ret_from_intr
- 在x86中)时检查TIF_NEED_RESCHED
标志 schedule()
试图选择下一个要执行的线程。 ksoftirq很有可能在(2-3)中被认为是抢先候选者,而在(5)中被选中,但如果有竞争者, ksoftirq必须等到下一个schedule()
循环 - 当前线程投降(即睡眠),时钟滴答发生,系统调用或新的中断。