【计算机组成原理】十个问题带你走进计算机组成的世界

news2024/12/28 4:39:43

十个问题带你走进计算机组成的世界

你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗?

在计算机中,数据和指令是分开区域存放的,存放指令的区域的地方称为正文段,存放数据的区域称为数据段。

例如下图中,数据1和数据2存储在数据存放区域,取数指令和"加法"指令存放在指令存放区域。

image.png

程序在编译完成后,在执行这个程序的时候,程序计数器的地址会被设置为0x100,然后依次执行正文段中的四条指令。

  1. 0x100中load 0x200 ->R0指令是将0x200中数据1放入寄存器R0中。
  2. 0x104中load 0x204 ->R1指令是将0x204中数据2放入寄存器R1中。
  3. 0x108中add R0 R1 R2指令是将寄存器R0中的数据1和寄存器R1中的数据2相加并存入寄存器R2中。
  4. 0x10c中set R2 -> 0x208指令是将寄存器R2的数据放入地址0x208内存,也就是变量a的地址。

大概内容就是:程序执行的时候,CPU会根据程序计数器(PC)里的内存地址,将内存中的需要执行的指令从内存中读取到指令寄存器(IR)中,然后指令寄存器(IR)分析该指令是什么指令,如果是计算类指令,就把指令交给逻辑运算单元(ALU)处理,如果是存储类型指令,就交给控制单元(CU)处理,然后接着根据指令长度自增,顺序读取下一条指令,直到这个程序结束。

软件用了那么多,你知道软件的 32 位和 64 位之间的区别吗? 32 位的操作系统可以运行在 64 位的电脑上吗?64 位的操作系统可以运行在 32 位的电脑上吗?如果不行,原因是什么?

64位和32位软件,实际上代表指令是64位和32位的。

  • 如果32位指令在64位机器上执行,需要一套兼容机制,就可以做到兼容运行了。但是如果64位指令在32位上执行,就比较难了,因为32位的寄存器存不下64位的指令。
  • 操作系统其实也是一种程序,我们也会看到操作系统会分为32位操作系统和64位操作系统,其代表意义就是操作系统中程序的指令是多少位,比如64位操作系统,指令也就是64位,因此不能装在32位机器上。

总之,硬件的64位和32位指的是CPU的位宽,软件的64位和32位指的是指令的位宽。

64 位相比 32 位 CPU 的优势在哪吗?64 位 CPU 的计算性能一定比 32 位 CPU 高很多吗?

64位相比32位CPU的优势主要体现在两个方面:

  • 64位CPU计算超过32位的数据只需要一次就可以,而32位的CPU计算超过的数据,要分为多个步骤进行计算,效率就会比64位CPU差,但是一般大部分的程序很少会计算那么大的数字,所以只有运算超过32位大数字的时候,64位CPU的优势才能体现出来,否则和32位的计算性能差距不大。
  • 一般64位CPU的地址总线是48位(下述原因),而32位CPU的地址总线是32位,所以64位CPU可以寻址更大的物理内存空间。如果一个32位CPU的地址总线是32位,那么该CPU最大寻址能力是4G(2^32),即使你加了8G大小的物理内存,也还是只能寻址到4G大小的地址,而如果一个64位CPU的地址总线是48位,那么该CPU最大的寻址能力是2^48,远超于32位CPU最大寻址能力。

为什么64位的CPU的地址总线为48位呢?

因为当前版本的AMD64架构就规定了只用48位地址;一个表示虚拟内存地址的64位指针只有低48位有效并带符号扩展到64位——换句话说,其高16位必须是全1或全0,而且必须与低48位的最高位(第47位)一致,否则通过该地址访问内存会产生#GP异常(general-protection exception)。

只用48位的原因很简单:因为现在还用不到完整的64位寻址空间,所以硬件也没必要支持那么多位的地址。

机械硬盘、固态硬盘、内存这三个存储器,到底和 CPU L1 Cache 相比速度差多少倍呢?

从寄存器、CPU Cache,到内存、硬盘,这样一层一层下来的存储器,访问速度越来越慢,存储容量越来越大,价格也越来越便宜,而且每个存储器只和相邻的一层存储器设备打交道,于是这样就形成了存储器的层次结构。

  • CPU L1 Cache 随机访问延时是1纳秒,内存则是100纳秒,所以CPU L1 Cache 比内存快100倍左右
  • SSD随机访问延迟是150微秒,所以CPU L1 Cache比SSD快150000倍左右
  • SSD比机械硬盘快70倍左右
  • 内存比机械硬盘快100000倍左右
  • CPU L1 Cache 比机械硬盘快10000000倍左右

有了内存,为什么还需要 CPU Cache?

上个问题提到,CPU访问L1 Cache速度比访问内存快100倍,这就是为什么CPU里会有L1~L3 Cache的原因,目的就是把Cache作为CPU与内存之间的缓存层,以减少对内存的访问频率。

CPU 是怎么读写数据的?

