(学习笔记-硬件结构)CPU如何执行程序?

news2024/11/28 16:47:04

冯诺依曼模型

冯诺依曼模型主要由五部分组成:运算器、控制器、存储器、输入设备、输出设备。

控制器(Control Unit):从内存中取指令、翻译指令、分析指令,然后根据指令的内存向有关部件发送控制命令,控制相关部件执行指令所包含的操作。

运算器(ALU):处理数据,完成各种算术运算和逻辑运算。

计算机运算时,运算器的操作对象和操作种类由控制器决定。运算器操作的数据从内存中读取,处理的结果再写入内存(或暂时放在内部寄存器中),而且运算器对内存数据的读写是由控制器来进行的。

存储器(Memory):存储程序和各种数据。

  • 内部存储器(内存、主存):存取速度快,容量小价格高。用来存放即将执行的程序和数据,可供CPU直接读取。
    • 随机存储器(RAM):可以被CPU随机读取(读取任何一个地址数据的速度是一样的,写入任何一个地址数据的速度也是一样的),一般存放CPU将要执行的程序、数据,断电丢失
    • 只读存储器(ROM):只能被CPU读,不能轻易被CPU写用来存储永久性的程序和数据,比如:系统引导程序、监控程序等。掉电易失。
    • 高速缓存存储器(cache):Cache是计算机中的一个高速小容量存储器,其中存放的是CPU近期要执行的指令和数据,其存取速度可以和CPU的速度匹配,一般采用静态RAM充当Cache。
  • 外部存储器:存取速度慢。用来存放暂时不用的程序和数据,可以和内存交换数据,不需要依赖电来存储数据。如硬盘、光盘...

输入设备与输出设备:鼠标、键盘、显示器、打印机等

存储单元与输入输出设备要和中央处理器打交道的话离不开总线。所以他们的关系如下:

内存

我们的程序和数据都存储在内存,存储的区域是线性的。

在计算机数据存储中,存储数据的基本单位是字节(byte), 1字节 = 8 位(bit)。每个字节都对应一个内存地址。

内存的地址是从 0 开始编号的,然后自增排序,最后一个地址为内存总字节数-1,这种结构与程序中的数组类似,所以内存中读写任何一个数据的速度都是相同的。

中央处理器

中央处理器也就是CPU,32位和64位CPU的主要区别在于一次性能计算多少字节数据:

  • 32位CPU一次可以计算4个字节
  • 64位CPU一次可以计算8个字节

这里的32位和64位,通常称为CPU的位宽,代表的是CPU一次可以计算(运算)的数据量。

之所以CPU要这样设计,是为了能计算更大的数值,如果是8位CPU那么一次只能计算一个字节- 0~255范围内的数值,这样就无法完成1000*500的计算,为了能一次计算大数的运算,CPU需要支持多个byte一起计算,所以CPU位宽越大,可以计算的数值就越大,比如32位CPU能计算的最大整数是4294967295。

CPU内部还有一些组件,常见的有寄存器、控制单元和逻辑运算单元。其中,控制单元负责控制CPU的工作,逻辑运算单元负责计算,而寄存器可以分为多种类型,每种寄存器的功能不尽相同。

为什么有了内存还需要寄存器?

因为内存离CPU太远了,而寄存器就在CPU内,紧挨着控制单元和逻辑运算单元,速度会更快。

常见寄存器种类:

  • 通用寄存器,用来存放需要进行运算的数据,比如需要进行加和运算的两个数据
  • 程序计数器,用来存储CPU要执行的下一条指令[所在的内存地址],注意不是存储下一条要执行的指令,此时指令还在内存中,程序计数器只是存储了下一条指令[的地址]。
  • 指令寄存器,用来存放当前正在执行的指令,也就是指令本身,指令被执行完之前都存储在这里。

总线

总线是用于CPU和内存以及其他设备之间的同学,总线分为三种:

  • 地址总线,用于指定CPU将要操作的内存地址
  • 数据总线,用于读写内存的数据
  • 控制总线,用于发送和接收信号,比如中断、设备复位等信号

当CPU要读写内存数据的时候,一般需要通过下面这三个总线:

  • 首先要通过[地址总线]来指定内存的地址
  • 然后通过[控制总线]控制是读或写的命令
  • 最后通过[数据总线]来传输数据

线路位宽与CPU位宽

数据是如何通过线路传输的呢?其实是通过操作电压,低电压表示0,高电压表示1.

