定义
上下文(Context):上下文指的是CPU各个寄存器(register)的内容及程序计数器(PC)在此时记录的内容
寄存器是CPU内部,容量非常小的高速存储设备,不同于RAM是在CPU外部,RAM读写速度比寄存器慢得多,寄存器容量又非常小,一般只用来存储一些程序中使用频率较高的数据,以加速程序的执行。
程序计数器则是一个专用的寄存器,它仅用于存储CPU正在执行的指令的地址或CPU下一条将要执行的指令的地址,具体是哪种情况要看特定的系统。
上下文切换(Context Switch):上下文切换指的是CPU从一个进程(线程)切换到另一个进程(线程)
进程是正在执行的一个程序的实例,在Linux中,线程可以算作轻量级进程,线程可以并发执行,并且同一进程创建的线程可以共享同一片地址空间及其它资源,即该进程的进程地址空间及属于该进程的其它资源。
多线程时,会引起上下文切换,带来CPU的损耗
- 直接消耗包括: CPU寄存器需要保存和加载, 系统调度器的代码需要执行, TLB实例需要重新加载, CPU 的pipeline需要刷掉;
- 间接消耗指的是多核的cache之间得共享数据, 间接消耗对于程序的影响要看线程工作区操作数据的大小)
上下文切换所做的工作
- 暂停当前进程执行流程,将各个寄存器内容存到内存中;
- 从内存中取出下一个将要执行的进程的上下文,存进各个寄存器中;
- 返回程序计数器记录的指令地址,用于恢复进程执行。
上下文切换的代价
上下文切换一般是计算密集型的。它需要大量的处理器时间,也可以说是时钟周期,时钟周期一般单位以毫微秒计算,但在1秒时间内,上下文切换大概能执行上千次或者更多一点,毫微秒是10的-9次方秒,而对于单次上下文切换,其所用时间也不过10的-3到-4次方秒,通过其间间隔的数量级就可以了解到上下文切换的代价在操作系统中绝对算是一个可以显著发觉的巨大消耗。
即便现代计算机正在逐渐降低上下文切换所占用的CPU时间,但那也仅是在CPU时钟周期降低,处理速度加快的情况下,而不是提升了上下文切换的效率。
如何减少上下文切换
- 无锁并发
- CAS
- 减少线程
- 协程