CPU上下文切换原理剖析

CPU上下文

CPU上下文其实是一些环境正是有这些环境的支撑,任务得以运行,而这些环境的硬件条件便是CPU寄存器和程序计数器。CPU寄存器是CPU内置的容量非常小但是速度极快的存储设备,程序计数器则是CPU在运行任何任务时必要的,里面记录了当前运行任务的行数等信息,这就是CPU上下文。

CPU上下文切换

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

在Linux中,Linux按照特权等级,将进程的运行空间分为内核空间和用户空间:

  • 内核空间具有最高权限,可以直接访问所有资源
  • 用户空间只能访问受限资源,不能直接访问内存等硬件设备,要想访问这些特权资源,必须通过系统调用

对于一个进程来说,一般是运行在用户态的,但是当需要访问内存、磁盘等硬件设备的时候需要陷入到内核态中,也就是要从用户态到内核态的转变,而这种转变需要通过系统调用来实现,例如一个打开文件的操作,需要调用open()打开文件,read()读取文件内容,write()将文件内容输出到控制台,最后close()关闭文件,这就是系统调用

在系统调用的过程中同样发发生了CPU上下文切换:

  • CPU寄存器里面原来用户态的指令位置,需要先保存起来,接着运行内核态代码
  • CPU寄存器需要更新为内核态指令的位置,执行内核态代码

系统调用结束后,CPU寄存器需要恢复原来保存的用户态,然后切换为用户空间,所以一次系统调用的过程,会发生两次的CPU上下文切换但是我们一般说系统调用是特权模式切换而不是上下文切换,因为这里没有涉及到虚拟内存等这些进程用户态的资源,也不会切换进程是属于进程之内的上下文切换,进程是由内核来管理和调度的,进程的切换只能发生在内核态,所以进程的上下文包含了虚拟内存、栈、全局变量等用户空间的资源,还包含了内核堆栈、寄存器等内核空间的状态,所以进程的上下文切换要比系统调用更多一步,保存该进程的虚拟内存、栈等用户空间的资源,进程上下文切换一般需要几十纳秒到数微秒的CPU时间,当进程上下文切换次数比较多的情况下爱,将导致CPU将大量的时间耗费在寄存器、内核栈即虚拟内存等资源的保存和恢复上,另外,Linux通过TLB快表来管理虚拟内存到物理内存的映射关系,当虚拟内存更新之后,需要刷新缓存,在这多处理系统上是很复杂的,因为多个处理器共享一个缓存。

下面再来说说什么时候会进行进程的上下文切换,其实就是进程在被调度的时候需要切换上下文,可能是主动地,也有可能是被动的

  • 系统进程正常调度算法导致进程上下文切换,例如目前使用的时间片轮转算法,当一个进程的时间片耗尽之后,CPU会进项进程的调度切换到其他进程
  • 进程在资源不足的时候,会被挂起例如在等待IO或者内存不足的时候,会主动挂起,并且等待系统调度其他进程
  • 当进程通过一些睡眠函数sleep()主动挂起的时候,也会重新调度
  • 当有高优先级的进程运行时,当前进程也会被挂起
  • 当发生硬件中断时,CPU上的进程会被中断挂起

线程上下文切换

线程是调度的基本单位,而进程则是资源拥有的基本单位,也就是说对于内核中的任务调度是以线程为单位,但是进程只是给线程提供了虚拟内存、全局变量等资源,进程与线程之间的区别这里不再介绍
那么线程上下文的切换,其实分为两种情况:

  • 前后两个线程属于不同进程,因为资源不共享,所以这时候的线程上下文切换和进程上下文切换是一致的
  • 前后两个线程属于同一个进程,因为虚拟内存是共享的,所以在切换的时候,虚拟内存这些资源保持不动,只有切换线程的私有数据、寄存器等不共享的资源

所以同进程内的线程切换要比多进程内的线程切换消耗更少的资源


中断上下文切换

中断是为了快速响应硬件的事件,简单来说就是计算机停下当前的事情,去处理其他的事情,然后在回来继续执行之前的任务,例如我们在调用print函数的时候,其实汇编的底层会帮我们调用一条 int 0x80的指令,便是调用0x80号中断
当然,中断要先将当前进程的状态保存下来,这样中断结束后进程仍然可以从原来的状态恢复运行,中断上下文的切换并不涉及进程的用户态,所以当中断程序打断了正在处于用户态的进程,不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源,只需要保存和恢复这个进程的内核态中的资源包括CPU寄存器、内核堆栈等
对于同一个CPU来说,中断处理比进程拥有更高的优先级,所以中断上下文切换并不会与进程上下文切换同时发生,一般来说中断程序都执行比较快短小精悍,以便快速结束执行之前的任务。当中断上下文切换次数比较多的时候,会耗费大量的CPU
怎么查看系统上下文
上面已经介绍到CPU上下文切换分为进程上下文切换、线程上下文切换、中断上下文切换,那么过多的上下文切换会把CPU的时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成为系统性能大幅下降的一个因素
所以我们可以使用vmstat这个工具来查询系统的上下文切换情况,vmstat是一个常用的系统性能分析工具,可以用来分析CPU上下文切换和中断的次数。

