详解CPU的态

目录

1.CPU的工作过程

2.寄存器

3.CPU的上下文

4.系统调用

5.CPU的态


1.CPU的工作过程

CPU要执行的指令的地址存在寄存器中,指令存放在内存中,而CPU本质上就是一个去内存中根据地址取指令,然后执行指令的硬件。

举一个例子:

例如PC寄存器中存放50,CPU读到存放的50,发出一条取址指令,去取出地址为50的内存单元中的指令,再传回给CPU。

2.寄存器

众所周知,为了配平CPU和内存之间速率的差距,CPU和内存之间存在着一个由寄存器组成的中间层,寄存器种会存放着CPU接下来要执行的指令,以及后续可能要执行到的指令以及可能要用到的数据。只有预先装载进去这部分可能要用到的东西才能抹平CPU和内存之间的速率差距,不然每次都要去内存取内容,可能是会拉低CPU的效率的。

 

但该预先装载哪些内容进寄存器种喃?这里遵循了程序的局部性原理。

程序的局部性原理:

程序在执行的时候呈现出局部性规律,在一段时间内,整个程序的执行仅限于程序中的某一个部分,相应的,执行所访问的存储空间也局限于某个内存区域。局部性又分为时间局部性和空间局部性。时间局部性指的是,如果程序中的某条指令一旦执行,则不久后可能会被再次执行,执行指令时访问的数据单元在不久后会被再次访问。空间局部性指的是,一旦访问了某个存储单元,不久后,其附近的存储单元也将被访问。

3.CPU的上下文

上文聊过,为了抹平内存和CPU之间的速率差,给CPU配备了寄存器。寄存器中存储着当前执行的指令、数据、以及下一条指令在内存中的地址等等事关程序正常运行的关键信息。所以寄存器中存储的内容合称为CPU的上下文。

4.系统调用

系统中将一些对系统级别资源的调用封装成了一个个函数,称为系统调用,常见的系统调用有很多,比如IO操作就是个系统调用。

5.CPU的态

操作系统在启动后,内存被分为两部分(两段):

  1. 内核段从0地址开始编址,存放操作系统程序,里面包含系统调用。
  2. 用户段,从内核段之后开始编址,存放用户程,也就是各个进程的数据和指令。

由于内核段存放的是系统相关的内容,基于安全的考虑,肯定是不允许被CPU随意访问的,需要特权才行。因此将CPU的权限设计为了两种状态:

  1. 用户态,只能访问用户段
  2. 内核态,能访问用户段和内核段

所谓的态就是能访问用户段的上下文以及能访问内核段的上下文。当我们调用系统调用的时候会引起上下文的切换,也就是CPU态的切换。上下文切换的意思是,先把前一个任务的 CPU 上下文保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。之所以会切换上下文,这是因为寄存器加载数据和指令的时候遵照了程序的局部性原理。CPU访问用户段时,寄存器里预加载的是用户段的资源;CPU访问内核段时,寄存器里预加载的是内核段的资源。

所以CPU进行态切换的时候,上下文一定会完全换一套的。总的来说为了保证多数情况下程序执行的效率,“局部性原理”是必须存在的,为了内核的安全,CPU态的划分是必须存在的。所以,CPU上下文切换是不得不接受的一种代价。

CPU的上下文切换是种耗时的操作:

  1. 寄存器保存和恢复:在上下文切换过程中,需要保存当前任务的寄存器状态,并恢复下一个任务的寄存器状态。寄存器保存和恢复涉及将寄存器的值从CPU保存到内存(或者栈)中,以及从内存中恢复到CPU中。这涉及到数据的读写和复制操作,会引入一定的延迟和开销。

  2. 内存刷新和缓存失效:上下文切换可能涉及刷新CPU缓存和内存管理单元(MMU)的操作。当切换到一个新的任务时,之前的任务的缓存内容可能需要刷新,新任务的页表和内存映射需要加载和设置,这些操作可能导致缓存失效和内存访问延迟。

  3. 上下文数据复制:在上下文切换过程中,需要将当前任务的上下文数据保存到内存中,同时从内存中加载下一个任务的上下文数据。这包括寄存器状态、程序计数器、标志位和其他与任务执行相关的数据。数据的复制和加载需要占用CPU和内存带宽,并引入一定的延迟。

  4. 任务切换开销:上下文切换不仅仅涉及寄存器和内存的操作,还包括任务切换本身的开销。这包括切换内核栈、更新任务控制块(TCB)、更新调度器数据结构等操作。这些操作可能需要修改内核数据结构,增加了上下文切换的开销。

