操作系统:上下文切换(Context Switch)

发布于:2025-08-03 ⋅ 阅读:(10) ⋅ 点赞:(0)

目录

什么是 Context Switch(上下文切换)?

🚨 中断(Interrupt)触发上下文切换

这时候就需要“保存上下文”

上下文切换到底在做什么?

1. State Save(保存状态)

2. State Restore(恢复状态)

完整的上下文切换过程

上下文切换的时间与开销


什么是 Context Switch(上下文切换)?

在前面我们讲了:

  • 同一时刻,CPU 只能执行一个进程;

  • 操作系统通过进程调度来决定哪个进程来使用 CPU;

  • 那么从一个进程切换到另一个进程时,原来那个进程怎么办?总不能把它的状态丢了吧?

答案就是:操作系统要把当前进程的运行状态完整地保存起来,以便之后它还能接着运行。这就是“上下文切换”。

更正式的说,上下文切换是指操作系统在进程切换时,保存当前进程的上下文(运行状态),并加载新进程的上下文,让 CPU 从上一个任务“暂停”,切换去执行另一个任务的过程。

这个过程是在“中断”发生时被触发的,我们接下来具体解释这个过程发生的场景和细节。


🚨 中断(Interrupt)触发上下文切换

什么是中断?

在操作系统中,中断是一种机制,用于让系统暂停当前正在执行的任务,去处理某个“更重要”的事件。(详细内容请参考:操作系统:操作系统基础(Basics of OS)-CSDN博客

常见中断的来源包括:

  • 时间片用完(系统定时器中断);

  • I/O完成通知;

  • 更高优先级进程到达;

  • 外设输入(比如键盘、鼠标);

  • 系统调用等。

一旦中断发生,操作系统会立刻中断当前的执行流程,转去执行一个称为 内核例程(kernel routine) 的系统处理程序。

但是这时候,当前正在执行的进程还没运行完,它的状态不能丢。

这时候就需要“保存上下文”

“上下文(Context)”指的是进程运行时的所有状态信息,包括:

  • CPU 中的各个寄存器的值(例如程序计数器 PC、通用寄存器);

  • 内存页信息;

  • 栈指针(SP);

  • 调度相关数据(如优先级、状态等)。

这些信息被保存到该进程的控制块(PCB, Process Control Block)中。PCB 是操作系统用来跟踪和管理进程的重要数据结构,借助PCB,我们可以知道当前的上下文是什么。

这样,当它保存在CPU中时,当我们执行另一个进程并返回,我们就知道从哪里恢复。

具体介绍可以参考:操作系统:进程控制块(Process Control Block,PCB)-CSDN博客


上下文切换到底在做什么?

当一个进程正在运行时,它占据着 CPU,并拥有自己的执行状态。这个“状态”是由一组与当前执行相关的数据组成的,比如:

  • 程序计数器(Program Counter, PC):记录下一条要执行的指令地址;

  • 各种通用寄存器的值;

  • 栈指针(Stack Pointer);

  • 程序状态字(flags,条件码);

  • 内存管理信息(页表指针、段寄存器等);

  • 其他调度信息:进程状态、优先级等。

这些信息构成了进程的“上下文(context)”。如果我们想暂停这个进程,让另一个进程运行,就必须保存这些状态信息,以便下次它还能接着运行

上下文切换的核心动作:状态保存 + 状态恢复

Context Switch = 状态保存(State Save) + 状态恢复(State Restore)

这是操作系统在进程切换过程中执行的两个关键操作:

1. State Save(保存状态)

当一个进程被中断、抢占或主动让出 CPU 时,操作系统会做:

  • 把进程当前使用的所有寄存器的值保存到它的 PCB(Process Control Block)中;

  • 这包括程序计数器、通用寄存器、堆栈指针、程序状态字等等;

  • 有时候还包括内存映射信息(页表指针)等;

  • 保存完后,该进程变为“就绪”或“等待”状态,挂起。

 State Save 是把进程的“运行现场”打包存储起来,以备将来恢复。

2. State Restore(恢复状态)

随后,调度器从 Ready Queue 中选择了另一个进程 P2 来运行:

  • 操作系统从进程 P2 的 PCB 中恢复它上次运行时保存的状态;

  • 把这些寄存器值、栈指针、程序计数器等重新加载进 CPU;

  • 让 CPU 从进程 P2 上次暂停的地方继续执行。

State Restore 就是把另一个进程的“运行现场”重新装回 CPU。

完整的上下文切换过程

1. 保存当前进程(P1)的上下文到其 PCB;

2. 调度器选择另一个进程(P2);

3. 从 P2 的 PCB 中恢复它的上下文;

4. CPU 继续执行 P2,从上次暂停的地方继续。

这个过程看起来简单,但系统实际上要做很多细致的底层操作。


上下文切换的时间与开销

你可能会想:“切换一下而已,有什么大不了的?”——实际上,上下文切换是一种“纯开销”(pure overhead)

为什么说它是开销?

因为在上下文切换过程中,CPU 不在为用户进程执行任何实际的“有用任务”,只是做了一堆系统内部的准备和转移工作。

  • 没有程序逻辑在执行;

  • 没有数据被处理;

  • 只是把寄存器、内存映射等搬来搬去。

上下文切换的耗时取决于:

  • 需要保存/恢复的寄存器数量:有的CPU架构寄存器更多,切换开销更大;

  • 内存速度:PCB通常保存在主存中,访问速度影响切换效率;

  • 是否有特殊硬件指令支持:有些CPU架构提供“一条指令加载/存储所有寄存器”,可以显著加快;

  • 内核实现优化程度:某些系统对上下文切换路径进行了精简和缓存优化。

⏱️ 典型的上下文切换时间:

  • 在大多数通用系统中,上下文切换时间是 几微秒到几毫秒不等;

  • 越是实时性要求高的系统(比如嵌入式、航空控制),越追求上下文切换的极限最小化。

项目 内容
上下文切换 CPU 从一个进程切换到另一个进程的过程
发生时机 中断、抢占、等待资源、时间片到期等
操作内容 保存当前进程状态(State Save),恢复新进程状态(State Restore)
保存位置 PCB(Process Control Block)
是否有开销 是的,且是纯粹的 CPU 消耗,没有直接为用户程序做事情
时间消耗 几微秒到几毫秒,视系统结构和硬件支持而定