经常说的CPU上下文切换是什么意思?(上)
学习倪鹏飞老师linux性能优化实践的笔记,文中大量内容来源于老师的文档材料,如果喜欢请移步文末截图中的二维码支持老师的课程:
有时候看系统的资源利用率,我们会发现,cpu的use值不搞但sys值特别高,同时负载也会比较高,这时我们就会比较疑惑,我程序明明用的cpu很少啊,为什么负载特别高?嗯 原因就是上下文切换了。
我们都知道,Linux是一个多任务的操作系统,它支持远大于CPU数量的任务同时运行,当然,这些任务实际上并不是真正的在同时运行,而是应为系统在很短的时间内,将CPU轮流分配给他们,造成很多任务同时运行的错觉。
在每个任务运行前,CPU都需要知道任务从哪里加载,又是从哪里开始运行,也就是说,需要系统事先帮他设置好CPU寄存器和程序计数器(Program Counter,PC)
CPU寄存器,是CPU内置的容量小、但速度极快的内存。程序计数器,则是用来存储CPU正在执行的指令的位置,或者即将执行的下一条指令的位置。他们都是CPU在运行任何任务前,必须依赖的环境,因此也被叫做CPU上下文。
知道了什么事CPU上下文,我想你也很容易理解CPU上下文切换
。CPU上下文切换,就是先把前一个任务的CPU上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文,到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
而保存下来的上下文,会存储在系统内核中,并在任务重新调度执行的时候再加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。
我猜肯定会有人说,CPU上下文切换无非就是更新了CPU寄存器的值嘛,但这些寄存器,本身就是为了快速运行任务而设计的,为什么会影响系统的CPU性能呢?
在回答这个问题前,不知道你有没有想过,操作系统管理的这些"任务"到底是什么呢?
也许你会说,任务就是进程,或者说任务就是线程,是的进程和线程是最常见的任务,但是除此之外ÿ