如果构造了 高低高 这样的电压,其实就是 101 二进制,十进制表示5,如果只有一条线路,就意味着每次只能传递1bit的数据,即0 或 1 ,那么传输 101 这个数据,就需要3次才能传输完成,这样效率非常低。

这样一位一位传输的方式,称为串行,下一个bit必须等待上一个bit传输完成才能进行传输。想一次传多一些数据,增加线路即可,这时数据就可以并行传输。

为了避免低效率的串行传输方式,线路的位宽最好一次能够访问到所有的内存地址。

CPU想要操作[内存地址]就需要[地址总线]:

  • 如果地址总线只有1条,那每次只能表示 [ 0 或 1]这两种地址,所以CPU能操作的内存地址最大数量为 2 个。(不能理解为同时操作两个内存地址)
  • 如果地址总线有2条,那么能表示00、01、10、11四种地址,所以CPU能操作的内存地址最大数量为 4 个

那么,想要CPU操作4G的内存,就需要 32条地址总线。 {2}^{32} = 4 * {2}^{10}*{2}^{10}*{2}^{10} = 4 G

CPU的位宽最好不要小于线路的位宽 ,比如32位CPU控制40位宽的地址总线和数据总线的话,工作起来会非常麻烦,所以32位的CPU最好和32位宽的线路搭配,因为32位CPU一次最多只能操作32位宽的地址总线和数据总线。

如果用32位CPU去加和两个64位大小的数字·,就需要把这两个64位的数字分成2个低位32位数字和2个高位32位数字来计算,先加两个低位的32位数字,算出进位,然后加和两个高位的32位数字,最后再加上进位就能算出结果了,可以发现32位CPU并不能一次性算出加和两个64位的数字的结果。

对于64位CPU就可以一次性算出加和两个64位数字的结果,因为64位CPU可以一次读入64位的数字,并且64位CPU内部的逻辑运算单元也支持64位数字的计算。

但是并不代表64位CPU性能比32位CPU高很多,很少应用需要算超过32位的数字,所以如果计算的数额不超过32位数字的情况下,32位和64位CPU之间没什么区别,只有当计算超过32位数字的情况下,64位的优势才能体现出来。

另外,32位CPU最大只能操作4GB内存,就算装了8GB的内存条,也没用。而64位CPU寻址范围则很大,理论最大寻址空间为{2}^{64}.


程序执行的基本过程

程序实际上是一条一条的指令,所以程序的运行过程就是把每一条指令一步一步的执行起来,负责执行指令的就是CPU。

 CPU执行程序的过程如下:

  1. CPU读取[程序计数器]的值,这个值是指令的内存地址,然后CPU的[控制单元]操作[地址总线]指定需要访问的内存地址,接着通知内存设备准备数据,数据准备好后通过[数据总线]将指令数据传给CPU,CPU收到内存传来的数据后,将这个指令数据存入到[指令寄存器]。
  2. [程序计数器]的值自增,表示指向下一个指令[地址]。这个自增的大小由CPU的位宽决定,比如32位的CPU,指令是4个字节,需要4个内存地址存放,因此[程序计数器]的值会加4。
  3. CPU分析[指令寄存器]中的指令,确定指令的类型和参数,如果是计算类型的指令,就把指令交给[逻辑运算单元]运算;如果是存储类型的指令,则交由[控制单元]执行。

总结:一个程序执行的时候,CPU会根据程序计数器的内存地址,从内存里面把需要执行的指令读到指令寄存器里面执行,然后根据指令长度自增,开始顺序读取下一条指令。

CPU从程序计数器读取指令、到执行、再到下一条指令,这个过程会不断循环,直到程序结束,这个不断循环的过程被称为CPU的指令周期


a = 1 + 2的具体执行过程

CPU是不认识 a = 1 + 2 这个字符串的,这些字符串只是方便我们认识,想要这段程序能跑起来,还需要把整个程序翻译成汇编语言的程序,这个过程被称为编译

除此之外,我们还需要用汇编器翻译成机器码,这些机器码由 0 和 1 组成机器语言,这一条条机器码,就是一条条的计算机指令,这个才是CPU认识的东西。

 a = 1 + 2 在32位CPU的执行过程。

程序编译过程中,编译器通过分析代码,发现 1 和 2 是数据,于是程序运行时,内存会有一个专门的区域来存放这些数据,这个区域就是[数据段]。

  • 数据1被存放到0x200位置
  • 数据2被存放到0x204位置

