验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

什么是线程上下文切换

阅读:768 来源:乙速云 作者:代码code

什么是线程上下文切换

线程上下文切换(Thread Context Switch) 是指:
CPU 从一个线程切换到另一个线程执行时,需要保存当前线程的状态,并恢复下一个线程的状态的过程。


一、为什么需要上下文切换?

CPU 核心在同一时刻只能执行一个线程。
为了让多个线程“同时”运行(尤其是单核或多核但线程数多于 CPU 核数时),操作系统需要:

  • 让线程轮流使用 CPU
  • 在切换时保存和恢复线程的执行状态

这就是上下文切换存在的根本原因。


二、什么是“上下文”?

线程上下文主要包括:

1. CPU 寄存器

  • 程序计数器(PC):下一条要执行的指令地址
  • 栈指针(SP)
  • 通用寄存器(如 eaxebx 等)

2. 线程私有信息

  • 线程栈(局部变量、函数调用栈)
  • 线程状态(运行 / 就绪 / 阻塞)

3. 可能还包括

  • 内存管理信息(如页表,线程共享进程地址空间时通常不变)
  • 浮点寄存器、SIMD 寄存器等(视架构而定)

三、上下文切换的过程(简化版)

假设从 线程 A 切换到线程 B

  1. 保存线程 A 的上下文
    • 把 A 的寄存器、程序计数器等保存到 A 的 PCB / TCB 中
  2. 调度器选择线程 B
    • 根据调度算法(时间片、优先级等)
  3. 恢复线程 B 的上下文
    • 从 B 的 TCB 中加载寄存器、PC 等
  4. 跳转到 B 上次执行的位置继续执行

对线程来说,切换是“无感知”的,只是看起来被暂停了一会儿。


四、线程上下文切换 vs 进程上下文切换

对比项 线程切换 进程切换
地址空间 不变(同一进程) 切换页表、内存映射
开销 较小 较大
切换内容 寄存器等 寄存器 + 内存管理信息
是否涉及内核 通常要 必须

线程切换比进程切换轻量得多,这也是多线程的优势之一。


五、哪些情况会触发线程上下文切换?

  • 时间片用完(抢占式调度)
  • 线程主动阻塞(如 sleepwaitI/O
  • 更高优先级线程就绪
  • 线程结束
  • 中断发生(如系统调用)

六、上下文切换的开销

开销来源

  • 保存 / 恢复寄存器
  • 内核态与用户态切换
  • 缓存失效(TLB、CPU cache)
  • 调度器计算

影响

  • 频繁切换 → CPU 有效利用率下降
  • 高并发系统中,上下文切换是性能瓶颈之一

七、如何减少不必要的上下文切换?

  • 减少线程数量(避免线程爆炸)
  • 使用线程池
  • 减少锁竞争
  • 使用异步 / 非阻塞模型(如 epoll、协程)
  • 合理设置线程优先级

八、一句话总结

线程上下文切换就是:CPU 在切换线程时,保存旧线程状态、恢复新线程状态的过程,是多线程并发的基础,但也会带来性能开销。

如果你愿意,我也可以:

  • Java / Linux / OS 内核视角 再讲一遍
  • 或结合 volatile、synchronized、协程 讲切换差异
分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>