[金三银四] 操作系统上下文切换系列

在这里插入图片描述

图源: https://zhuanlan.zhihu.com/p/540717796


文章目录

      • 2.11 cpu 的上下文切换
      • 2.12 协程的上下文切换
      • 2.13 线程的上下文切换
      • 2.14 进程的上下文切换
      • 2.15 中断上下文切换
      • 2.16 什么时候会发生进程的上下文切换
      • 2.17 什么时候会发生线程的上下文切换
      • 2.18 什么时候会发生协程的上下文切换
      • 2.19 为什么会有CPU的上下文切换

2.11 cpu 的上下文切换

  • 什么是CPU上下文

CPU 寄存器和程序计数器是 CPU 在运行任何任务前,所必须依赖的环境,这些环境就叫做 CPU 上下文。
CPU 上下文切换就是先把前一个任务的 CPU 上下文(CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,重新加载指令数据,运行新任务。
系统内核会存储切换下来的上下文信息,当此任务再次被分配给 CPU 运行时,CPU 会重新加载这些上下文,这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。
上面说到所谓的「任务」,主要包含进程、线程和中断。所以,可以根据任务的不同,把 CPU 上下文切换分成:进程上下文切换、线程上下文切换和中断上下文切换

2.12 协程的上下文切换

与熟悉的进程/线程切换类似,协程是用户自发的上下文切换和管理机制,所以也常被称为“用户态线程”。
而对于运行时的函数来讲,参数、返回值地址、函数栈、寄存器四个部分组成了运行时的全部信息,通过这些信息我们可以恢复任意函数的执行现场,我们称之为协程的上下文(context)。
也就是说,协程的上下文切换,本质上就是要保存旧的函数参数、返回值地址、函数栈以及寄存器,并加载新的函数数据,以达到新的协程运行环境跟旧的运行环境隔离,并且旧的运行环境可以恢复的目的。

2.13 线程的上下文切换

首先,线程是依托于进程而存在的,同一个进程内多个线程之间可以共享代码段、数据段以及打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。
也就是说,线程的上下文切换主要分两种情况:新旧线程属于同一个进程,以及新旧进程不属于同一进程。
对于属于同一进程的两个线程的上下文切换来说,只需要切换线程私有的数据以及寄存器和栈信息即可。
对于不属于同一进程的线程上下文切换,他等同于进程的上下文切换。

2.14 进程的上下文切换

首先,进程的上下文也就是进程的运行时环境,他包含了虚拟内存、栈、全局变量等用户空间的资源,以及内核堆栈、寄存器等内核空间的资源
因为进程的运行时环境比较复杂,我们操作系统里面存在一个叫PCB(process control block),进程控制块的东西来存储进程的运行时环境。当发生进程上下文切换时,操作系统会保存旧进程的运行时数据到PCB里面,然后加载新的PCB,来达到新旧进程的运行时隔离的目的。

2.15 中断上下文切换

为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。而在打断其他进程时,就需要将进程当前的状态保存下来,这样在中断结束后,进程仍然可以从原来的状态恢复运行。
跟进程上下文不同,中断上下文切换并不涉及到进程的用户态。所以,即便中断过程打断了一个正处在用户态的进程,也不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源。中断上下文,其实只包括内核态中断服务程序执行所必需的状态,包括 CPU 寄存器、内核堆栈、硬件中断参数等。
对同一个 CPU 来说,中断处理比进程拥有更高的优先级,所以中断上下文切换并不会与进程上下文切换同时发生。同样道理,由于中断会打断正常进程的调度和执行,所以大部分中断处理程序都短小精悍,以便尽可能快的执行结束。
另外,跟进程上下文切换一样,中断上下文切换也需要消耗 CPU,切换次数过多也会耗费大量的 CPU,甚至严重降低系统的整体性能。所以,当你发现中断次数过多时,就需要注意去排查它是否会给你的系统带来严重的性能问题。

2.16 什么时候会发生进程的上下文切换

首先,明确一点的是,只有当进程的状态发生改变的时候,才会导致进程的上下文切换。 而导致进程状态发生改变的原因主要有以下三种:

  1. 系统调度导致

比如说,某操作系统采用时间片轮转法进程进程调度,当当前进程的时间片耗完之后,进程就从运行状态变为就绪状态,系统从就绪队列选择另外一个进程运行;

  1. 硬件中断导致

发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序;

  1. 进程主动挂起

当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度;

2.17 什么时候会发生线程的上下文切换

线程主要由六种状态,创建、运行、堵塞、等待、超时等待和结束六种状态。当线程状态改变的时候,就会发生上下文的切换。

2.18 什么时候会发生协程的上下文切换

因为协程是用户态线程,只运行在用户空间,也就是说,协程的切换并不受系统控制。所以切换由用户自己控制,由当前协程切换到其他协程由当前协程来控制。

2.19 为什么会有CPU的上下文切换

CPU上下文切换的本质原因,就是为了利用有限的CPU资源,去运行更多的任务,从而提高系统的吞吐量。
比如说,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。
而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU 寄存器和程序计数器。

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

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

相关文章

前缀和(一)

前缀和 一维前缀和数组 假设有一个数组为a [ n ] , 另一个数组为s [ n ] . 其中 s [ j ] a[1] a[ 2 ] ......a[ j-1] a [ j ] 。--->s[ j ]表示a数组从第一个元素到第 j 个元素之和,那么我们则就称 s 数组为前缀和数组 例题:前缀和 链接:…

遥感原理与应用—绪论

一、关于基本概念与对应的英文 遥感:Remote Sensing 遥测:Telemetry,对被测物体某些运动参数和性质进行远距离测量的技术,分为接触测量与非接触测量,对于RS的概念,遥测探测的目标显得狭隘了一些&#xff…

AI女朋友 -- 一个傲娇女友,嘴上刻薄但内心关心你

文章目录 前言一、成果展示 1、ai女友2、留言板二、实现思路三、难点问题四、总结 前言 在免费API寻找过程中,发现了ai女友的接口,打算从这个接口入手,做出给人一种有女朋友的、温柔的、亲近的、容易给的感觉! 一、成果展示 1、A…

Git bash获取ssh key

目录 1、获取密钥 2、查看密钥 3、在vs中向GitHub推送代码 4、重新向GitHub推送修改过的代码 1、获取密钥 指令:ssh-keygen -t rsa -C "邮箱地址" 连续按三次回车,直到出现类似以下界面: 2、查看密钥 路径:C:\U…

FreeCAD傻瓜教程之基准面的构建-在实体的表面上新建坐标、倾斜的平面、附加不同的台阶、旋转体等

目的:学会在已有模型的不同剖面上建立新的坐标系,并绘图;使得新图形仍然作为同一个零件实体的构件。 零、需求举例 在下列模型中,我们要在圆杆的顶部增加一个把手,如果点击圆杆顶部,则仅能在顶部圆形所在…

JVM虚拟机栈

虚拟机栈 虚拟机栈概述 栈是运行时的单位,而堆是存储的单位。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放在那儿。 虚拟机栈的基本内容 Java虚拟机栈 Java…

瑞吉外卖实战学习--登录功能的开发

登录功能的开发 前端1、创建实体类Employee和employee表进行映射,可以直接导入资料中提供的实体类1.1、字段名称对应上,有下划线的使用驼峰对应,因为在配置文件中进行了配置1.2、employee 文件 2、创建Controller、Service、Mapper2.1、Mapper文件2.2、定…

Windows复现SiamCAR代码遇到的报错与解决方法

一、环境基础 Windows10以上 已装Anaconda 支持GPU 已经gitclone:https://github.com/HonglinChu/SiamTrackers 二、遇到的报错 1. No module named pycocotools._mask 方案一:加载非常慢 conda install -c conda-forge pycocotools 方…

智慧物联-能源分析平台

物联能源分析平台是为了满足企业对能源管理和节能减排的需求而开发的一套在线平台。随着能源问题日益凸显,企业对能源的使用和管理面临着越来越大的挑战。因此,开发一个能够帮助企业实时监测、分析和优化能源消耗的平台变得尤为重要。 随着工业化和城市…

力扣3. 无重复字符的最长子串

Problem: 3. 无重复字符的最长子串 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.川建一个set集合存储最长的无重复的字符; 2.创建双指针p、q,每次当q指针指向的字符不在set集合中时将其添加到set集合中让q指针后移,并且更新…

【算法每日一练]

