CPU、进程、线程上下文切换
参考: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调度的基本单位,进程是资源分配的基本单位。
- 当两个线程不属于同一个进程,则切换的过程就跟进程上下文切换一样;
- 当两个线程属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据;