![时间中断之后是否总是会调用调度程序?](https://linux22.com/image/33917/%E6%97%B6%E9%97%B4%E4%B8%AD%E6%96%AD%E4%B9%8B%E5%90%8E%E6%98%AF%E5%90%A6%E6%80%BB%E6%98%AF%E4%BC%9A%E8%B0%83%E7%94%A8%E8%B0%83%E5%BA%A6%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
当定时器中断发生时,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_usr
→ret_to_user_from_irq
) 或系统调用 (vector_swi
→ret_fast_syscall
) 返回到用户空间。在那里,内核检查是否有工作要做,如果需要重新安排,则schedule
调用。