当前位置: 首页 > news >正文

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

目录

什么是 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 消耗,没有直接为用户程序做事情
时间消耗几微秒到几毫秒,视系统结构和硬件支持而定
http://www.dtcms.com/a/308312.html

相关文章:

  • Effective C++ 条款13:以对象管理资源
  • LLC电源原边MOS管DS增加RC吸收对ZVS的影响分析
  • Linux和shell
  • 保姆级别IDEA关联数据库方式、在IDEA中进行数据库的可视化操作(包含图解过程)
  • ceph sc 设置文件系统格式化参数
  • 前端ESLint扩展的用法详解
  • 【实时Linux实战系列】实时图像处理应用开发
  • 【PHP类的基础概念:从零开始学面向对象】
  • Elasticsearch DSL 核心语法大全:match、bool、range、聚合查询实战解析
  • 使用神经网络与5折交叉验证进行基因组预测:基础知识指南
  • Java【代码 21】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
  • 智谱 AI 重磅发布 GLM-4.5:开源 SOTA,专为下一代智能体应用打造
  • 微服务架构技巧篇——接口类设计技巧
  • review|
  • Day15--二叉树--222. 完全二叉树的节点个数,110. 平衡二叉树,257. 二叉树的所有路径,404. 左叶子之和
  • 企业级部署 (基于tomcat与nginx)
  • 新书速览|R语言数据分析从入门到实践
  • Linux大页内存导致服务内存不足
  • Docker部署的PostgreSQL慢查询日志配置指南
  • 当文档包含图文混排表格时,如何结合大模型(如DeepSeek-VL)和OCR提取数据
  • 468. 验证IP地址
  • Ps2025
  • Python字典完全指南:从基础到实战(2025版)
  • 03 基于sklearn的机械学习-线性回归、损失函数及其推导
  • 大数据之Hive
  • MPU6050模块
  • 排序算法-选择排序(选择排序、堆排序)(动图演示)
  • 数据库Day04
  • 探索 Vue 3.6 新特性:Vapor Mode 与高性能 Web 应用开发
  • 【计算机网络】IP地址、子网掩码、网关、DNS、IPV6是什么含义?计算机中如何设置子网掩码与网关?