计算机里基本硬件的组成以及硬件协同
文章目录
- 冯·诺依曼体系
- 输入设备
- 输出设备
- 存储器
- 运算器
- 控制器
- 协同工作的流程
冯·诺依曼体系
世界上第一台通用计算机,ENIAC,于1946年诞生于美国一所大学。
ENIAC研发的前期,需要工作人员根据提前设计好的指令手动接线,以这种方式输入指令给计算机。显然,这种方式程序运行的效率受人工的影响,大部分时间消耗在人工手动接线上面。
ENIAC研发的中期,冯诺依曼加入研发小组。此后,三位大佬(包括冯诺依曼在内)基于对ENIAC的改进,研发了EDVAC机,冯诺依曼在研发EDVAC机时提出了“存储程序”的思想, 奠定了现代计算机的基本结构。
存储程序:将事先编制好的程序和数据送入主存才能执行,一旦程序被启动执行,就无需操作人员的干预,计算机会自动逐条执行指令,直至程序执行结束。
这个时候就不需要人工手动接线输入指令了,从而提升了效率。以这种概念为基础的计算机我们把它叫做冯·诺依曼机。冯·诺依曼体系结构如下图:

其特点
- 采用“存储程序”的方式
- 计算机硬件系统由运算器、控制器、存储器(主、外)、输入设备、输出设备五大部件组成
- 指令和数据以同等地位保存在存储器里,均用二进制表示,计算机可以区分。
- 指令由操作码和地址码组成,操作码指出操作的类型,地址码指出操作数的地址。
输入设备
输入设备的任务:用来接收原始内容,然后把程序和数据转换为计算机能够接受和识别的形式输入计算机。
例如:
- 键盘
- 鼠标
输出设备
输出设备的任务:将计算机内经过计算机处理的结果转换为我们能看懂的形式输出。
例如:
- 显示屏
- 打印机
存储器
存储器分为主存储器和辅助存储器,主存储器又可以叫做内存储器,也就是我们平时经常提到的内存。主存储器 + 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超标量的机制是如何的呢?