总的来说CPU上下文切换很耗时,我们常见的就是IO操作、进程切换这些都会引起CPU上下文切换。

为什么上下文切换前要先将前一个任务的上下文保存起来:

这里解答一个问题,就是为什么上下文切换前要先将前一个任务的上下文保存起来,而不是直接保存该任务执行到何处了?其实也是基于性能来考虑的。举个例子:

假设执行三条指令:

ABC  

AC,用户级指令  

B,内核级指令

执行A时,“局部性原理”驱使寄存器在用户段加载需要的数据以及可能会用到的数据。

执行B时,“局部性原理”驱使寄存器在内核段加载需要的数据以及可能会用到的数据,卸载掉原来的老数据。

执行C时,“局部性原理”驱使寄存器在用户段加载需要的数据以及可能会用到的数据,卸载掉原来的老数据。

根据“局部性原理”,ABC指令是连续执行的,AC之间的数据很可能是共用的,但是由于中间执行B指令,就造成了额外的一次重新寻址加载数据的时间。

所以把前一个不同级别的指令的上下文保存起来是个不错的优化方法,避免了额外的重复寻址,减少了额外的时间开销。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

应用级监控方案Spring Boot Admin

1.简介 Spring Boot Admin为项目常用的监控方式,可以动态的监控服务是否运行和运行的参数,如类的调用情况、流量等。其中分为server与client: server: 提供展示UI与监控服务。client:加入server,被监控的…

http1.0、http1.1 http 2.0

HTTP/1.0是无状态、无连接的应用层协议。 无连接 无连接:每次请求都要建立连接,需要使用 keep-alive 参数建立长连接、HTTP1.1默认长连接keep-alive   无法复用连接,每次发送请求都要进行TCP连接,TCP的连接释放都比较费事&…

[爬虫]解决机票网站文本混淆问题-实战讲解

前言 最近有遇到很多小伙伴私信向我求助,遇到的问题基本上都是关于文本混淆或者是字体反爬的问题。今天给大家带来其中一个小伙伴的实际案例给大家讲讲解决方法 📝个人主页→数据挖掘博主ZTLJQ的主页 ​​ 个人推荐python学习系列: ☄️爬虫J…

在Windows下安装Anaconda平台

Anaconda介绍 安装Python的方法有很多,其中利用Anaconda来安装,是最为安全和便捷的方法之一。在Python中安装类库,各个类库之间可能存在相互依赖、版本冲突等问题。为了解决这个问题,Python社区提供了方便的软件包管理工具&#…

在SPringBoot生成验证码

1.引入依赖,这个依赖中包含了生成验证码的工具类 <!--引入hutool --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.9</version></dependency> 2.编写配置类 import cn.hu…

【NLP】国外新动态--LLM模型

一、说明 NLP走势如何?这是关于在实践中使用大型语言模型(LLM)的系列文章中的一篇文章。在这里,我将介绍LLM,并介绍使用它们的3个级别。未来的文章将探讨LLM的实际方面,例如如何使用OpenAI的公共API,Hugging Face Transformers Python库,如何微调LLM,以及如何从头开始…

Maven -- <dependencyManagement>管理子项目版本

背景&#xff1a; 一个旧项目&#xff0c;想使用mybatis-plus&#xff0c;想着这是比较基础的依赖包&#xff0c;就在父项目中添加对应依赖&#xff0c;如下: <!-- 依赖声明 --><dependencyManagement><dependencies><!-- mybatis-plus 依赖配置 -->&l…

WMTS 地图切片Web服务 协议数据解析

1. WMTS 描述 WMTS(Web Map Tiles Service):地图切片Web服务。 2. 数据示例&#xff1a; arcgis online 导出的wmts xml&#xff1a; https://sampleserver6.arcgisonline.com/arcgis/rest/services/WorldTimeZones/MapServer/WMTS 内容解析&#xff1a; contents中可能包…

