详解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指令,就造成了额外的一次重新寻址加载数据的时间。

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

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

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

相关文章

【蓝图】p27开关门互动实现

p27开关门互动实现 创建一个门 添加初学者内容包 拖拽一个门到场景中 添加一个碰撞 创建盒体触发器 左侧模式->基础->盒体触发器,拖拽到门上,调整大小 开关门互动实现 做一个开门互动 要把开门逻辑写在关卡蓝图里 门设置为可移动 打开关卡蓝…

link和@import的区别,性能优化

link和import的区别 两者都是外部引用CSS的方式,它们的区别如下: link是XHTML标签,除了加载CSS外,还可以定义RSS等其他事务;import属于CSS范畴,只能加载CSS。 link引用CSS时,在页面载入时同时加…

url解析与拼接工具UrlUtils

import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map;/*** 功能描述:url解析与拼接*/ public class UrlUtils {/*** 在给定的url后面拼接查询参数* param baseUrl url地址* param params 要拼接的查询参数map* return 拼接上params查…

SpringBoot整合knife4j

knife4j 文档地址:https://doc.xiaominfo.com/ knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 Swagger介绍 前后端分离开发模式中,api文档是最好的沟通方式。 Swagger 是一个规范和完整的框架,用于生成、描述、调用和…

实用在线工具网站分享

一、bejson网站: 1.功能 1)json工具 2)编码/解码、加密/解密 3)格式化工具 4)网络相关工具 5)前后端工具 6)正则生成等其他 7)文档处理 8)图片处理 9)文字处…

Docker中Mysql数据备份

Docker中Mysql数据备份 1.创建备份用户2.准备测试数据3.完全备份4.知识点解析 1.创建备份用户 百度过程中,有人说用最高权限root直接备份,不可取不安全,所以单独创建一个用于备份的用户 学习–去看–Mysql 备份所需要的权限 1.进入Mysql容器…

6.Hive系列之DML数据操作(二)

语句和Mysql、PgSQL都类似,简单过一遍 # 全表查询 select * from studen; # 列查询 select name, age from student; # 列别名 select name AS name1, age age1 from student; # 常用函数 count max min sum avg等 select avg(score) avg_score from student; # 限…

修复漏洞(一)离线升级Docker版本

前言 一般人最好用的修复漏洞的方式就是更新版本起因是使用的Docker版本被检测出来有一堆漏洞(例如:Docker 操作系统命令注入漏洞(CVE-2019-5736))更新环境无法联网,只能通过下载二进制文件的形式进行安装 步骤 可先通过which …

基于单片机的智能窗帘智能晾衣架系统的设计与实现

功能介绍 以STM32单片机单片机作为主控系统;OLED液晶显示当前环境温湿度,光照强度,时间,开关状态等信息;雨滴传感器检测当前环境是否下雨,天气下雨检测,天气潮湿时自动收衣服;可以通…

RabbitMq(一)

一、基本概念、常见工作模式以及简单使用 MQ全称Message Queue (消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 小结 MQ消息队列,存储消息的中间件分布式系统通信两种方式:直接远程调用和借助第三方完成间接通信发…

openGauss学习笔记-09 openGauss 简单数据管理-创建数据库

文章目录 openGauss学习笔记-09 openGauss 简单数据管理-创建数据库9.1 语法格式9.2 参数说明9.3 示例 openGauss学习笔记-09 openGauss 简单数据管理-创建数据库 数据库安装完成后,默认生成名称为postgres的数据库。您需要自己创建一个新的数据库。 9.1 语法格式…

低代码技术:提高效率降低成本的全新选择

一、前言 企业想要独立的应用程序,开发者在寻求更快速、更高效、更灵活的开发方法,以适应快速变化的市场需求。在这个背景下,低代码技术以提高效率降低成本的方式走进人们视野,成为了一种全新的应用程序开发方式。 二、相比传统的…

金融中的数学:概率分布(下)

上篇博客介绍了离散型概率分布,本篇博客介绍连续型概率分布。 1.连续型概率分布 连续型均匀分布(Continuous Uniform distribution)是一种描述在特定区间内取值均匀分布的概率分布。在该分布中,随机变量在给定区间内的取值概率密…

上门服务小程序|上门家政小程序开发

随着现代生活节奏的加快和人们对便利性的追求,上门家政服务逐渐成为了许多家庭的首选。然而,传统的家政服务存在着信息不透明、服务质量不稳定等问题,给用户带来了困扰。为了解决这些问题,上门家政小程序应运而生。上门家政小程序…

Jupyter入门使用教程

1 Jupyter Notebook与Jupyter Lab简介 Jupyter Notebook是一个开源的Web应用,在深度学习领域非常活跃。用户可以在这里创建和分享可执行代码、可视化结构和注释说明的文档。 Jupyter Notebook以网页的形式展现,用户可以在此网页中直接编辑代码、运行程…

通过 Lucene.Net 支持的 .NET 索引和搜索引擎的高效使用与探索:Examine 的简单索引与搜索数据应用以及其可扩展性分析

通过 Lucene.Net 支持的 .NET 索引和搜索引擎的高效使用与探索:Examine 的简单索引与搜索数据应用以及其可扩展性分析 在当前的技术环境中,搜索和索引数据变得越来越重要,尤其是在处理大量数据时。这就使得我们需要一种能够快速、精确、高效…

程序员如何制作PPT?

有道无术,术尚可求也;有术无道,止于术。大家好,我是程序员雪球,今天让我们一起探讨如何从零开始制作高质量的 PPT。 上周,领导要求我撰写一份关于 4到6月持续集成运营分析的报告,并通过 PPT 的形…

STM32单片机示例:多个定时器同步触发启动

文章目录 前言基础说明关键配置与代码其它补充示例链接 前言 多个定时器同步触发启动是一种比较实用的功能,这里将对此做个示例说明。 基础说明 该示例演示通过一个TIM使能时同步触发使能另一个TIM。 本例中使用TIM1作为主机,使用TIM1的使能信号作为…

win10 vscode 打包springboot项目

1 查看 java -version 2 环境变量配置 JAVA_HOME where java # D:\JDK\bin\java.exe1 在"系统变量"部分,点击"新建(N)"按钮。 2 在"变量名"字段中输入 JAVA_HOME 3 在"变量值"字段中输入 JDK 的安装路径。例如&#xff0…

基于 Linux 的轻量级多线程 HTTP 服务

使用基本的Linux系统调用来创建一个TCP socket&#xff0c;监听端口8080&#xff0c;并在接受到客户端连接时创建一个新的线程来处理连接。每个连接处理函数都是一个独立的线程&#xff0c;读取客户端请求并发送固定的HTTP响应。 代码&#xff1a; #include <iostream> …