需要特别关注的是:

  • cswch(voluntary context switches):表示每秒自愿上下文切换的次数
  • nvcswch(non voluntary context switches):表示每秒非自愿上下文切换的次数

这两个概念的分别含义:

  • 自愿上下文切换:进程无法获取所需的资源,导致的上下文切换,例如IO、内存等资源不足时,就会发生自愿上下文切换
  • 非自愿上下文切换:进程由于时间片已到等时间,被系统强制调度,进而发生的上下文切换,例如大量的进程都在争抢CPU时,就容易发生非自愿上下文切换


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/442.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE使用v-html解析失败和解决方案

有些时候我们拿到后端返回内容进行v-html解析的时候,会发现解析之后,页面展示的还是html内容,我分析了我遇到的情况,希望能帮到大家。 原因:是因为后端返回数据的时候没有对内容进行html做转义,导致页面输出…

javaee 使用监听器统计当前在线用户列表

ServletContextListener 和 HttpSessionBindingListener 需要配和使用 TestServletContextListener package com.yyy.listener;import java.util.ArrayList; import java.util.List;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import …

手术麻醉临床信息系统源码:实现手术全流程自动化和信息化

手术麻醉临床信息系统遵循“以病人为中心、服务于临床”的宗旨,使医护人员从繁琐的病历书写中解放出来,集中精力关注病人的诊疗,将更多的时间用于分析、诊断。以服务围术期临床业务工作的开展为核心,为医护人员、业务管理人员、院…

SpringBoot 使用 MockMvc 进行 Web 集成测试

SpringBoot 使用 MockMvc 进行 Web 集成测试 在 SpringBoot 应用程序中,我们可以使用 MockMvc 进行 Web 集成测试。MockMvc 是一个测试框架,可以模拟 HTTP 请求和响应,并且可以使用 Spring MVC 的控制器进行测试。MockMvc 可以让我们测试 Sp…

【总结】网页状态码——200正常、302重定向、304客户端有缓存、400浏览器请求传参异常、404未找到、405方法不允许、500服务器异常

目录 200正常500异常--服务器异常Java代码400异常----传参相关的异常get方法长度限制400异常,加了RequestParam(value "name") 必须传值400异常,后端类型是Integer,前端传的是string,转换失败400异常,日期格…

2-css-1

一 CSS 初体验 CSS 定义:层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种样式表语言,用来描述HTML文档的呈现(美化内容) CSS 书写在什么位置? title 标签下方哪个标签里面…

常见的锁策略CAS

目录 一、乐观锁&悲观锁 1.1、悲观锁 1.2、乐观锁 二、重量级锁&轻量级锁 2.1、轻量级锁 2.2、重量级锁 三、自旋锁&挂机等待锁 3.1、自旋锁 3.2、挂起等待锁 四、读写锁&普通互斥锁 4.1、读写锁 4.2、互斥锁 五、公平锁&非公平锁 六、可…

基于WebAssembly构建Web端音视频通话引擎

Web技术在发展,音视频通话需求在演进,怎么去实现新的Web技术点在实际应用中的值,以及给我们带来更大的收益是需要我们去探索和实践的。LiveVideoStackCon 2022北京站邀请到田建华为我们从实践中来介绍WebAssembly、WebCodecs、WebTransport等…

Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

目录 一、事务的相关配置 1. 添加测试标签 2. 添加对应方法 3. 测试 二、事务的传播行为 三、事务的隔离级别 四、注解配置声明式事务 1. 注册事务注解驱动 2. 加上注解 3. 配置类代替xml文件中的注解事务支持 4. 测试 往期专栏&文章相关导读 1. Maven系列专栏…

css基础(三)

目录 一、CSS三大特性 1.层叠性 2.继承性 3.行高的继承 4.CSS三大特性之优先级 5.优先级注意的问题 6.CSS权重的叠加 二、盒子模型 1.盒子模型组成部分 2.盒子模型边框border 3.边框的复合写法 4.表格细线边框 5.边框会影响盒子实际大小 6.盒子模型内边距padding 7.盒子模型外边…

java并发编程 4:线程的暂停唤醒 wait/notify与park/unpark

目录 wait & notifywait notify 原理常用APIsleep(long n)和wait(long n)的区别wait notify的使用套路同步模式之保护性暂停实现带超时版多任务版 生产者/消费者模式 park & unpark基本使用原理 wait & notify wait notify 原理 假设一个线程,在获取锁…

【观察】新华三:数据中心可组合架构创新,提供多元算力的“最优解”

今天,以ChatGPT为代表的AIGC大模型,已经在国内形成了“海啸效应”,几乎所有的科技公司都在想方设法进入大模型的赛道。背后的核心驱动力,就在于大模型的最大价值在于普遍提升个人生产力,而各行各业的公司都在积极寻找应…