CPU 从内存中读取数据到 Cache 的时候,并不是一个字节一个字节读取,而是一块一块的方式来读取数据的,这一块一块的数据被称为 CPU Cache Line(缓存块),所以 CPU Cache Line 是 CPU 从内存读取数据到 Cache 的单位

至于 CPU Cache Line 大小,在 Linux 系统可以用下面的方式查看到,你可以看我服务器的 L1 Cache Line 大小是 64 字节,也就意味着 L1 Cache 一次载入数据的大小是 64 字节

什么是软中断?

中断处理程序应该要短且快,这样才能减少对正常进程运行调度地影响,而且中断处理程序可能会暂时关闭中断,这时如果中断处理程序执行时间过长,可能在还未执行完中断处理程序前,会丢失当前其他设备的中断请求。

Linux系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分为了两个阶段,分别为上半部分和下半部分

  • 上半部分用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。
  • 下半部分用来延迟处理上半部未完成的工作,一般以[内核线程]的方式运行。

eg:

网卡收到网络包后,通过 DMA 方式将接收到的数据写入内存,接着会通过硬件中断通知内核有新的数据到了,于是内核就会调用对应的中断处理程序来处理该事件,这个事件的处理也是会分成上半部和下半部。

上部分要做的事情很少,会先禁止网卡中断,避免频繁硬中断,而降低内核的工作效率。接着,内核会触发一个软中断,把一些处理比较耗时且复杂的事情,交给「软中断处理程序」去做,也就是中断的下半部,其主要是需要从内存中找到网络数据,再按照网络协议栈,对网络数据进行逐层解析和处理,最后把数据送给应用程序。

所以,中断处理程序的上部分和下部分可以理解为:

  • 上半部直接处理硬件请求,也就是硬中断,主要是负责耗时短的工作,特点是快速执行。
  • 下半部是由内核触发,也就是说软中断,主要是负责上半部未完成的工作,通常都是耗时比较长的事情,特点是延迟执行;

为什么负数要用补码表示?

如果负数不是使用补码的方式表示,则在做基本对加减法运算的时候,需要多一步操作来判断是否未负数,如果为负数,还得把加法反转成减法,或者把减法反转成加法,就非常不好了,所以为了性能考虑,应该尽量简化这个运算过程。

而用了补码的表示方式,对于负数的加减法操作,实际上是和正数加减法操作一样的。

计算机是怎么存小数的?

计算机是以浮点数的形式存储小数的,大多数计算机都是IEEE 754 标准定义的浮点数格式,包含三个部分:

  • 符号位:表示数字是正数还是负数,为0表示正数,为1表示负数。
  • 指数位:指定了小数点在数据中的位置,指数可以是负数,也可以是正数,指数位的长度越长则数值的表示范围就越大;
  • 尾数位:小数点右侧的数字,也就是小数部分,比如二进制1.0011 x 2^(-2),尾数部分就是0011,而且尾数的长度决定了这个数的精度,因此如果要表示精度更高的小数,则就要提高尾数位的长度;

用 32 位来表示的浮点数,则称为单精度浮点数,也就是我们编程语言中的 float 变量,而用 64 位来表示的浮点数,称为双精度浮点数,也就是 double 变量。

为什么 0.1 + 0.2 == 0.3 吗?

不等于,0.1和0.2这两个数字用二进制表达会是一个一直循环的二进制数,比如0.1的二进制表示为0.00011 0011 0011...(0011无限循环),对于计算机而言,0.1无法精确表达,这是浮点数计算造成精度损失的根源。

因此,IEEE 754标准定义的标准数只能根据精度舍入,然后用【近似值】来表示该二进制,那么意味着计算机存放的小数可能不是一个真实值。

0.1+0.2并不等于完整的0.3,这主要是因为这两个小数无法用【完整】的二进制来表示,只能根据精度舍入,所以计算机里只能采用近似数的方式来保存,那两个近似数相加,得到的必然也是一个近似数。

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

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

相关文章

Redis配置

关系型数据库和非关系型数据库 ①了解关系和非关系 关系型数据库 一个结构化的数据库,创建在关系模型基础上,一般面向于记录,包括Oracle、MySQL、SQL Server、Microsoft Access、DB2、postgreSQL等 非关系型数据库 除了主流的关系型数据库…

java 歌词解析 源代码, 在windows10下调试运行成功。

需要两个素材。 歌词与音乐.wav package week3.exam6;public class Info {private final String info;public Info(String info){this.infoinfo;}public String getInfo() {return info;}public String toString(){return info;} }package week3.exam6;public class Lyric ext…

华为云新用户云服务器优惠价格表

华为云服务器作为业界领先的云服务提供商之一,一直致力于为全球用户提供高效、稳定、安全的云服务。为了帮助新用户更好地了解华为云服务器的价格和优惠活动,本文将详细介绍华为云服务器对新用户的优惠价格表。 一、华为云耀云服务器L实例价格表 华为云…

JavaScript基础知识09——数据类型

哈喽,大家好啊,这里是雷工笔记,我是雷工。 数据类型比较常见,无论是对程序员,还是电气工程师来说,都再熟悉不过了,这里跟着教程了解一下,主要看跟自己以往在其他PLC,C#&a…

