https://zhuanlan.zhihu.com/p/1248579228
吐血整理 | 肝翻 Linux 进程调度所有知识点
执行调度
Kernel 判断当前进程标记是否为 TIF_NEED_RESCHED,是的话调用 schedule 函数,执行调度,切换上下文,这也是上面抢占(preempt)机制的本质。那么在哪些情况下会执行 schedule 呢?
-
用户态抢占
ret_to_user 是异常触发,系统调用,中断处理完成后都会调用的函数。
el0_sync 是 ARM 架构中处理来自 EL0(用户模式)同步异常的入口点。同步异常是指那些在执行特定指令时立即触发的异常,而不是由外部事件(如中断)引起的异常。同步异常的例子包括软件中断(SWI/SVC)、未定义指令、预取中止和数据中止等。
-
内核态抢占
el1_irq
是 ARMv8-A 架构中处理来自 EL1(内核模式)的中断(IRQ)的异常处理入口
可以看出无论是用户态抢占,还是内核态抢占,最终都会调用 schedule 函数来执行真正的调度: