要理解CPU上下文切换,我们先来看看这个问题。
Linux是一个多任务操作系统,但是为什么它支持超过CPU数量的任务同时运行呢?
其实很简单。这些任务并不是真的同时运行,而是因为系统在短时间内将CPU依次分配给它们,所以大家可能会误以为多任务同时运行。
欢迎关注作者,优质文章在这里等你。
上下文切换原理
CPU上下文切换(有时称为进程切换或任务切换)意味着CPU从一个进程或线程切换到另一个进程或线程。上下文是指在某个时间点上,CPU寄存器和程序计数器的内容。
寄存器是CPU内部的少量快速内存(对应CPU外部相对较慢的RAM主存)。寄存器可以通过快速访问公共值(通常是运算的中间值)来提高计算机程序的运行速度。程序计数器是一个特殊的寄存器,用来指示CPU在指令序列中的执行位置。存储的值是正在执行的指令或下一条要执行的指令的位置,具体取决于具体的系统。
CPU上下文切换是指保存前一个任务(CPU寄存器和程序计数器)的CPU上下文,将新任务的上下文加载到这些寄存器和程序计数器中,最后跳转到程序计数器指示的新位置运行新任务。
这些保存的上下文存储在系统内核中,并在重新调度和执行任务时再次加载。这样可以保证任务的原始状态不受影响,任务给大家的感觉就是还在持续运行。
上下文切换只能在内核模式下发生。内核模式是CPU的特权模式,只有内核运行,可以访问所有内存和其他系统资源。其他程序,如应用程序,最初以用户模式运行,但它们可以通过系统调用运行一些内核代码。
在类似Unix的系统中,系统调用指的是活动进程(运行在CPU上的进程)对内核提供的服务的请求,如输入/输出(I/O)和进程创建(创建新的进程)。
这两种模式(用户模式和内核模式)在类Unix系统中的共存意味着当系统调用发生时,CPU需要切换到内核模式。这应该叫做模式切换,而不是上下文切换,因为当前的进程没有改变。
上下文切换是多任务操作系统的一个必要特征。多任务操作系统是指多个进程在一个CPU中运行而不互相干扰,看起来是同时运行的。这种并行的错觉是由于上下文的高速切换。当进程主动放弃其CPU时间或系统分配的时间片用完时,就会发生上下文切换。
00-1010上下文切换分为三种类型:
上下文切换分类
CPU的时间片会公平的分配给每个进程。当一个进程的时间片用完时,会被系统挂起,切换到其他进程等待CPU运行。当系统资源不足时,直到资源满足,进程才能运行,然后进程将被挂起,其他进程将被系统调度运行。当一个进程通过睡眠等方法主动挂起自己时,它也会被重新调度。当较高优先级的进程运行时,当前进程将被挂起,较高优先级的进程将首先执行。一. 进程上下文切换
当一个进程只有一个线程时,可以认为该进程等于该线程。当一个进程有多个线程时,这些线程共享相同的资源,如虚拟内存和全局变量。在上下文切换期间,不需要修改这些资源。前后线程属于不同的进程。此时,由于资源不共享,切换过程与进程上下文切换相同。前后线程属于同一个进程。众所周知,同一个进程中的线程共享资源。此时由于虚拟内存是共享的,切换时虚拟内存的这些资源保持不变,只需要切换线程、寄存器等非共享数据的私有数据。在这种情况下,线程上下文切换比进程间切换消耗更少的资源,所以这也是多线程相对于更多进程的优势。00-1010上下文切换有时由硬件中断触发。硬件中断是指硬件设备(如键盘、鼠标、调试解调器和系统时钟)向内核发送的信号,表示发生了一个事件(如按键、鼠标移动、从网络连接接收到的数据)。
00-1010一般情况下,上下文切换在几百到10,000的范围内,上下文切换超过10,000,很可能会遇到性能问题。我们需要详细了解。
资源切换时,意味着进程在等待资源,可能会出现I/O问题。非自愿上下文切换是指进程被强制调度,也就是在争夺CPU;中断数高表示CPU被中断处理程序占用。您可以通过/proc/中断查看。高频上下文切换会在寄存器、内核栈、虚拟内存等数据的存储和恢复中消耗CPU时间,影响进程的真实运行时间,影响系统服务。只有了解了CPU上下文切换的原理,才能在以后设计系统时妥善处理类似的问题。
00-1010对大厂建筑设计、BAT面试问题分享、编程语言理论或网圈趣闻轶事感兴趣。欢迎关注作者。是的,干货在这里。