时间中断之后是否总是会调用调度程序?

The*_*eer 5 linux scheduling interrupt linux-kernel

当定时器中断发生时,ISR 被调用来服务该中断。

是否可以假设每个计时器中断都以调用调度程序结束,下一个进程应该继续运行?

可以概括地说每个中断都必须以调度程序调用结束吗?

nin*_*alj 4

定时器 ISR 不schedule()直接调用。它最终会调用,update_process_times()以便调度程序进程的记帐信息是最新的。

\n\n

返回用户空间时最终会调用调度程序。如果内核是抢占式的,那么从定时器中断返回到内核空间时也会调用它。

\n\n

举个例子,假设进程 A 发出一个系统调用,该系统调用被设备生成的中断中断,然后又被定时器中断中断:

\n\n
\n 进程 A 用户空间 \xe2\x86\x92 进程 A 内核空间 \xe2\x86\x92 设备 ISR \xe2\x86\x92 计时器 ISR\n 系统调用设备 IRQ 计时器 IRQ\n
\n\n

当定时器ISR结束时,它返回到另一个ISR,然后该ISR返回到内核空间,然后内核空间返回到用户空间。抢占式内核会在每次返回时检查是否需要重新调度进程。非抢占式内核仅在返回用户空间时进行该检查。

\n\n

在 ARM 领域,代码路径大致如下:

\n\n
    \n
  • 在用户空间中接收到的 IRQ 将结束调用__irq_usr,而在 SVC 模式中接收到的 IRQ 将结束调用__irq_svc。在其他处理器模式下不应接收 IRQ。
  • \n
  • 在 中__irq_svc,处理完 IRQ 后,如果内核是抢占式的,且未禁用抢占,并且需要重新调度,则内核会跳转到svc_preempt,哪个调用preempt_schedule_irq,哪个调用schedule。否则,不会进行重新安排。
  • \n
  • 最终,CPU 将从 IRQ 处理程序 ( __irq_usr\xe2\x86\x92 ret_to_user_from_irq) 或系统调用 ( vector_swi\xe2\x86\x92 ret_fast_syscall) 返回到用户空间。在那里,内核检查是否有工作要做,如果需要重新安排,schedule则调用。
  • \n
\n