这种设计中,多了一个保持缓冲区。把多个指令同时取出并进行解码,放入保持缓冲区内,如果执行单元有“在偷懒的”(保持缓冲区内还有可处理的指令,但是执行单元有空闲),就从保持缓冲区取出并且执行。缺点在于:从保持缓冲区取出的指令,极大可能不按原来的顺序执行,这个应该比较好理解。
相关文章:
计算机里基本硬件的组成以及硬件协同
文章目录 冯诺依曼体系输入设备输出设备存储器运算器控制器协同工作的流程 冯诺依曼体系 世界上第一台通用计算机,ENIAC,于1946年诞生于美国一所大学。 ENIAC研发的前期,需要工作人员根据提前设计好的指令手动接线,以这种方式输入…...
2023软件设计师中级备考经验分享(文中有资料链接分享)
先摊结论吧,软考中级设计师备考只是备考半个月(期间还摆烂了几天),然而成绩如下: 我自己都没想到会这么好的成绩。。。 上午题:推荐把软考通APP里的历年真题刷3-4遍,直接刷真题,然后…...
Windows 10 中无法最大化任务栏中的程序
方法1:仅选择选项 PC 屏幕 如果您使用双显示器,有时这可能会发生在您的 1 台计算机已插入但您正在访问的应用程序正在另一台计算机上运行的情况下,因此您看不到任何选项。因此,请设置仅在主计算机上显示显示的 PC 屏幕选项。 第…...
【iOS】KVOKVC原理
1 KVO 键值监听 1.1 KVO简介 KVO的全称是Key-Value Observing,俗称"键值监听",可以用于监听摸个对象属性值得改变。 KVO一般通过以下三个步骤使用: // 1. 添加监听 [self.student1 addObserver:self forKeyPath:"age"…...
当机器人变硬核:探索深度学习中的时间序列预测
收藏自:Wed, 15 Sep 2021 10:32:56 UTC 摘要:时间序列预测是机器学习和深度学习领域的一个重要应用,它可以用于预测未来趋势、分析数据模式和做出决策。本文将介绍一些基本概念和常用方法,并结合具体的案例,展示如何使…...
C# Solidworks二次开发:自动创建虚拟零件及使用注意事项
今天要讲的是关于在solidworks中如何自动创建虚拟零件的功能,也就是solidworks中插入新零件这个功能。 实现这个功能需要使用的API如下所示: InsertNewVirtualPart(swFaceOrPlane1, out swcomp2); 其中这个方法中使…...
vim工具 windows系统使用
vim常用命令: 编辑–>输入: i: 在当前光标所在字符的前面,转为输入模式; 粘贴命令 p p: 如果删除或复制为整行内容,则粘贴至光标所在行的下方,如果复制或删除的内容为非整行,则粘贴至光标所…...
Tesseract开源的OCR工具及python pytesseract安装使用
一 、介绍 Tesseract是一款由Google赞助的开源OCR。 pytesseract是python包装器,它为可执行文件提供了pythonic API。 Tesseract 已经有 30 年历史,开始它是惠普实验室的一款专利软件,在2005年后由Google接手并进一步开发和完善。Tesseract支…...
【数理知识】自由度 degree of freedom 及自由度的计算方法
放在最前的一句话:自由度是一个存在于两个学科中的概念,一个是存在于统计学中的自由度,另一个是存在于物理学中的自由度。而我本人需要的是研究物理学中的自由度概念,同时本笔记全篇也是在了解物理学中的自由度。 文章目录 自由度…...
苍穹外卖day09——历史订单模块(用户端)+订单管理模块(管理端)
查询历史订单——需求分析与设计 产品原型 业务规则 分页查询历史订单 可以根据订单状态查询 展示订单数据时,需要展示的数据包括:下单时间、订单状态、订单金额、订单明细(商品名称、图片) 接口设计 查询历史订单——代码开…...
正则表达式 —— Grep
文本处理三剑客:Grep、Sed、Awk 这三个工具都是基于对文本的内容进行增删改查的操作,此篇着重介绍grep与正则表达式的应用,以及扩展正则表达式。 正则表达式 什么是正则表达式? 它是由一类特殊字符以及文本字符所编写的一种模式…...
STC12C5A系列单片机片内看门狗的应用
wdt.c #include "wdt.h"void wdt_init(void) {WDT_CONTR 0x24; // 0010 0100 - 1.1377s }void wdt_feed(void) {WDT_CONTR | 0x10; // 喂狗 }wdt.h #ifndef _WDT_H_ #define _WDT_H_#include "stc12c5a60s2.h"// 函数声明 extern void wdt_init(void); …...
C语言指针详解
目录 指针是什么? 指针和指针类型 指针-整数 指针的解引用 野指针 野指针成因 如何规避野指针 指针运算 指针- 整数 指针-指针 指针的关系运算 指针和数组 二级指针 指针数组 指针数组 模拟二维数组 指针是什么? 指针理解的2个要点: 1. 指针是内存中一个…...
RTPS规范v2.5(中文版)
实时发布订阅协议 DDS互操作性有线协议 (DDSI-RTPS) 技术规范 V2.5 (2022-04-01正式发布) https://www.omg.org/spec/DDSI-RTPS/2.5/PDF 目 录 1 范围 8 2 一致性 8 3 规范性参考文献 8 4 术语和定义 9 5 标识 …...
LeetCode102.Binary-Tree-Level-Order-Traversal<二叉树的层序遍历>
题目: 思路: 写过N叉树的层序遍历,(8条消息) LeetCode429.N-Ary-Tree-Level-Order-Traversal<N 叉树的层序遍历>_Eminste的博客-CSDN博客 使用栈保存每一层的结点。然后每次当前层结束。将这一层的值添加进去res中。…...
yolov8系列[五]-项目实战-yolov8模型无人机检测
yolov8系列[五]-项目实战-yolov8模型无人机检测 项目介绍项目展示功能简介代码结构如何启动 开发者模式1. 安装依赖环境2. 启动程序 源代码下载其他 项目介绍 无人机识别项目,无人机搭载nvidia jetson边缘计算板子,进行实时识别。使用yolov8算法,训练了识别无人机的…...
Redis 笔记,基本数据类型、持久化、主从、集群等等问题
标题 😀😀😀创作不易,各位看官点赞收藏. 文章目录 标题Redis 基础笔记1、安装及环境搭建2、Redis 数据类型2.1、String2.2、List2.3、Hash2.4、Set2.5、Zset2.6、BitMap2.7、HyperLogLog2.8、Geospatial2.9、Stream 3、Redis 持久…...
JDK,JRE,JVM三者的关系
JDK(全称 Java Development Kit),Java开发工具包,能独立创建、编译、运行程序。 JDK JRE java开发工具(javac.exe/java.exe/jar.exe) JRE(全称 Java Runtime Environment),能运行…...
行为型-命令模式(Command Pattern)
说明 命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,以便在不同的请求者和接收者之间进行解耦、参数化和操作的队列化。命令模式允许你将具体的请求封装为对象,这些对象之间彼此独立ÿ…...
总结942
5:40起床 6:00~7:00单词复习300个,记100个 7:15~8:00早读,《love is as strong as death》第一第二段 8:10~9:10三大计算回顾 9:15~10:06 习题880第一章基础选择纠错 10:10~10:30单词默写 10:30~11:40强化第一讲习题 11:40~12:30继续…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...
运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.
报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符,最后运行:npm run lint --fix...
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...
