Linux性能学习(1.3):CPU_CPU上下文切换


参考资料:
1.
https://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html

1 简介

在Linux下,如果我们使用ps指令可以看到有很多进程在同时运行,但是实际上并不是同一时刻运行的,单核CPU在某一时刻只会运行一个任务,而系统则会通过调度算法(时间片轮转、中断优先、高优先级优先等算法)将不同的任务给到CPU运行,从而造成可以同时执行很多进程的假象。

在系统将某一个任务给到CPU运行时候,CPU则需要将当前正在执行的指令进行存储,以便下次执行这个任务,以及需要知道下一个任务的指令的位置,以便加载进来运行,而程序计数器则是用于存放指令所在地址的地方;寄存器是加载速度比缓存更快的内存,用于存储CPU需要的参与运算的数据和运算结果;上面的程序计数器和寄存器组合起来就是一个任务的上下文,即CPU的上下文。
PS:程序计数器也是属于CPU寄存器中的一类。

上下文切换则是指CPU在运行新任务前,将当前任务的数据以及指令等信息保存起来,即这个任务的上下文保存起来到系统内核中,然后加载新任务的上下文数据到程序计数器和寄存器中,然后跳转到程序计数器指定的新位置,开始运行任务。

CPU保存旧任务的上下文,以及加载新任务的上下文,即上下文切换是需要时间的,所以频繁的上下文切换也会导致CPU耗费时间在数据保存以及数据读取上。

根据任务的不同,上下文切换分为进程上下文切换、线程上下文切换以及中断上下文切换。

2 进程上下文切换

在以下场景中,会触发进程上下文切换:
进程正常执行完毕;
进程分配的CPU时间片使用完了,需要调度另外的任务;
使用sleep等休眠函数,则会被挂起;
系统资源不足时,进程被挂起,要等待系统资源满足,进程则再次运行;
高优先级的进程需要运行;
硬件中断发送,优先级最高,需要运行。

3 线程上下文切换

线程是系统调度的基本单位,进程是资源拥有的基本单位,为线程提供虚拟内存,全局变量等资源。

如果一个进程只有一个线程,那么这个进程就相当于线程;如果一个进程有多个线程,那么这些线程就会共享这个进程的虚拟内存、全局变量等资源,这些资源因为是共享的,如果发生进程内的线程切换,则不会切换这些资源,但是线程也会有自己一些数据,发生进程内的线程切换,这些数据是需要保存和切换的。

因此,如果发生切换的线程如果属于不同的进程,则上下文切换相当于进程的上下文切换;如果发生切换的线程如果属于相同的进程,共享资源不切换,值切换线程独有的数据。

4 中断上下文切换

硬件中断的优先级高于普通进程的优先级,因此当硬件中断发生,CPU会优先执行中断事件,从而发生中断上下文切换。

中断上下文切换不涉及到进程的用户态,因此不需要保存和恢复用户态资源(虚拟内存、全局变量等资源),而是涉及到内核态。因此性能消耗上会比进程上下文切换低。

猜你喜欢

转载自blog.csdn.net/u011003120/article/details/128284803