操作系统在进行线程切换时需要进行哪些动作

操作系统在进行**线程切换(thread context switch)**时,需要保存当前线程的上下文,并恢复目标线程的上下文。这是操作系统调度器的一部分,涉及用户态与内核态之间的协作。


一、线程切换的本质

线程切换 = 上下文切换(Context Switch)的一种

包括:

  • 当前线程上下文保存(寄存器、程序计数器等)
  • 调度器选择下一个线程
  • 恢复目标线程的上下文并运行

二、线程切换与进程切换的区别

项目线程切换进程切换
地址空间相同(共享)发生变化(重新切换内存映射)
开销较小较大(切换页表等)
CPU 寄存器要保存要保存
调度器参与
常见场景多线程协作多进程并发

三、线程切换时系统做了什么(关键步骤)

  1. 触发线程切换(中断/系统调用/调度)

    • 常见触发场景:

      • 时间片用尽
      • 主动让出(pthread_yield / sleep)
      • 阻塞(I/O、锁)
      • 高优先级线程唤醒
  2. 陷入内核态

    • 中断或系统调用进入内核态
    • CPU 执行内核代码:线程调度器(Scheduler)
  3. 保存当前线程上下文

    • CPU 寄存器(PC、SP、通用寄存器)
    • 栈指针(线程私有)
    • 调度器把这些状态保存到 TCB(Thread Control Block)
  4. 更新线程状态

    • 当前线程标记为 READY / BLOCKED 等
    • 目标线程标记为 RUNNING
  5. 选择下一个要运行的线程

    • 调度策略(如时间片轮转、优先级调度、CFS)
    • 找到最合适的线程
  6. 加载目标线程上下文

    • 从 TCB 中恢复寄存器、PC、栈等状态
  7. 返回用户态执行新线程

    • CPU 跳转到新线程的下一条指令

四、涉及的关键结构

结构体/概念说明
PCB/TCB进程控制块 / 线程控制块:保存上下文、状态等信息
CPU 寄存器包括 PC、SP、通用寄存器
内核栈每个线程有独立的内核栈
调度器(Scheduler)内核模块,用于选择哪个线程运行

五、可视化图解

[当前线程]
  ↓ 触发切换(时间片用尽)
  ↓ 保存上下文(寄存器 → TCB)
  ↓ 调度器选择下一个线程
  ↓ 恢复新线程上下文(TCB → 寄存器)
  ↓ CPU 开始执行新线程

六、性能开销

操作说明
用户态线程切换开销较小(如协程)
内核态线程切换需陷入内核,性能开销大
进程切换额外切换内存空间,开销更大

七、举例说明(Linux)

在 Linux 中,schedule() 是核心线程调度函数。

切换线程过程大致如下:

void context_switch(struct task_struct *prev, struct task_struct *next) {
    // 保存 prev 的 CPU 上下文
    switch_to(prev, next);
    // 恢复 next 的上下文并运行
}

Linux 使用 task_struct 作为进程/线程控制块。


八、相关命令与工具

  • top, htop:查看线程状态
  • perfstrace:分析切换频率与延迟
  • vmstat:查看上下文切换速率(字段 cs

九、总结表

步骤操作内容
1. 触发切换中断、系统调用、主动让出、阻塞
2. 保存上下文保存寄存器、程序计数器、栈指针等
3. 调度线程根据策略选中下一个线程
4. 恢复上下文从 TCB 恢复 CPU 状态
5. 切换完成CPU 执行新线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值