【程序员必备小知识-性能基础10】Cpu的上下文切换

238 阅读2分钟

引言

学习和写作一样,都是无心插柳柳成荫,一开始很困难,但慢慢的,你会觉得这件事情很容易,写作就是一个将学习到的知识重新编排整理的过程,学习也是一样,我记得我在面试中老被问到上下文的切换,就想弄明白到底怎么回事?有了点cpu的基础,这件事情也叫有可能了,今天带大家了解一下cpu的上下文切换,以及切换过程会遇到什么问题。

Program Counter

我在Linux操作系统三十年的发展特点及未来一文中提到:Linux的中期就支持了多任务,多进程的操作,那进程和进程之间肯定不是cpu同时在运行的,由于cpu执行的速度非常快,它在执行一个进程一段时间后,就马上切换到下一个待执行的进程,切换的时候要知道当前进程的执行位置,以便在下次切换回知道在哪继续执行,那这个事情谁来做呢?就是cpu的上下文即CPU 寄存器和程序计数器

关于CPU 寄存器和程序计数器我在计算机体系结构中提到,就不多提了。

那cpu的上下文切换也很好理解了,就是把还没做完的任务先保存起来,然后程序计数器指向新的位置,把新的任务加载进来继续运行,这样下次调度到这个任务的时候就可以把原来的进度取出来继续执行。

频繁切换会遇到的问题

cpu的上下文设计当然是让cpu用来快速执行任务的,所以可以切换,但是要注意切换本身也是需要消耗时间的,每次上下文切换都需要几十纳秒到数微秒的 CPU 时间,但是如果切换太频繁,也会占据cpu大量的时间,导致大量进程等待,进而触发Cpu的负载过高的情况。

而且我们知道Linux是靠虚拟内存管理硬件内存的,切换上下文,也要刷新内存,就会导致内存访问变慢,但如果是多处理器运行的情况,刷新缓存不仅意味着影响当前进程,而且还影响共享这块内存的其它进程。