计算机里基本硬件的组成以及硬件协同

news/2024/4/29 10:15:42/文章来源:https://blog.csdn.net/qq_56870066/article/details/131985244

文章目录

    • 冯·诺依曼体系
    • 输入设备
    • 输出设备
    • 存储器
    • 运算器
    • 控制器
    • 协同工作的流程

冯·诺依曼体系

世界上第一台通用计算机,ENIAC,于1946年诞生于美国一所大学。
ENIAC研发的前期,需要工作人员根据提前设计好的指令手动接线,以这种方式输入指令给计算机。显然,这种方式程序运行的效率受人工的影响,大部分时间消耗在人工手动接线上面。

ENIAC研发的中期,冯诺依曼加入研发小组。此后,三位大佬(包括冯诺依曼在内)基于对ENIAC的改进,研发了EDVAC机,冯诺依曼在研发EDVAC机时提出了“存储程序”的思想, 奠定了现代计算机的基本结构。

存储程序:将事先编制好的程序和数据送入主存才能执行,一旦程序被启动执行,就无需操作人员的干预,计算机会自动逐条执行指令,直至程序执行结束

这个时候就不需要人工手动接线输入指令了,从而提升了效率。以这种概念为基础的计算机我们把它叫做冯·诺依曼机。冯·诺依曼体系结构如下图:
在这里插入图片描述
其特点

  1. 采用“存储程序”的方式
  2. 计算机硬件系统由运算器、控制器、存储器(主、外)、输入设备、输出设备五大部件组成
  3. 指令和数据以同等地位保存在存储器里,均用二进制表示,计算机可以区分。
  4. 指令由操作码地址码组成,操作码指出操作的类型,地址码指出操作数的地址。

输入设备

输入设备的任务:用来接收原始内容,然后把程序和数据转换为计算机能够接受和识别的形式输入计算机。

例如:

  • 键盘
  • 鼠标

输出设备

输出设备的任务:将计算机内经过计算机处理的结果转换为我们能看懂的形式输出。

例如:

  • 显示屏
  • 打印机

存储器

存储器分为主存储器辅助存储器,主存储器又可以叫做内存储器,也就是我们平时经常提到的内存。主存储器 + CPU就构成了主机,和我们小时候提到的主机是不一样的。辅助存储器又可以叫做外存储器,磁盘是最常见的外存储器。
在这里插入图片描述

主存储器我们可以把它想象成一个非常大的中药柜子 + 取药、放药的柜台
在这里插入图片描述
主存储器的存储体 相当于 这个大中药柜子。
存储体由许多存储单元组成,存储单元相当于中药柜子里的一个个小柜子。
存储单元包含若干存储元件,每个存储元件存储一个二进制位。相当于一个小柜子里有若干的空间,每一个空间可以放一个草药(我把它抽象过度了🤗)

一个存储单元里可以放一串二进制代码,这串代码我们呢把它叫做存储字,这串代码的位数为存储字长。存储字长就相当于小柜子里放了多少个草药。存储字长, 一个字只能是1字节,或者1字节的偶数倍

现在来模拟主存储器的工作方式:
取数据的过程:

  • CPU把它需要的数据地址,放到地址寄存器MAR里面。
  • 主存储器根据地址寄存器里面的地址,去存储体内找数据
  • 主存储器将数据,存入数据寄存器MDR,等待CPU来获取。

存数据的过程

  • CPU把要存入的数据,放到数据寄存器MDR里
  • CPU把地址(它想把数据放在哪一个位置的地址),放入地址寄存器MAR
  • 主存储器根据地址寄存器MAR里的地址,将数据寄存器MDR里的数据放入存储体。

主存储器存取数据的方式,很容易联想到实际例子。
在这里插入图片描述
以中医师徒为例,类比主存储器取数据的过程。徒弟负责打杂,例如师傅想要柜子里的草药—党参,师傅就把党参的位置写在纸条上,然后徒弟根据纸条上的位置,去柜子里找,找到了就把党参放在柜台上,等待师傅拿就可以了。

现代计算机,地址寄存器MAR和数据寄存器MDR是放在CPU里面的。


CPU中的运算器和控制器,在"运算器"和"控制器"里并不讲解它们的工作原理,只介绍它们的基本部件,工作原理在“工作流程”中结合进行介绍。

运算器

运算器是用来进行算术运算和逻辑运算的。
在这里插入图片描述
算术运算,例如加、减、乘、除
逻辑运算,例如

  • 异或
  • 移位

运算器的核心是算术逻辑单元,简称ALU。运算器里面有三个寄存器是必须存在的,分别是累加器ACC、乘商寄存器MQ和通用的操作数寄存器X。用于暂时存放操作数和中间结果。

  • 累加器ACC。存放操作数和运算结果
  • 乘商寄存器MQ。在乘、除运算时,存放操作数和运算结果
  • 操作数寄存器X。通用的操作数寄存器,存放操作数和运算结果。

控制器

控制器相当于指挥中心。
在这里插入图片描述
程序计数器PC,存放当前想要执行的指令的地址。具备自动加1的功能,当PC里面的指令被取出来以后,PC里放下一条将要执行指令的地址。

指令寄存器IR,当PC把地址放到地址寄存器MAR里,主存储器就把该地址上的指令取出,放到数据寄存器MDR里,指令寄存器IR的内容来自MDR放的是当前的指令。

指令由操作码和地址码组成,指令寄存器IR里的指令,的操作码,被送入控制单元CU用于分析指令并发出命令;而指令的地址码又被送入地址寄存器MAR里,用于取操作数的数据。
在这里插入图片描述
指令和数据在指令周期的不同阶段,所以CPU能够区分指令和数据。


协同工作的流程

#include <iostream>
int main(void){int a = 2, b = 3, c = 1, y = 0;y = a * b + c;return 0;
}

上述文件经历预处理编译汇编链接四个大步骤,最终形成一个可执行文件。汇编阶段,汇编器会把程序翻译成机器语言指令,也就是二进制代码。可执行文件里的内容就是由上述步骤转化而来的二进制。


现在以该可执行文件演绎一部分过程。要执行该文件时,先将它的代码和数据加载到内存里面,并且把第一条指令的地址写入程序计数器PC中
在这里插入图片描述
第一条指令周期:
(1)(PC)->MAR 。PC程序计数器里的地址通过地址总线,输入到地址寄存器MAR里,主存储器收到CPU发送的读信号
(2)M(MDR)->MDR。从存储体内拿到指令, 放入数据寄存器MDR。此时MDR里的数据为000001 0000000101
(3)MDR->IR。将MDR里的指令通过数据总线给指令寄存器,IR = 000001 0000000101,指令由操作码和地址码组成。
(4)OP(IR)。IR里的指令,的操作码给控制单元CU,CU对操作码分析,得到这是一个取数指令
(5)AD(IR)。IR里的指令,的地址码继续给地址寄存器MAR,(MAR) = 5;
(6)主存储器根据地址码为5,去5地址取出数据,MDR = 0000000000000010 = 2
(7)将MDR里的数据,放入运算器里的累加器ACC = 2

(1)~(3)是取指令,取完指令后,程序计数器PC自动+1,现在PC里面保存的是地址1
(4)分析指令
(5)~(7)执行取数指令。

第二条指令周期:
(1)将程序计数器PC里的指令地址,通过地址总线,送入地址寄存器MAR内, (MAR)= 1
(2)主存储器根据地址找到指令,将指令放到数据寄存器MDR,此时MDR = 000100 0000000110
(3)将MDR里的指令,通过数据总线,送入指令寄存器IR,IR = 000100 0000000110
(4)IR内,指令的操作码送入控制单元CU,CU分析指令,这是 “乘法”指令
(5)IR内,指令的地址码送入地址寄存器MAR,此时(MAR)= 0000000110 = 6
(6)主存储器取出地址为6的数据0000000000000011 ,(MDR) = 0000000000000011 = 3
(7)将数据寄存器MDR里的数据,通过数据总线,送入运算器里的乘商寄存器MQ里, 此时(MQ) = 0000000000000011 = 3
(8)累加器ACC里的数据放入通用的操作数寄存器X里面。此时(x) = 2
(9)由算术逻辑单元ALU执行乘法运算,得到6,放入累加器ACC里面,此时(ACC)=6,如果乘积太大,就需要乘商寄存器MQ来辅助。

第三条指令周期:



综上,CPU工作的流程就是:取指令 ===>> 分析指令 ===>>执行指令。这种方式叫做流水线。还有一种机制比流水线要好得多,叫做超标量CPU。你可以这样理解,就是设计了一种机制,使得CPU的工作“超标量”了,把超标量理解为生活上的超标量就行。那么这种让CPU超标量的机制是如何的呢?
在这里插入图片描述
这种设计中,多了一个保持缓冲区。把多个指令同时取出并进行解码,放入保持缓冲区内,如果执行单元有“在偷懒的”(保持缓冲区内还有可处理的指令,但是执行单元有空闲),就从保持缓冲区取出并且执行。缺点在于:从保持缓冲区取出的指令,极大可能不按原来的顺序执行,这个应该比较好理解。

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

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

相关文章

【HDFS】Block、BlockInfo、BlockInfoContiguous、BlockInfoStriped的分析记录

本文主要介绍如下内容: 关于几个Block类之间的继承、实现关系;针对文章标题中的每个类,细化到每个成员去注释分析列出、并详细分析BlockInfo抽象类提供的抽象方法、非抽象方法的功能针对几个跟块组织结构的方法再进行分析。moveBlockToHead、listInsert、listRemove等。一、…

spring5源码篇(13)——spring mvc无xml整合tomcat与父子容器的启动

spring-framework 版本&#xff1a;v5.3.19 文章目录 整合步骤实现原理ServletContainerInitializer与WebApplicationInitializer父容器的启动子容器的启动 相关面试题 整合步骤 试想这么一个场景。只用 spring mvc&#xff08;确切来说是spring-framework&#xff09;&#x…

MySQL 实现分库和分表的备份 2023.7.29

1、分库备份 [rootlocalhost mysql-backup]# cat db_bak.sh #!/bin/bash k_userroot bak_password123456 bak_path/root/mysql-backup/ bak_cmd"-u$bak_user -p$bak_password" exc_db"Database|information_schema|mysql|performance_schema|sys" dbname…

C#,数值计算——对数正态分布(logarithmic normal distribution)的计算方法与源程序

对数正态分布&#xff08;logarithmic normal distribution&#xff09;是指一个随机变量的对数服从正态分布&#xff0c;则该随机变量服从对数正态分布。对数正态分布从短期来看&#xff0c;与正态分布非常接近。但长期来看&#xff0c;对数正态分布向上分布的数值更多一些。 …

基于minio的dababend部署总结

Databend 是一款开源、弹性、低成本&#xff0c;基于对象存储也可以做实时分析的新式数仓。期待您的关注&#xff0c;一起探索云原生数仓解决方案&#xff0c;打造新一代开源 Data Cloud。 Minio搭建 minio 192.168.10.159 cd /data mkdir minio cd minio wget https://dl…

word2vec原理总结

参考文章&#xff1a;https://www.cnblogs.com/pinard/p/7160330.html word2vec是google在2013年推出的一个NLP工具&#xff0c;它的特点是将所有的词向量化&#xff0c;这样词与词之间就可以定量的去度量他们之间的关系&#xff0c;挖掘词之间的联系。 1 词向量编码 1.1 one…

Unity源码分享-黄金矿工游戏完整版

Unity源码分享-黄金矿工游戏完整版 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88118933

Python-Python基础综合案例--数据可视化 - 地图可视化

版本说明 当前版本号[20230729]。 版本修改说明20230729初版 目录 文章目录 版本说明目录知识总览图Python基础综合案例--数据可视化 - 地图可视化基础地图使用案例效果视觉映射器 疫情地图-国内疫情地图案例效果实操设置全局配置选项 疫情地图-省级疫情地图案例效果实操 知…

如何做好IT类的技术面试

目录 一、IT行业的招聘渠道 二、如何做好技术面试官 三、谈谈IT行业如何做好招聘工作 四、面试IT公司的小技巧 五、面试有哪些常见的问题 六、关于面试的一些建议 面试可能是我们每个人都必须会遇到的事情&#xff0c;而技术面试更具有专业性&#xff0c;以下会从几个方面…

IDEA将本地项目上传到码云

一、创建本地仓库并关联 用IDEA打开项目&#xff0c;在菜单栏点击vcs->create git repository创建本地仓库&#xff0c; 选择当前项目所在的文件夹当作仓库目录。 二、将项目提交本地仓库 项目名右键就会出现“GIT”这个选项->Add->Commit Directory, 先将项目add…

sql server表值函数

一、创建测试表 Employees 二、创建表值函数 -- DROP FUNCTION TableIntSplit;CREATE FUNCTION TableIntSplit(Text NVARCHAR(4000),Sign NVARCHAR(4000)) RETURNS tempTable TABLE(Id INT ) AS BEGIN DECLARE StartIndex INT DECLARE FindIndex INT DECLARE Content VARCHAR(…

玩转Tomcat:从安装到部署

文章目录 一、什么是 Tomcat二、Tomcat 的安装与使用2.1 下载安装2.2 目录结构2.3 启动 Tomcat 三、部署程序到 Tomcat3.1 Windows环境3.2 Linux环境 一、什么是 Tomcat 一看到 Tomcat&#xff0c;我们一般会想到什么&#xff1f;没错&#xff0c;就是他&#xff0c;童年的回忆…

操作系统攻击:早期WindowsMS10-046漏洞

目录 概述 漏洞成因 利用过程 漏洞复现 漏洞修复 概述 本次介绍早期的windows高危漏洞——MS10_046_SHORTCUT_ICON_DLLLOADER &#xff0c; 该漏洞可以通过浏览器跳转网络资源的方式利用&#xff0c;结合xss攻击用户的系统 危险性极高。 漏洞成因 漏洞成因&#xff1a; m…

17-C++ 数据结构 - 栈

&#x1f4d6; 1.1 什么是栈 栈是一种线性数据结构&#xff0c;具有后进先出&#xff08;Last-In-First-Out&#xff0c;LIFO&#xff09;的特点。可以类比为装满盘子的餐桌&#xff0c;每次放盘子都放在最上面&#xff0c;取盘子时也从最上面取&#xff0c;因此最后放进去的盘…

maven引入本地jar包的简单方式【IDEA】【SpringBoot】

前言 想必点进来看这篇文章的各位&#xff0c;都是已经习惯了Maven从中央仓库或者阿里仓库直接拉取jar包进行使用。我也是&#x1f921;&#x1f921;。 前两天遇到一个工作场景&#xff0c;对接三方平台&#xff0c;结果对方就是提供的一个jar包下载链接&#xff0c;可给我整…

RustDesk 1.2 现已发布

RustDesk 1.2 现已发布&#xff0c;此版本采用 Flutter 重写桌面版本&#xff0c;支持 Wayland 被控。 一些值得关注的变化有&#xff1a; 用 Flutter 重写支持 ipv6&#xff08;Beta&#xff09;增加一次性密码QuickSupport &#xff08;Beta&#xff09;硬件编解码器 H264 /…

51单片机——串行口通信

目录 1、51单片机串口通信介绍 2、串行口相关寄存器 2.1 、串行口控制寄存器SCON和PCON 2.1.1 SCON&#xff1a;串行控制寄存器 (可位寻址) 2.1.2 PCON&#xff1a;电源控制寄存器&#xff08;不可位寻址&#xff09; 2.2、串行口数据缓冲寄存器SBUF 2.3、从机地址控制…

关于element ui 安装失败的问题解决方法、查看是否安装成功及如何引入

Vue2引入 执行npm i element-ui -S报错 原因&#xff1a;npm版本太高 报错信息&#xff1a; 解决办法&#xff1a; 使用命令&#xff1a; npm install --legacy-peer-deps element-ui --save 引入&#xff1a; 在main.js文件中引入 //引入Vue import Vue from vue; //引入…

ubuntu23.04 flush DNS caches

如何在Ubuntu 23.04中刷新DNS缓存 现在&#xff0c;如果你运行的是Ubuntu 23.04&#xff0c;"系统解决 "的方法将不再适用于你。让我们检查一下你目前的缓存大小。打开你的Ubuntu终端&#xff0c;运行以下command&#xff1a; resolvectl statistics现在&#xff0c…

Android Unit Test

一、测试基础知识 1.1 测试级别 测试金字塔&#xff08;如图 2 所示&#xff09;说明了应用应如何包含三类测试&#xff08;即小型、中型和大型测试&#xff09;&#xff1a; 小型测试是指单元测试&#xff0c;用于验证应用的行为&#xff0c;一次验证一个类。 中型测试是指…