CPU上下文
多核CPU在运行任务时,使用程序计数器来存储当前执行指令的位置或者下一条将要执行的指令的位置,而CPU寄存器则是CPU中的内存。它们都是CPU在运行时必须依赖的环境,因此也被称作为CPU上下文
CPU上下文切换
CPU上下文切换就是把前一个任务的上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文开始执行。
而保存起来的上下文,会存储在系统内核中,并在任务重新执行时再次加载进来。
根据CPU执行的任务的不同,上下文切换分为这三种: 进程上下文切换、线程上下文切换,中断上下文切换
进程上下文切换
每次进程的上下文切换将会花费几十纳秒到数微秒的时间,过多的进程上下文切换就是我们上篇文章提到过系统负载过高的原因之一
以下这些场景都会引起进程的上下文切换:
- 我们知道在多核CPU中,为了公平调度,CPU的时间是分为一段段的时间片然后分配给各个进程的,当某个进程的时间片用完之后,就会被系统挂起,从而让CPU切换到其他进程
- 当存在更高优先级的进程时,为了保证高优先级进程的时间片更高,这个进程也有可能被挂起
- 当这个进程需要的资源不足以维持运行时,该进程也会被挂起以等待足够的资源
- 进程内部可以使用sleep等函数主动将自己挂起
- 当多个进程竞争临界资源发生死锁时
- 发生硬件中断时
线程上下文切换
我们知道,相较于进程,线程才是CPU调度的最小单位,而一个进程内可能包含多个线程,这些线程共享这个进程的内存、CPU时间段等资源
所以普通的线程上下文切换就不需要切换整个进程的资源而只需要切换线程的线程栈和寄存器等,这也是多线程应用相较于多进程应用的优势所在
中断上下文切换
中断上下文切换是为了响应硬件的各种事件设计出来的,中断程序会打断进程的正常执行。例如,当前CPU正在全力执行一些程序,这个时候我们挪了挪鼠标,按了下键盘。CPU就必须中断正在执行的程序,转而去响应这些硬件的事件。