1、上下文切换:
从一个可执行的进程切换到下一个可执行进程过程中需要做的事情由context_switch函数完成,具体的实现如下:
①调用switch_mm函数,将虚拟地址从上一个进程映射到新的进程中去;
②调用switch_to函数,从上一个进程的处理器状态切换到新进程的处理器状态。这包括保存、恢复栈信息和寄存器信息,还有其他的与体系相关的的状态信息,以每一个进程为对象进行信息的管理和保存。
need_resched标志:内核虽然有了调度的实现函数schdule,但是需要知道在什么时间调用。而这个函数的调度被一个标志控制:need_resched。当一个进程应该被抢占时、当有优先级更高的进程进入可执行状态时,schduler_tick函数就会设置这个标志。这个标志对内核来说表示有其他的进程应当被运行,要尽快调度程序。
2、用户抢占:
内核即将返回用户空间时候,如果need_resched标志被设置,会导致schdule函数被调用,就会发生用户抢占,在从内核返回用户空间的时候不仅可以继续执行当前进程,也可以选择一个新的进程执行。所以用户抢占在一下情况产生:①从系统调用返回用户空间;②从中断处理程序返回用户空间。
3、内核抢占
内核抢占会发生在:①中断处理程序正在执行,且返回内核空间之前;②内核代码再一次具有可抢占性是;③如果内核中的任务显示调用schdule函数时。如果内核中的任务阻塞(同样会调用schdule函数)