参考:5.1 进程、线程基础知识 | 小林 coding | Java 面试学习
程序计数器
存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。
CPU 寄存器
位于CPU 核心内部存储单元,用于暂存指令、数据、地址等信息。
CPU 缓存
位于 CPU 和和主内存之间的存储单元,在 CPU 内部,有 L1、L2、L3 三级缓存,L1 容量最小,速度最快,通常集成在 CPU 核心内部,L2、L3 次之。
CPU 上下文切换
任务交给 CPU 运行,那么 CPU 需要知道任务从哪里加载、从哪里开始运行,所以操作系统需要事先帮 CPU 设置好 CPU 寄存器、程序计数器。
CPU 上下文切换就是把前一个任务的上下文保存到寄存器和计数器,然后加载新的任务。这就包含了进程、线程、中断。
进程上下文切换
进程是由内核管理和调度的,所以进程的切换只能发生在内核态。

进程上下文切换场景
- 当某个进程的时间片耗尽,进程就从运行状态变为就绪状态,系统从就绪队列选择另外一个进程运行;
- 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候当前进程会被挂起,并由系统调度其他进程运行;
- 当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度;
- 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行;
- 发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序;
线程上下文切换
同一个进程内有多个线程,有共享内存和全局变量等资源,每个线程也有自己的寄存器和栈存放私有数据,各个线程可以并发执行。线程是 CPU 调度的基本单位,进程是资源分配的基本单位。
- 当两个线程不属于同一个进程,则切换的过程就跟进程上下文切换一样;
- 当两个线程属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据;
