大家好,欢迎来到IT知识分享网。
要搞懂CPU上下文切换,我们先来看下这个问题。
Linux 是一个多任务操作系统,但它为什么支持超过 CPU 数量的任务同时运行呢 ?
其实很简单,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,大家可能就错误的认为是多任务同时运行。
欢迎关注笔者,优质文章都在这里等你。
上下文切换原理
CPU上下文切换(有时也称做进程切换或任务切换)也就是指 CPU 从一个进程或线程切换到另一个进程或线程。
上下文是指某一时间点 CPU 寄存器和程序计数器的内容。
寄存器是 CPU 内部的数量较少但是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序运行的速度。程序计数器是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置,具体依赖于特定的系统。
CPU 上下文切换,就是先把前一个任务的 CPU 上下文( CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
这些保存下来的上下文,存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务给大家的感觉还是在连续运行。
上下文切换只能发生在内核态中。内核态是 CPU 的一种有特权的模式,在这种模式下只有内核运行并且可以访问所有内存和其他系统资源。其他的程序,如应用程序,在最开始都是运行在用户态,但是他们能通过系统调用来运行部分内核的代码。
系统调用在类 Unix 系统中是指活跃的进程(正在运行在 CPU 上的进程)对于内核所提供的服务的请求,例如输入/输出(I/O)和进程创建(创建一个新的进程)。
这两种模式(用户态和内核态)在类 Unix 系统中共存意味着当系统调用发生时 CPU 切换到内核态是必要的。这应该叫做模式切换而不是上下文切换,因为没有改变当前的进程。
上下文切换在多任务操作系统中是一个必须的特性。多任务操作系统是指多个进程运行在一个 CPU 中互不打扰,看起来像同时运行一样。这个并行的错觉是由于上下文在高速的切换。当某一进程自愿放弃它的 CPU 时间或者系统分配的时间片用完时,就会发生上下文切换。
上下文切换分类
上下文切换分为三种:
一. 进程上下文切换
- CPU 的时间片会公平的分配给各个进程。当某个进程的时间片用完后,就会被系统挂起,切换到其它正在等待 CPU 的进程运行。
- 进程在系统资源不够时,要等到资源满足后才能运行,这时进程也会被挂起,并由系统调度其他进程运行。
- 当进程通过 sleep 这样的方法将自己主动挂起时,也会重新调度。
- 当有优先级更高的进程运行时,当前进程会被挂起,高优先级进程优先执行。
二. 线程上下文切换
当进程只有一个线程时,可以认为进程就等于线程。当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源。这些资源在上下文切换时是不需要修改的。
- 前后两个线程属于不同进程。此时,因为资源不共享,所以切换过程就跟进程上下文切换是一样。
- 前后两个线程属于同一个进程。大家都知道,同一个进程下的线程是资源共享的,这时候因为虚拟内存是进行共享的,所以在切换时,虚拟内存这些资源不变,只需要切换线程的私有数据、寄存器等不共享的数据,这种情况的线程上下文切换就要比进程间的切换消耗更少的资源,所以这也是多线程相比较多进程的优势。
三. 中断上下文切换
上下文切换有时也因硬件中断而触发。硬件中断是指硬件设备(如键盘、鼠标、调试解调器、系统时钟)给内核发送的一个信号,该信号表示一个事件(如按键、鼠标移动、从网络连接接收到数据)发生了。
总结
一般上下文切换在数百到一万之内,上下文切换超过1万,很可能遇到性能问题。需要具体看看了。
- 资源上下文切换时说明进程在等待资源,有可能发生了I/O等问题;
- 非自愿上下文切换,说明进程在被强制调度,也就是在争抢CPU;
- 中断次数多了,说明CPU在被中断处理程序占用。可以通过/proc/interrupts 查看。
高频的上下文切换会把 CPU 时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,影响进程真正运行的时间,导致系统服务受到影响,大家只有在搞懂CPU上下文切换原理后,以后在做系统设计的时候才能将类似问题处理得当。
您的转发+关注就是对笔者最大的支持,欢迎关注。
对大厂架构设计,BAT面试题分享,编程语言理论或者互联网圈逸闻趣事这些感兴趣,欢迎关注笔者,没有错,干货文章都在这里。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/83142.html