2023-09-09 LeetCode每日一题(课程表)

2023-09-09每日一题 一、题目编号 207. 课程表二、题目链接 点击跳转到题目位置 三、题目描述 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中…

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff…

python-jieba库

jieba库,python提供的中文分词函数库的第三方库,它可以将一段中文文本分割成中文词语序列。 安装jieba库 pip install jiebajieba的三个模式 全模式 - - - jieba.lcut(s,cut_allTrue) - - - 速度非常快,但有冗余数据 精确模式(…

窗口延时、侧输出流数据处理

一 、 AllowedLateness API 延时关闭窗口 AllowedLateness 方法需要基于 WindowedStream 调用。AllowedLateness 需要设置一个延时时间,注意这个时间决定了窗口真正关闭的时间,而且是加上WaterMark的时间,例如 WaterMark的延时时间为2s&…

嵌入式开发-绪论

目录 一.什么是嵌入式 1.1硬件系统 1.2软件系统 二.嵌入式应用场景 2.1消费电子 2.1.1智能家居 2.1.2影音 2.1.3家用电器 2.1.4玩具游戏机 2.2通信领域 2.2.1对讲机 2.2.2手机 2.2.3卫星 2.2.4雷达 2.3控制领域 2.3.1机器人 2.3.2采集器PLC 2.4金融 2.4.1POS…

快速文件复制与删除工具,将复制时文件夹里的原文件删除掉

无论是工作还是生活,我们都离不开文件的复制和管理。然而,手动复制文件不仅费时费力,而且容易出错。现在,我们为您推荐一款快速文件复制与删除工具,让您的文件管理更加高效! 首先,我们要进入文…

MybatisPlus分页插件使用

一. 效果展示 二. 代码编写 2.1 pom <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency>2.2 添加配置类 Configuration MapperScan(…

推荐一款程序员截图神器!

快来看一下程序员必备的一款截图工具 今天就来和大家说一下作为程序员必备截图神器&#xff0c;几乎每一个程序员都会设置开机自启&#xff0c;因为这个截图功能太太太好用了&#xff01;&#xff01;&#xff01;只要你在键盘上按下F1就可以轻松截取整个屏幕&#xff0c;然后…

51单片机项目(9)——基于51单片机的电子琴设计

简易电子琴设计设计内容: 1.用矩阵键盘代表琴键&#xff0c;至少能弹出8个音符&#xff0c;分别是:音符1.23.4.,5,6, 2.键按下的时间长短表征节拍的长短&#xff0c;用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 &#xff08;代码及其工程文件放在最后&#xff09; …

vue中的几种name属性

vue中的几种name属性 组件名name name选项 export default{name:xxx } // 获取组件的name属性 this.$options.namevue-devtools调试工具里显示的组件名称&#xff1b; 未配置name选项&#xff0c;就是组件的文件名&#xff1b; vue3配置name通过defineOptions()函数 de…

msvcp110.dll是什么意思与msvcp110.dll丢失的解决方法

电脑突然提示msvcp110.dll丢失&#xff0c;无法执行此代码。导致软件无法打开运行&#xff0c;这个怎么办呢&#xff1f;我在网上找了一天的资料&#xff0c;终于把这个问题彻底处理好&#xff0c;也弄清楚了msvcp110.dll丢失的原因及msvcp110.dll丢失修复方法&#xff1f;现在…

20230909java面经整理

1.java常用集合 ArrayList动态数组&#xff0c;动态调整大小&#xff0c;实现List接口 LinkedList双向链表&#xff0c;实现list和queue接口&#xff0c;适用于频繁插入和删除操作 HashSet无序&#xff0c;使用哈希表实现 TreeSet有序&#xff0c;使用红黑树实现 HashMap无序&…

FPGA开发

https://www.enclustra.com.cn/?bd_vid11435475462206745180 https://www.monolithicpower.cn/design-tools/design-tools/llc-design-tool.html https://www.elecfans.com/article/88/143/2012/20120718280641_2.html

[JAVAee]IP数据包的组包与分包

目录 数据包是什么? 数据包的结构 数据包/分组与分组交换 分包是什么?为什么需要分包呢? 组包是什么? 分包组包过程中和哪些 IP 报头字段有关联? 本篇文章主要围绕三个问题来展开: 为什么要分包?分包组包过程中和哪些 IP 报头字段有关联组包时如何保证数据的顺序和…

基于Yolov8的中国交通标志(CCTSDB)识别检测系统

目录 1.Yolov8介绍 2.纸箱破损数据集介绍 2.1数据集划分 2.2 通过voc_label.py得到适合yolov8训练需要的 2.3生成内容如下 3.训练结果分析 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&…

kafka学习-生产者

目录 1、消息生产流程 2、生产者常见参数配置 3、序列化器 基本概念 自定义序列化器 4、分区器 默认分区规则 自定义分区器 5、生产者拦截器 作用 自定义拦截器 6、生产者原理解析 1、消息生产流程 2、生产者常见参数配置 3、序列化器 基本概念 在Kafka中保存的数…