计算机基本硬件的内部结构

1.早期冯·诺依曼机结构

世界上第一台计算机ENIAC是使用手动接线来控制计算,十分麻烦。

冯·诺依曼提出“存储程序”的概念,是指将指令以二进制代码的形式事先输入计算机的主存储器(内存),然后按照其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。

于是第一台采用冯·诺依曼结构的计算机EDVAC诞生了,接下来让我们看看具体的冯·诺依曼计算机结构图(实线为数据线、虚线为控制线或反馈线):

在这里插入图片描述

输入设备将信息转化为机器能识别的形式,然后通过运算器的中转存入存储器,需要用到数据和程序时,就要经过运算器中转到输出设备,得出计算结果,而整个过程都是由控制器使用电信号来进行指挥的,另外这个控制器也会负责解析存储器里的存储指令。

另外,对于计算机系统来说,软件和硬件在逻辑上是等效的,例如:可以专门制作出一个乘法硬件(硬件),也可以利用现有的加法硬件实现乘法(软件)

冯·诺依曼计算机的特点:

  1. 计算机由五大部件组成

  2. 指令和数据化以同等地位存储在存储器里,可按地址寻址

  3. 指令和数据使用二进制表示。其中指令组成:操作码(指明指令的操作)、地址码(指明操作数据的内存地址)有的计算机指令采用多个地址码

  4. 整个体系以运算器为中心,以运算器为中转站,这样会导致数据计算效率降低(比如:输入设备本来是可以直接交给存储器的,但是却交给了运算器)

2.现代计算机体系结构

现代计算机有几个很不一样的特点

  1. 以存储器为中心

  2. 通常控制器和运算器被集成为一个CPU

在这里插入图片描述

因此我们可以改写一下结构,让这个体系变得更加模块化:
在这里插入图片描述

3.计算机硬件内部结构(现代)

3.1.主存储器

主存储器里用于存放数据的东西叫存储体

在这里插入图片描述

  1. 存储体内部可以分为一个一个“存储单光”,并且根据地址总线进行编址

  2. 每一个存储单元存储的二进制数据组合我们称为“存储字(word)”

  3. 存储单元存放二进制的最大长度称为“字长”,一般是8的整数倍。

  4. 用于存储二进制的电子元件简称“存储元”,利用电容的原理,每个存储元可存1bit,而存储单元由若干个存储元构成

主存储器内部还有两个寄存器

  1. 分别是MAR(存储地址寄存器)、MDR(存储数据寄存器)

  2. 主存储器里的控制逻辑会根据MAR存储的地址查找主存储器里的数据,然后取出存放到MDR中,而CPU就可以从这里拿走数据。

  3. 同理,CPU写入主存储器的方式也和读取类似:CPU想要写入的对应地址放在MAR里,想要写入的数据放在MDR里,最后通过控制总线告诉主存储器本次为写操作。

MAR是里有指向存储单元的地址,因此MAR反映存储单元的个数

MDR是有由要存储到MAR指向地址的数据内容,反映存储单元的存储字长

3.2.运算器

运算器是用于实现算术运算和逻辑运算的,内部有:

  1. ACC累加器:实际是一个寄存器,用于存放操作数或运算结果

  2. MQ乘商寄存器:在乘、除运算的时候,用于存放操作数或运算结果

  3. X通用寄存器:通用的操作数寄存器,用于存放操作数

  4. ALU算术逻辑单元:通过内部复杂的电路实现算术运算、逻辑运算,是运算器的核心部件,制作成本也是最高的。

ACC被加数、和被减数、差乘积高位被除数、余数
MQ乘数、乘积低位
X加数减数被乘数除数

在这里插入图片描述

乘积的高位表示了乘法结果的较高位数部分,而乘积的低位表示了较低位数部分。

3.3.控制器

控制器内部有:

  1. CU控制单元(Control Unit):分析指令,给出控制信号,内部有很复杂的电路,是控制器内最核心的部件

  2. IR指令寄存器(Instruction Register):本质是一个寄存器,存放当前执行的指令

  3. PC程序计数器(Program Counter):本质是一个寄存器,存放下一条指令地址,有自动+1的功能

在这里插入图片描述

在控制器内部的工作逻辑是:PC取得指令->IR分析指令->CU执行指令,前面两个过程为“取指阶段”,后面一个过程为“执行阶段”

4.计算机硬件协调流程(现代)

下面是高级语言C语言的一段代码:

int a = 2, b = 3, c = 1, y = 0; 
int main() 
{y = a * b + c; return 0; 
}

接下来让我们看看这段代码在计算机硬件中运作流程:

在这里插入图片描述

4.1.执行指令0

  1. (PC)=0,(PC)++CPU内部的PC存储的是下一条指令的地址,因此PC=0,即:PC存储了第一条指令的代码地址,在执行后续的步骤后PC自动+1(PC是程序计时器,可以存放下一条指令地址,有自动+1的功能)

  2. (PC)->MAR,(MAR)=0,(MAR)->存储体->MDR,(MDR)=0000 01|00 0000 0101PC将指令地址交给MARMAR通过这个指令地址在存储体内部查找指令数据,存储到MDR

  3. (MDR)->IR:从MDR得到的指令数据存放到IR中(IR负责存放当前执行的指令)

  4. (IR)->CU,(IR)->MAR,(MAR)->存储体->MDR,(MDR)=0000 0000 0000 0010=2:而在当前要执行的指令中,前六位0000 01操作码会被送到CU分析,得知这是“取数dACC”的命令,后10位代表这个数的地址在主存储器存储体的5处。因此IR把后续的10位交给MARMAR再去存储体内找主存地址5处的a的数据0000 0000 0000 0010=2存入MDR中(CU控制单元负责分析指令,给出控制信号)

  5. (MDR)->ACC:因此0000 0000 0000 0010=2被拷贝到IR内部,然后CU控制MDR送到ACC

4.2.执行指令1

根据“4.1.执行指令0”中的步骤1,OP(PC)=1,(ACC)=2,然后就会发生:

  1. (PC)=1,(PC)->MAR,(MAR)=1,(MAR)->存储体->MDR,(MDR)=0000 01|00 0000 0101,(PC)++PC内部存储了当前要第二条指令的地址,在执行了后续的步骤了+1,然后MAR得到的指令地址是“1”,传递给MAR后,MAR在存储体中找到指令0000 01|00 0000 0101

  2. (MDR)->IR,(IR)->CU,(IR)->MAR,(MAR)->存储体->MDR,(MDR)=0000 0000 0000 0011=3:接下来MDR将内部的指令传给IRIR交给CU分析后得知前六位0001 00为“乘法操作,将ab并且存储到ACC中” ,后10位00 0000 0101为操作数地址,于是这个地址就被IP传给MAR在存储体中找到并且存储给MDR

  3. (MDR)->MQ,(MQ)=0000 0000 0000 0011=3:接下来CU控制MDR内部的数据拷贝到MQMQ乘商寄存器:在乘、除运算的时候,用于存放操作数或运算结果,这里是存储了乘数b

  4. (ACC)->X,(X)=0000 0000 0000 0010=2,ALU->(X)*(MQ)->ACC,(ACC)=6CU控制ACC里的值拷贝到通用寄存器X里,然后控制ALU把通用寄存器X里的值和乘商寄存器MQ里的值相乘,然后存储到ACC中(如果乘积太大,MQ也会辅助存储,存储的是乘积低位,ACC那边则是乘积高位)

4.3.执行指令2

根据“4.2.执行指令1”中的步骤1,OP(PC)=2,(ACC)=6,然后就会发生:

  1. (PC)->MAR,(MAR)=2,(MAR)->存储体->MDR,(MDR)=0000 11|0000 0000 0000 0111,(PC)++PC将指令地址拷贝给MARMAR在存储体内查找到指令,拷贝给MDR,然后PC内部的计时器+1,存储了指向下一条指令的地址

  2. (MDR)->IR,(IR)->CU,(IR)->MAR,(MAR)=0000 0000 0000 0111=7,(MAR)->存储体->MDR,MDR=0000 0000 0000 0001=1:MDR内部的指令值拷贝给IRIR传递给CU分析指令,得知0000 11为“加法指令ab+c,并且最终存储在ACC中”,于是CU控制IR剩下的0000 0000 0000 0111,传递给MARMAR在存储体内找到指令数据0000 0000 0000 0001,传递给MDR

  3. (MDR)->X,(x)=0000 0000 0000 0001=1,ALU->(ACC)+(X)->ACC:然后MDR将内部数据拷贝到通用寄存器X内,接下来控制单元CUALU发生信号,让XACC里的值相加,最后存储到ACC内部

4.4.执行指令3

根据“4.3.执行指令3”中的步骤1,OP(PC)=3,(ACC)=7,然后就会发生:

  1. (PC)->MAR,(MAR)=3,(MAR)->存储体->MDR,(MDR)=0000 10|0000 0000 0000 1000,(PC)++

  2. (MDR)->IR,(IR)->CU,(IR)->MAR,(MAR)=0000 0000 0000 1000=8,(MAR)->存储体->MDR,MDR=0000 0000 0000 0000=0

  3. (ACC)=7,(ACC)->MDR,(MDR)=7,(MAR)=0000 0000 0000 1000=8:这里就有个地方需要注意,CU控制了ACC寄存器的值拷贝到MDR,此时MAR也有y变量的主存地址,此时CU再控制MARMDRab+c存入y

4.5.执行指令4

根据“4.4.执行指令4”中的步骤1,OP(PC)=4,然后像上面一样类似的流程,取得000110停机指令,接下来就会执行操作系统的相关指令了,这后面的我们不再讨论。

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

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

相关文章

c++ ,vs2019, cpp20规范之 forward_list 源码分析

通过阅读源码可知,该单向链表不像list双向链表那样有专门的前导节点。即list._Mypair._Myval2._head._next才指向第一个有效数据节点。而 forward_list ._Mypair._Myval2._head 已经指向了有效数据节点。原因就在于复杂巧妙的类型转换。如下图的构造函数里&#xff…

X86、X64和ARM

一、X86、X64架构 X86架构和X64架构(也称为x86-64、AMD64或Intel 64)都是计算机处理器架构的名称,它们都属于x86家族的一部分。这些架构主要用于描述计算机中处理器的指令集和寻址能力。 X86架构 X86指的是支持32位的指令集架构处理器&…

【Matlab】基于长短期记忆网络的时间序列预测(Excel可直接替换数据)

【Matlab】基于长短期记忆网络的时间序列预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码6.完整代码7.运行结果1.模型原理 "基于长短期记忆网络(Long Short-Term Memory, LSTM)的时间序列预测"是一种使用LSTM神经网络来预测时间…

Spring-ApplictionContext

Spring Spring是整个Java体系最核心的框架,没有之一。 核心类图结构 ApplicationContext ApplicationEventPublisher:提供了一种机制,用于通知应用程序中感兴趣的部分有关其执行过程中发生的特定事件。ListableBeanFactory:是S…

python结合tesseract-ocr识别汉字的训练库过程

一、安装python 例如,安装路径为:C:\rtkapp\python-3.8.0 二、安装opencv 三、安装tesseract-ocr 安装完成后,在系统环境变量path中,添加安装路径C:\rtkapp\Tesseract-OCR 四、打开python安装pytesseract 五、安装java运行环境…

测试开源C#人脸识别模块ViewFaceCore(5:质量检测和眼睛状态检测)

ViewFaceCore模块中的FaceQuality支持预测人脸质量,最初以为是预测人体体重,实际测试过程中才发现是评估人脸图片质量,主要调用Detect函数执行图片质量检测操作,其函数原型如下所示: //// 摘要:// 人脸质量评估///…

Qt+OpenCV+VTK在VS2017中配置路径

QtOpenCVVTK在VS2017中配置路径 《Qt环境配置》《OpenCV环境配置》《VTK环境配置》 《Qt环境配置》 包含目录: D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include\QtWidgets D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include…

[containerd] 初始化流程概览

1. 环境 containerd版本:v1.7.2,containerd debug搭建教程链接操作系统:Ubuntu22.04 2. 初始化流程 containerd的入口为:cmd/containerd/main.go,如下: func main() {// TODO 实例化containerdapp : com…

webstorm配置less转译

Program中路径如果识别不到 项目文件\node_modules.bin\lessc

springCloud Eureka注册中心配置详解

1、创建一个springBoot项目 2、在springBoot项目中添加SpringCloud依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.3</version><type>…

【MySQL数据库备份】

目录 一、概述 二、数据备份的重要性 1. 数据保护 2. 灾难恢复 3. 数据完整性 4. 合规性要求 三、造成数据丢失的原因 1. 硬件故障 2. 人为错误 3. 黑客攻击 4. 自然灾害 5. 软件故障 四、备份类型 1.物理与逻辑角度 1.1 概念 1.2 物理备份 1.2.1 冷备份 1.2…

建造者模式

1.概念 建造者模式是一种创建型设计模式&#xff0c;它允许我们一步一步的来构造对象&#xff0c;其实就是将创建对象的一个过程拆分成了很多个小步骤&#xff0c;常见主要是在一个A类的基础上&#xff0c;加多一个Builder的类&#xff0c;然后属性和A类的一样&#xff0c;我们…

gdb调试时查看汇编代码

在gdb中查看汇编代码&#xff0c;可以使用display命令或x命令。 以下是一个示例程序&#xff0c;我们以它为例来演示如何在gdb中查看汇编代码。 #include <stdio.h> int main() { int a 10; int b 20; int c a b; printf("c %d\n", c); return 0;…

Flutter:滑动面板

前言 无意中发现了这个库&#xff0c;发现现在很多app中都有类似的功能。以手机b站为例&#xff0c;当你在看视频时&#xff0c;点击评论&#xff0c;视频会向上偏移&#xff0c;下方划出评论界面。 sliding_up_panel SlidingUpPanel是一个Flutter插件&#xff0c;用于创建滑…

Stable Diffusion 硬核生存指南:WebUI 中的 VAE

本篇文章聊聊 Stable Diffusion 生态中呼声最高、也是最复杂的开源模型管理图形界面 “stable-diffusion-webui” 中和 VAE 相关的事情。 写在前面 Stable Diffusion 生态中有一个很重要的项目&#xff0c;它对于 SD 生态繁荣做出的贡献可以说居功至伟&#xff0c;自去年八月…

13. Mybatis-Plus

目录 1. MyBatis-Plus 简介 2. 新建项目 3. 添加依赖 4. 配置数据库 5. 编码 1. MyBatis-Plus 简介 通过官网&#xff1a;MyBatis-Plus MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyB…

W2NER详解

论文&#xff1a;https://arxiv.org/pdf/2112.10070.pdf 代码&#xff1a;https://github.com/ljynlp/W2NER 文章目录 W2NER介绍模型架构解码 源码介绍数据输入格式模型代码 参考资料 W2NER 介绍 W2NER模型&#xff0c;将NER任务转化预测word-word&#xff08;备注&#xff…

Gateway结合nacos(lb://xxx)无效问题

Gateway结合nacos无效 版本如下&#xff1a; com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0.1.0 org.springframework.cloud:spring-cloud-starter-gateway:3.1.1 配置如下&#xff1a; server:port: 7000 spring:application:name: springCloudGa…

微信小程序生成带参数的二维码base64转png显示

getQRCode() {var that this;wx.request({url: http://localhost:8080/getQRCode?ID 13,header: {content-type: application/json},method: POST,responseType: arraybuffer,//将原本按文本解析修改为arraybuffersuccess(res) {that.setData({getQRCode: wx.arrayBufferToB…

django Ajax--前后端数据交互

一.Django的Ajax和JavaScript的Ajax Django的Ajax和JavaScript的Ajax实质上是指同一种技术&#xff0c;即异步JavaScript和XML&#xff08;Asynchronous JavaScript and XML&#xff09;。它允许在不刷新整个页面的情况下&#xff0c;通过前后端之间的异步交互来获取或发送数据…