名词

CPU 上下文

指 CPU 寄存器和程序计数器 PC,是 CPU 执行命令的依赖环境

CPU 上下文切换

将前一个任务的 CPU 上下文保存起来,然后加载别的任务的上下文并执行

系统调用

  1. 先保存 CPU 寄存器里原来用户态指定位置
  2. 更新 CPU 寄存器为需要执行的内核态代码
  3. 跳转到内核态运行内核任务
  4. 调用结束后 CPU 寄存器恢复原来保存的用户态
  5. 切换回用户空间继续运行进程

要点

  • 一次系统调用,发生了两次 CPU 上下文的切换,从用户态到内核态一次,从内核态回到用户态一次
  • 但因为系统调用时发生在同一个进程中的,所以通常称为特权模式切换

进程上下文切换

  1. 进程的切换只能发生在内核态
  2. 进程的上下文包括了虚拟内存、栈、全局变量等用户控件资源,同时还有内核堆栈、寄存器等内核空间资源

进程上下文切换的场景

  1. 当前进程 CPU 时间片耗尽
  2. 当前进程所需系统资源不足
  3. 当前进程主动挂起(睡眠等)
  4. 优先级更高的插入
  5. 硬件中断

线程上下文切换

不同进程之间线程上下文切换

与切换进程相同

同进程之间线程上下文切换

因为属于同一个进程,虚拟内存和全局变量等一些资源是共享的,所以不需要保存。
但是需要切换线程的私有数据、寄存器等不共享的数据。
相比于进程切换,就要好了很多,这也就是多线程的一个优势。

中断上下文切换

  • 中断上下文切换不涉及用户态
  • 中断的上下文切换只需要保存内核态锁必须的状态,而用户态是不用保存的
  • 中断处理会打断进程的正常调度和执行
  • 对于一个 CPU 来说,中断处理比进程拥有更高的优先级
  • 中断发生过多也会耗费大量 CPU

总结

  • CPU 上下文切换频繁,会导致把时间耗费在保存上下文和恢复上下文这里,从而真正执行命令的时间就少了

小记

  • 一次系统调用的过程,其实是发生了两次 CPU 上下文切换

问题

  1. 触发进程切换的条件是什么?
  2. Linux 如何管理虚拟内存?