1. cpu 上下文切换

cpu 通过通用寄存器和 pc 程序计数器来控制 task 从哪里运行
cpu 的上下文切换需要先把前一个 task 的寄存器的值保存下来, 再把下一个 task 的寄存器值加载进来
常见的 cpu 上下文切换就是系统调用, 系统调用是在同一个进程内实现的, 会从用户态陷入内核态, 用户态的资源并不会改变

2. 进程上下文切换

进程由内核管理调度, 所以进程的上下文切换只能在内核态实现
进程上下文切换, 需要保存用户态的虚拟内存, 堆栈, 全局变量, 内核态的堆栈, 寄存器等数据

进程的调度时机

  1. 时间片用完
  2. 等待资源挂起
  3. sleep 挂起
  4. 有优先级更高的进程
  5. 硬件中断

3. 线程上下文切换

Linux 内核调度的时候不分进程线程, 其调度的是一个 task 实体
对内核来讲线程和进程区别就是会共享一些资源入虚拟内存和全局变量
所以同一个进程下的线程切换时虚拟内存和全局变量是不用切换的, 只需要切换堆栈, 寄存器
不同进程下的线程切换跟进程切换一样