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

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

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

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

进程上下文切换

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

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

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

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

线程上下文切换

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

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

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

中断上下文切换

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

小结

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

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

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

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

相关文章

Controller统一异常处理和yaml配置

目录 Controller统一异常处理 url解析 static下静态资源文件的访问 配置类 如何访问static下的资源文件 yaml基础语法 注解赋值 批量注入 单个注入 Controller统一异常处理 Controller统一异常处理ControllerAdvice:统一为Controller进行"增强" …

golang在goland编译时获取环境变量失效

在golang中, 我们通常使用os包来获取环境变量,如: os.Getenv() os.LookupEnv() 等。 但如果我们使用goland编译器,在编译是,这时操作环境变量,会发现os包读取到的环境变量值不变: 新增后&am…

ubuntu20.4 更新中科大软件源

打开软件源配置文件以编辑: sudo nano /etc/apt/sources.list在编辑器中,你会看到当前的软件源列表。将这些源更改为一个可用的源,例如使用中国科大源: deb http://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe …

(Clock Domain Crossing)跨时钟域信号的处理 (自我总结)

CummingsSNUG2008Boston_CDC.pdf 参考: 跨时钟域处理方法总结–最终详尽版 - love小酒窝 - 博客园 跨时钟域(CDC)设计方法之单bit信号篇(一) | 电子创新网赛灵思社区 孤独的单刀_Verilog语法,FPGA设计与调试,FPGA接口与…

LVGL移植win端模拟显示流畅解决方案-使用 SquareLine 生成前端 UI 文件

lvgl_port_win_vscode 在 win 平台对 lvgl 方便的进行模拟显示,程序文件结构清晰,lvgl with SDL2,cmake 构建,VsCode 一键运行,使用 SquareLine 生成前端 UI 文件,win 上直接跑。 相比官方的 lvgl 移植到…

不同层设置不同学习率

使用预训练模型时,可能需要将 (1)预训练好的 backbone 的 参数学习率设置为较小值, (2)而backbone 之外的部分,需要使用较大的学习率。 from collections import OrderedDict import torch.nn …

Redis 集合(Set)快速指南 | Navicat

Redis 支持通过多种数据类型来存储项目集合。其中,包括列表、集合和哈希。上周的博文介绍了列表(List)数据类型并重点介绍了一些用于管理列表(List)的主要命令。在今天的文章中,我们将转向关注集合&#xf…

P-MVSNet ICCV-2019 学习笔记总结 译文 深度学习三维重建

文章目录 5 P-MVSNet ICCV-20195.0 主要特点5.1 文章概述5.2 研究方法5.2.1 特征提取5.2.2 学习局域匹配置信5.2.3 深度图预测5.2.4 Loss方程MVSNet系列最新顶刊 对比总结5 P-MVSNet ICCV-2019 深度学习三维重建 P-MVSNet-ICCV-2019(原文、译文、批注) 下载 5.0 主要特点 …

【MySQL基础】--- 约束

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、什么…

Ceph入门到精通-ceph pool 删除导致 misplaced 的原因

misplaced 的原因 Ceph中的misplaced对象是指将对象(或对象的副本)存储在错误的位置上,这可能会导致性能下降或数据不一致的问题。在删除Ceph池时,可能会导致misplaced的原因有以下几个: 删除过程中的操作失误&#x…

Python 打印文本进度条

""" 打印文本进度条知识点:1、字符串运算,注意只能适用于加法、乘法,例如:123 123 123123例如:123 * 3 1231231232、循环语句while、for3、条件语句if4、重点:转义字符\r,可以…

【springMvc】自定义注解的使用方式

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》 ⛺️ 生活的理想,为了不断更新自己 ! 1.前言 1.1.什么是注解 Annontation是Java5开始引入的新特征,中文名称叫注解。 它提供了一种安全…

python的多线程多进程与多协程

python的多线程是假多线程,本质是交叉串行,并不是严格意义上的并行,或者可以这样说,不管怎么来python的多线程在同一时间有且只有一个线程在执行(举个例子,n个人抢一个座位,但是座位就这一个,不…

Unity中UI组件对Shader调色

文章目录 前言一、原理在Shader中直接暴露的Color属性,不会与UI的Image组件中的Color形成属性绑定。因为UI的Image组件中更改的颜色是顶点颜色,如果需要在修改组件中的颜色时,使Shader中的颜色也同时改变。那么就需要在应用程序阶段传入到顶点…

gin 基本使用

gin 初体验 import ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})})r.Run() }gin 路由接受一个 type …

数据结构和算法(8):搜索树(二叉搜索树和AVL树)

查找 所谓的查找或搜索,指从一组数据对象中找出符合特定条件者,这是构建算法的一种基本而重要的操作。其中的数据对象,统一地表示和实现为 词条(entry) 的形式;不同词条之间,依照各自的 关键码…

Golang slice 通过growslice调用nextslicecap计算扩容

先来看一段代码 code: e : []int64{1, 2, 3}fmt.Println("cap of e before:", cap(e))e append(e, 4, 5, 6, 7)fmt.Println("cap of e after:", cap(e))output:cap of e before: 3 cap of e after: 8 为什么容量是8? append了的4个元素&…

Python:使用PySimpleGUI中sg.Input控件获取数据plot导致yticks错乱

sg.Input获取y轴数据代码 sg.Text(First Read:, font("Times New Roman", 9)),sg.Input(key-first_read-, size(25, 1), default_text0,0,0, justificationcenter, font("Times New Roman", 9), expand_xTrue), sg.Text(Second Read:, font("Times Ne…

Vue Grid Layout -️ 适用Vue.js的栅格布局系统,在vue3+上使用

文章目录 1、官网简介2、在vue3中使用1)、需要导入vue3支持的版本插件2)、在mian.js里引入:3)、在组件中使用 3、layout布局的计算逻辑4、 gridLayout 的属性 该栅格系统目前对 vue2 的支持是最好的,vue3 是需要用插件支持的,会在小节详细讲解…

求二维子数组的和(剖析)

文章目录 🐒个人主页🏅JavaSE系列专栏📖前言:本篇剖析一下二维子数组求和规则: 🐒个人主页 🏅JavaSE系列专栏 📖前言:本篇剖析一下二维子数组求和 规则: 这…