• 【操作系统】聊聊什么是CPU上下文切换


    对于linux来说,本身就是一个多任务运行的操作系统,运行远大于CPU核心数的程序,从用户视角来看是并发执行,而在CPU视角看其实是将不同的CPU时间片进行分割,每个程序执行一下,就切换到别的程序执行。那么这个CPU上下文是什么。
    在这里插入图片描述
    我们知道对于CPU来说有寄存器和程序计数器,前者是CPU内置的高速缓存,存储数据的,后者是标识当前程序执行到哪里。
    比如我们执行某个程序,那么寄存器此时就保存着当前程序执行的数据,以及当前程序将要执行的下一条指令,这个就是CPU执行所依赖的环境,也被称为上下文。

    而上下文切换,其实就是将当前程序执行的数据进行保存,加载新的执行的程序的数据和指令。

    那么切换上下文,除了进程和线程两种方式,还有别的方式嘛?中断调用其实也会触发切换。

    进程上下文切换

    linux按照特权等级,进程运行的空间分为内核空间和用户空间,ring0和ring3 内核空间说白了就是可以执行所有操作和访问所有资源,而应用空间只能访问受限资源和执行指令。
    在这里插入图片描述
    进程在用户空间运行时被称为用户态,在内核空间运行时被称为内核态。
    比如读取一个文件,需要先从用户态切换到内核态,内核态调用read、write、close函数,最后在切换回用户态。
    而这里就需要在系统调用前保存用户态的栈、空间数据等,然后切换到内核态中,执行内核态,最后将现场还原。1次系统调用发生了两次上下文切换。

    • 进程上下文切换,是指从一个进程切换到另一个进程运行。
    • 而系统调用过程中一直是同一个进程在运行。

    系统调用过程通常称为特权模式切换,而不是上下文切换

    在这里插入图片描述
    所以进程上下文切换,其实需要先保存进程1的上下文,然后在加载进程2的上下文,而系统调用是比进程上下文切换少一步。
    进程在什么时候回发生切换,其实主要依赖于进程的调度算法,一般是按照优先级和最长时间等待。频繁的上下文切换,其实就会消耗CPU的执行时间。

    线程上下文切换

    线程与进程最大的区别在于,线程是调度的基本单位,而进程则是资源拥有的基本单位
    所以进程内的虚拟内存、全局变量对于同一个进程内的线程来说是共享的,但是线程也有自己的私有数据,栈和寄存器等。

    • 前后两个线程属于不同的进程,那么等价于进程上下文切换。
    • 前后两个线程同属于一个进程,虚拟内存是共享的,所以不动,但是需要切换线程的私有数据、寄存器等不共享数据。

    所以进程内的线程切换要比进程间切换的消耗更少的资源,也是多线程替代进程的优势。

    中断上下文切换

    为了快速响应硬件的事件,中断处理会打算进程的正常执行和调度。需要保存之前的状态和恢复现场。
    中断上下文切换不会打算用户态进程,只需要包含内核态中断服务程序执行所必须的状态,CPU寄存器、内核堆栈、硬件中断参数等。
    对于同一个CPU来说,中断处理比进程有更好的优先级。

    小结

    本篇我们讲述的了CPU上下文切换的理论,主要是进程、线程、中断上下文切换。如果上下文切换过多会导致整体系统性能下降。

    cpu上下文切换就好比一个人有好多朋友要拜访,有的朋友房子大(进程),进进出出里三层外三层,有的朋友住帐篷(线程),就拉开帐篷聊聊天,有的朋友就隔着窗户说两句话打个照面路过(中断)

  • 相关阅读:
    基于Spring Boot和Spring Cloud实现微服务架构学习(四)-Spring Cloud总结
    路由器bgp协议对接生产K8S集群网络(Calico)
    关于随机森林randomforest对结果进行分类的原则的个人理解
    Tomcat域名访问文件出现访问不到的问题
    渗透测试 ( 5 ) --- 扫描之王 nmap、渗透测试工具实战技巧合集
    (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 2-3
    安全的Sui Move是Web3大规模采用之路的基石
    【Vue】组件里面的data为什么必须是一个函数?vue的css作用域中scoped作用和原理分别是什么?组件的自定义事件触发条件是什么?组件之间传值
    PyTorch :YOLOv5实战
    python+selenium进行cnblog的自动化登录测试
  • 原文地址:https://blog.csdn.net/jia970426/article/details/133150565