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

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

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

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

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

答案1

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

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

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

   进程A用户空间→进程A内核空间→设备ISR→定时器ISR
                    系统调用 设备 IRQ 定时器 IRQ

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

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

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

相关内容