Linux 抢占和上下文切换

4.6

上下文切换,也就是从一个可执行进程切换到另一个可执行的进程,由定义在/kernel.sched.c中的context_switch()函数负责处理。每当一个新的进程被选出来准备投入运行时,schedule()就会调用该函数。

context_switch()主要完成两项工作:

1)调用声明在<asm/mmu_context.h>中的switch_mm(),该函数负责把虚拟内存从上一个进程映射切换到新进程中。

2)调用声明在<asm/system.h>中的switch_to(),该函数负责从上一个进程的处理器状态切换到新进程的处理器状态。这包括保存、恢复栈信息和寄存器信息,还有其它任何与体系结构相关的状态信息,都必须以每个进程为对象进行管理和保存。

内核必须知道在什么时候调用schedule()。内核提供了一个need_resched标志来表明是否需要重新调度一次。当某个进程应该被抢占时,schedule_tick()就会设置这个标志;当一个优先级高的进程进入可执行状态时,try_to_wake_up()也会设置这个标志。内核检查该标志是否被设置,设置了则调用schedule进行调度。

用户抢占:

从系统调用返回用户空间时;

从中断处理程序返回用户空间时。

内核抢占:

中断处理程序正在执行,且返回内核空间之前;

内核代码再一次具有可抢占性的时候;

如果内核中的任务显示地调用schedule();

如果内核中的任务阻塞(这同样也会导致调用schedule())。

原文地址:https://www.cnblogs.com/cjj-ggboy/p/12618002.html