数据和指令是分开存放的,存放数据的区域称为[数据段],存放指令的区域称为[正文段]。

编译器会把 a = 1 + 2 翻译成 4 条指令,存放到正文段中。如图,这4条指令被存放到了0x100~0x10c的区域中:

  • 0x100的内容是 load 指令将0x200地址中的数据 1 装入到寄存器 R0
  • 0x104的内容是 load 指令将0x204地址中的数据 2 装入到寄存器 R1
  • 0x108的内容是 add 指令将寄存器 R0 R1 的数据相加,并把结果存放到寄存器 R2
  • 0x10c的内容是 store 指令将寄存器 R2 中的数据存回数据段中的0x208地址中,这个地址也就是变量 a 内存中的地址;

编译完成后,具体执行程序的时候,程序计数器会被设置为0x100地址,然后依次执行这4条指令。(上面的例子中,由于是在32位CPU执行的,因此指令是占32位大小,所以每条指令的地址隔4个字节。数据的大小事根据程序中指定的变量类型,比如 int 类型的数据占4个字节,char类型的数据占1个字节)


总结

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

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

  • 64位CPU可以一次计算超过32位的数字,而32位CPU如果要计算超过32位的数字,要分多步骤进行计算,效率就没那么高,但是大部分应用程序很少会计算那么大的数字,所以只有运算大数字的时候,64位CPU的优势才能体现出来,否则和32位CPU的计算性能相差不大
  • 通常来说64位CPU的地址总线是48位,而32位CPU的地址总线是32位,所以64位CPU可以寻址更大的物理内存空间。如果一个32位CPU的地址总线是32位那么该CPU的最大寻址能力是4G,即使使用8G大小的内存,也还是只能寻址到4G大小的地址,而如果一个64位CPU的地址总线是48位,那么该CPU的最大寻址范围是{2}^{48},远超于32位CPU的最大寻址能力。

32位软件和64位软件的区别?32位操作系统能够运行在64位电脑上吗?

64位和32位软件,实际上代表指令是64位还是32位:

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

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

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

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

相关文章

E2E工程问题:小周期转大周期Gateway

摘要: 本文讨论一个具体的工程问题,E2E报文对应的信号,由小周期转大周期导致的E2E校验失败问题。 工程中,网关节点很重要的一个功能就是路由。当然,E2E(End to End)报文也可路由,但…

webpack xxx is not a constructor

环境 webpack5.88.2 vue-router 按需引入 原因 模块循环引用导致 有A B C三个模块 A B模块import C 中导出的class c又依赖B 中Class 的方法 B 又依赖C中的class 此时会导致import 的 C 为undefined

求求你,别这样写简历,我要是HR连面试机会都不给你,别说我没告诉你!

前言 我作为部门的面试官,在此期间也收获了不少简历。但可惜的是,收到的简历数量虽多,但令人中意的却是凤毛菱角,一些应聘者倒不是因为自身能力不足而无法进入面试环节,而是简历本身就没有很好的展示出自己的能力&…

苍穹外卖 Spring Task 来单提醒 催单Apache ECharts day10~11

苍穹外卖-day10 课程内容 Spring Task订单状态定时处理WebSocket来单提醒客户催单 功能实现:订单状态定时处理、来单提醒和客户催单 订单状态定时处理: 来单提醒: 客户催单: 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供…

k8s中强制删除pv

K8s 集群内有一个已经不再使用的 PV,虽然已经删除了与其关联的 Pod 及 PVC,并对其执行了删除命令,但仍无法正常删除,一直处于 Terminating 状态: 解决办法: 1. 获取pv信息 kubectl get pv 2. 解除pv锁定 …

k8s: kubectl: logs: rotate 问题

https://kubernetes.io/docs/concepts/cluster-administration/logging/ 当kubenet存放container的日志满了的时候,会发生rotate,当rotate发生的时候,是由kubectl logs 这个命令可能会出现以下两个问题: https://github.com/kuber…

30-使用RocketMQ做削峰处理

1、增加排队功能的思路 在出票模块里,一个消费者拿到了某个车次锁,则该车次下所有的票都由他来出,一张一张的出,知道所有的订单都出完。 2、实现排队出票功能 2.1、 修改发送到MQ消息的内容 修改MQ消息内容,只需要通知出哪天和哪个车次的票(即:组成锁的内容),不需要…

网络安全系统中的守护者:如何借助威胁情报 (TI) 提高安全性