云计算相关概念

文章目录 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云--区别和特性二、华为云&#xff1a;简介、主要业务、特点和优势、不同场景和行业中的应用三、华为云-三剑客&#xff1a;IaaS、PaaS、SaaS 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云–…

uni-app的H5版本下载跨域问题

前端能正常访问图片&#xff0c;但无法下载 因为路径不经过业务代码&#xff0c;所以需要在nginx配置跨域 代码&#xff1a; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS; add_header Access-Control-Allow-H…

WIN无法访问linux开启的SAMBA服务器

WIN无法访问linux开启的SAMBA服务器 打开搜索框“管理Windows凭据” 点击编辑

[java安全]CommonsCollections1(LazyMap)

文章目录 【java安全】CommonsCollections1(LazyMap)前言LazyMap如何创建LazyMap对象&#xff1f;如何调用LazyMap的get()方法&#xff1f;如何触发AnnotationInvocationHandler#invoke()方法&#xff1f;POC总结参考 【java安全】CommonsCollections1(LazyMap) 前言 前面我们…

【云原生】k8s之HPA,命名空间资源限制

1.HPA的相关知识 HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&#xff0c;HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、 Deployment 或者Replica Set 中的 Pod 数量。 &#xff08;1&a…

ubuntu 20.04 4090 显卡驱动安装 深度学习环境配置

1. 显卡驱动安装 准备工作&#xff1a; 换源安装输入法&#xff1a;重启的步骤先不管&#xff08;自选&#xff09;sudo apt update && sudo apt upgrade 禁用nouveau驱动&#xff08;这个驱动是ubuntu开源小组逆向破解NVIDIA的开源驱动&#xff0c;与英伟达的原有驱…

实训笔记7.19

实训笔记7.19 7.19一、座右铭二、Hadoop的HDFS分布式文件存储系统的相关原理性内容2.1 HDFS上传数据的流程2.2 HDFS下载数据的流程2.3 HDFS中NameNode和SecondaryNameNode工作机制&#xff08;涉及到HDFS的元数据管理操作&#xff09;2.4 HDFS中NameNode和DataNode的工作机制&a…

CVE-2023-1454注入分析复现

简介 JeecgBoot的代码生成器是一种可以帮助开发者快速构建企业级应用的工具&#xff0c;它可以通过一键生成前后端代码&#xff0c;无需写任何代码&#xff0c;让开发者更多关注业务逻辑。 影响版本 Jeecg-Boot<3.5.1 环境搭建 idea 后端源码&#xff1a; https://git…

opencv -12 图像运算之按 《位或》 运算(图像融合图像修复和去除)

位或运算 或运算的规则是&#xff0c;当参与或运算的两个逻辑值中有一个为真时&#xff0c;结果就为真。其逻辑关系可以类比为如图 所示的并联电路&#xff0c;两个开关中只要有任意一个闭合时&#xff0c;灯就会亮。 3-5 对参与或运算的算子的不同情况进行了说明&#xff0c;…

050、事务设计之Percolator事务模型

Percolator 背景 Bigtable: 大表打散每行到各个节点&#xff0c;每一行作为一个kv。解决的问题 一个事务涉及的行在多个节点&#xff0c;如何用单行对一个事务进行控制&#xff0c;实现原子性。 快照隔离级别&#xff08;snapshot &#xff09; 白色点&#xff1a;代表事务开始…

Spring:Bean生命周期

Bean 生命周期生命周期 Bean 生命周期是 bean 对象从创建到销毁的整个过程。 简单的 Bean 生命周期的过程: 1.实例化(调用构造方法对 bean 进行实例化) 2.依赖注入(调用 set 方法对 bean 进行赋值) 3.初始化(手动配置 xml 文件中 bean 标签的 init-method 属性值,来指…

C语言小项目——通讯录高阶(文件管理版)

通讯录初阶: 点这里 通讯录中阶: 点这里 文件管理版本改进之处通讯录初始化退出通讯录并保存 完整代码contact.hcontact.ctest.c 文件管理版本改进之处 通讯录初始化 contact.c 退出通讯录并保存 test.c contact.c contact.h 完整代码 contact.h #pragma once#include&l…