目录 今日知识点: 辗转相减法化下三角求行列式 组合数动态规划打表 约数个数等于质因数的次方1的乘积 求一个模数 将n个不同的球放入r个不同的盒子:f[i][j]f[i-1][j-1]f[i-1][j]*j 将n个不同的球放入r个相同的盒子:a[i][j]a[i-j][j]a[…

从零开始学HCIA之网络基础知识01

1、20世纪70年代末,为了打破不同厂商设备之间无法相互通信的界限,ISO(International Organization for Standardization,国际标准化组织)开发了OSI参考模型(Open System Interconnection Reference Model&a…

树的遍历方式DFS和BFS

DFS(depth first search) 深度优先遍历 从图中一个未访问的顶点V开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路走到底…不断递归重复这个过程,直到所有的顶点都遍历完成。前序遍历&#xff0c…

前端框架前置课(1)---AJAX阶段

1. AJAX入门 1.1 AJAX概念和axios使用 1.1.1 什么是AJAX? 1.1.2 怎么用AJAX? 引入axios.js 获取省份列表数据 1.2 认识URL 1.3 URL查询参数 1.4 常用请求方和数据提交 1.5 HTTP协议-报文 1.5.1 HTTP响应状态码 1.5.1.1 状态码:1XX(信息&#xff09…

用最小堆实现通用的高效定时器组件

用最小堆实现通用的高效定时器组件 文章目录 用最小堆实现通用的高效定时器组件开篇解决方案类图源码实现测试总结 开篇 在程序开发过程中,定时器会经常被使用到。而在Linux应用开发中,系统定时器资源有限,进程可创建的定时器数量会受到系统限…

力扣爆刷第103天之CodeTop100五连刷1-5

力扣爆刷第103天之CodeTop100五连刷1-5 文章目录 力扣爆刷第103天之CodeTop100五连刷1-5一、3. 无重复字符的最长子串二、206. 反转链表三、146. LRU 缓存四、215. 数组中的第K个最大元素五、25. K 个一组翻转链表 一、3. 无重复字符的最长子串 题目链接:https://l…

计算机软件安全

一、软件安全涉及的范围 1.1软件本身的安全保密 软件的本质与特征: 可移植性 寄生性 再生性 可激发性 攻击性 破坏性 …… 知识产权与软件盗版 软件商品交易形式不透明,方式多样,传统商标标识方法不适用; 盗版方法简捷…

我的风采——android studio

目录 实现“我的风采”页面要求理论代码生成apk文件 实现“我的风采”页面 要求 要求利用’java框架的边框布局实现“找的风采 ”页而,其中中间为你的生活照,左右和下面为按钮,上面为标签 理论 Java GUI编程是Java程序设计的重要组成部分…

浩哥带你做项目,纯免费教学

浩哥带你做项目 一、YiYi-Web项目开发1. 简介2. 技术栈2.1 后端开发环境2.2 前端开发环境 3.项目截图 二、计算机游戏程序设计(基础篇)三、RuoYi-Cloud项目学习1.功能介绍2.项目截图 四、鸿蒙应用开发五、软考六、Linux基础知识学习 最近浩哥社区群涌进大…