终于有人把CPU上下文切换说清楚了

终于有人把CPU上下文切换说清楚了

 

前言


多个进程竞争CPU就是一经常被我们忽视的问题。

进程CPU的时候并没有真正运行,为什么还会导统的负载升高呢?你应该已经猜到了,CPU上下文切换就是罪魁祸首。

我们都知道,Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行。当然, 这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将CPU轮流分配给它们,造成多任务同时运行的错觉。

而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU 寄存器和程序计数器

 

指令寄存器和程序计数器


电脑执行程序的过程就是cpu不断执行指令的过程。cpu执行指令的过程,第一步就是取指令,并将其放入指令寄存器,然后对指令译码,进行一些操作,最后计算下条指令的地址,并送入程序计数器。总之,一个用来存当前指令,一个用来存下条指令的地址。cpu根据程序计数器里的地址取指令,将取到的指令送指令寄存器。

CPU 寄存器和程序计数器就是 CPU 上下文因为它们都是 CPU 在运行任何任务前,必须的依赖环境。

    CPU 寄存器是 CPU 内置的容量小、但速度极快的内存。
    程序计数器则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置

终于有人把CPU上下文切换说清楚了

 

 

CPU上下文切换


知道了什么是CPU上下文,我想你也很容易理解CPU上下文切换。CPU上下文切换,就是先把前一个任务的CPU上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务 的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样 就能保证任务原来的状态不受影响,让任务看起来还是连续运行。

 

 

CPU 上下文切换的类型


我猜肯定会有人说,CPU上下文切换无非就是更新了 CPU寄存器的值嘛,但这些寄存器,本身就是为了快速运行任务而设计的,为什么会影响系统的CPU性能呢?

在回答这个问题前,不知道你有没有想过,操作系统管理的这些任务到底是什么呢?

也许你会说,任务就是进程,或者说任务就是线程。是的,进程和线程正是最常见的任务。但是除此之外,还有没有其他的任务呢?

不要忘了,硬件通过触发信号,会导致中断处理程序的调用,也是一种常见的任务。

所以,根据任务的不同,CPU的上下文切换就可以分为几个不同的场景,也就是进程上下文切换,线程上下文切换以及中断上下文切换。