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