在这篇哈巴尔网站上的推文中,我们将解释 TI 缩写背后的含义、为什么需要它、Positive Technologies 收集哪些网络威胁数据以及如何帮助企业预防网络威胁。我们将以四种情况为例,说明公司如何使用 PT Threat Intelligence Feeds 来发现恶意活动并预防攻击…

2023-07-26 LeetCode每日一题(更新数组后处理求和查询)

2023-07-26每日一题 一、题目编号 2569. 更新数组后处理求和查询二、题目链接 点击跳转到题目位置 三、题目描述 给你两个下标从 0 开始的数组 nums1 和 nums2 ,和一个二维数组 queries 表示一些操作。总共有 3 种类型的操作: 操作类型 1 为 querie…

uni-app点击按钮弹出提示框(以弹窗的形式显示),选择确定和取消

学习目标: 学习目标如下所示: uni-app点击提交按钮后弹出提示框,(以弹窗的形式显示),提示用户是否确认提交(即确定和取消),点击确定后调用真正的提交方法,将数据传给后端…

进程虚拟地址空间区域划分

目录 图示 详解 代码段 备注:x86 32位linux环境下,进程虚拟地址空间区域划分 图示 详解 用户空间 用于存储用户进程代码和数据,只能由用户进程访问 内核空间 用于存储操作系统内核代码和数据,只能由操作系统内核访问 text t…

SpringBoot实战(二十三)集成 SkyWalking

目录 一、简介二、拉取镜像并部署1.拉取镜像2.运行skywalking-oap容器3.运行skywalking-ui容器4.访问页面 三、下载解压 agent1.下载2.解压 四、创建 skywalking-demo 项目1.Maven依赖2.application.yml3.DemoController.java 五、构建启动脚本1.startup.bat2.执行启动脚本3.发…

攻防世界-Reverse-re1

题目描述:菜鸡开始学习逆向工程,首先是最简单的题目 下载附件,执行程序,如下界面 1. 思路分析 没啥说的,既然题目都说是一道简单的逆向题,那么直接使用ida逆向即可,看逆向出的结果是否能写入到…

Cesium态势标绘专题-矩形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

tensorRT多batch动态推理

tensorRT的多batch推理,导出的onnx模型必须是动态batch,只需在导出的时候,设置一个dynamic_axis参数即可。 torch.onnx.export(hybrik_model, dummy_input, "./best_model.onnx", verboseTrue, input_namesinput_names, \output_…

【Vue3基础】组合事件配合v-model、watch的使用

一、需求描述 在组合事件中&#xff0c;实现在子事件输入框中输入使父事件实时显示输入内容 二、代码参考 1、关注文件&#xff0c;在App中嵌套Main&#xff0c;在Main中嵌套searchDemo 2、Main.vue文件 <template><h3>Main页面</h3><p>搜索内容为…

2023河南萌新联赛第(三)场:郑州大学(两个题目)

1.入门mex 重点 一些数字的mex是从0往上枚举&#xff0c;第一个没出现的数字。请你回答选最多k个数字&#xff0c;mex最大是多少 既然从0开始枚举&#xff0c;那么应该是最小&#xff0c;那么最大是什么&#xff1f; 经过自己的考虑&#xff0c;给出一个样例&#xff0c;0 1 1…

基于论文摘要的文本分类与关键词抽取(一)

基于论文摘要的文本分类与关键词抽取&#xff08;一&#xff09; 赛题介绍Baseline思路安装库并导入数据集下载并处理选择模型并训练提交结果 赛题介绍 基于论文摘要的文本分类与关键词抽取挑战赛 本任务分为两个子任务&#xff1a; 1.机器通过对论文摘要等信息的理解&#x…

empty module导致的lvs问题

write_verilog时-exclude empty_modules即可 这里也分享一下ICC2 write lvs netlist的命令 write_verilog -exclude {scalar_wire_declarations leaf_module_declarations empty_modules well_tap_cells filler_cells supply_statements} -hierarchy all -force_no_referenc…

电商小程序 留住用户秘诀

你是否也收到这样的用户反馈&#xff1f; 商品列表滚动区域太小&#xff0c;很难找到想要的商品。头部的搜索广告占据了半个屏幕&#xff0c;挤占了实际空间。在我手机这样小的屏幕上&#xff0c;展示区域太小了&#xff0c;能否把它放大点&#xff1f; 在电商页面中&#xff…