0%

进程的上下文切换

各进程之间是共享CPU资源的,CPU需要在不同的时候执行不同的进程,一个正在执行的进程切换到另一个进程执行的过程被称为进程的上下文切换。

CPU的上下文切换

在每个任务(进程、线程、中断)被CPU执行前,CPU需要知道任务从哪里加载,又从哪个阶段执行;所以操作系统会设置CPU的寄存器(例如写入执行数据的地址)和程序计数器(写入即将执行的指令的的地址),寄存器值和程序计数器的值为CPU必须依赖的环境,即CPU的上下文。

CPU上下文切换即为操作系统将当前任务的寄存器值和程序计数器的值保存起来,然后将CPU执行新任务所需的寄存器值和程序计数器的值写入,由CPU来执行新任务;当CPU需要继续执行此前的任务时,操作系统就将此前已保存的寄存器值和程序计数器的值写入,CPU则会继续执行此前的任务。

根据执行的任务的不同,CPU的上下文切换可分为进程的上下文切换、线程的上下文切换、中断的上下文切换。

当需要切换进程上下文时,操作系统会将当前的CPU上下文保存到当前进程的PCB(进程控制块),然后把另一个进程的PCB中的CPU上下文写入,CPU则会继续执行另一个进程。

发生进程上下文切换的场景

为保证所有任务都能得到相对公平的调度(一个CPU逻辑核心同一时刻内只能执行一个任务),操作系统将CPU时间划分为多个片段,当一个任务完成一个时间片段的执行后,CPU将被切换到执行另一个任务,每个任务快速轮流执行(因为时间片段足够短且CPU逻辑核心执行效率足够高,使人感觉多个任务是在同时执行)。

  • 当某个进程的时间片段耗尽,该进程被操作系统挂起,CPU被切换到执行其他进程;
  • 当前进程所需资源过多(例如内存不足)时,操作系统会将当前进程挂起,CPU被切换到执行资源消耗较少的进程,直至资源充足且完成一个时间片段的执行,再切换回来继续执行;
  • 当进程申请主动挂起且被操作系统允许时,操作系统也会重新调度资源,切换上下文;
  • 低优先级的进程被高优先级的进程打断;
  • 发生硬件中断。

参考资料:

进程与线程