名词
CPU 上下文
指 CPU 寄存器和程序计数器 PC,是 CPU 执行命令的依赖环境
CPU 上下文切换
将前一个任务的 CPU 上下文保存起来,然后加载别的任务的上下文并执行
系统调用
- 先保存 CPU 寄存器里原来用户态指定位置
- 更新 CPU 寄存器为需要执行的内核态代码
- 跳转到内核态运行内核任务
- 调用结束后 CPU 寄存器恢复原来保存的用户态
- 切换回用户空间继续运行进程
要点
- 一次系统调用,发生了两次 CPU 上下文的切换,从用户态到内核态一次,从内核态回到用户态一次
- 但因为系统调用时发生在同一个进程中的,所以通常称为特权模式切换
进程上下文切换
- 进程的切换只能发生在内核态
- 进程的上下文包括了虚拟内存、栈、全局变量等用户控件资源,同时还有内核堆栈、寄存器等内核空间资源
进程上下文切换的场景
- 当前进程 CPU 时间片耗尽
- 当前进程所需系统资源不足
- 当前进程主动挂起(睡眠等)
- 优先级更高的插入
- 硬件中断
线程上下文切换
不同进程之间线程上下文切换
同进程之间线程上下文切换
因为属于同一个进程,虚拟内存和全局变量等一些资源是共享的,所以不需要保存。
但是需要切换线程的私有数据、寄存器等不共享的数据。
相比于进程切换,就要好了很多,这也就是多线程的一个优势。
中断上下文切换
- 中断上下文切换不涉及用户态
- 中断的上下文切换只需要保存内核态锁必须的状态,而用户态是不用保存的
- 中断处理会打断进程的正常调度和执行
- 对于一个 CPU 来说,中断处理比进程拥有更高的优先级
- 中断发生过多也会耗费大量 CPU
总结
- CPU 上下文切换频繁,会导致把时间耗费在保存上下文和恢复上下文这里,从而真正执行命令的时间就少了
小记
- 一次系统调用的过程,其实是发生了两次 CPU 上下文切换
问题
- 触发进程切换的条件是什么?
- Linux 如何管理虚拟内存?