【计算机组成 课程笔记】1.2 冯·诺伊曼结构

课程链接:

计算机组成_北京大学_中国大学MOOC(慕课)

1 - 2 - 102-冯·诺依曼结构的要点(13-'59--)_哔哩哔哩_bilibili

现代的计算机形态各异,但究其本质,几乎全部采用了冯·诺依曼结构。要了解计算机,首先要知道什么是冯·诺依曼结构。

1. 冯·诺依曼结构的要点

要说冯·诺依曼结构,就得从《关于EDVAC的报告草案》说起。这份报告论述了两个重要的思想:1. 存储程序(而不是开关连线),2. 二进制(而不是十进制)。这份报告还明确了计算机的五个部分:运算器,控制器,存储器,输入设备和输出设备。

 2. 冯·诺依曼计算机的类比

知道了冯·诺依曼计算机的基本结构以后,我们可以做一个有趣的类比。把冯·诺依曼计算机看成是一个餐馆。厨房就是CPU,其中大厨就是控制器,而他做菜的工具-锅就相当于运算器。仓库则是存储器,里面存放了做菜所需的原料和任务单。这个类比中没有包含输入输出设备,这部分我们后面再探讨。

注意,如果没有存储程序的概念,即任务单和原料不放在一起,任务单是由人来下达的,这样带来的问题就是,由于控制器和运算器运转很快,下达指令就会成为瓶颈,影响整体效率。

下面我们把计算机执行一条指令的过程来类比一下。计算机执行一条指令主要包含4个步骤:取指,译码,执行,回写。

1. 取指(Fetch):相当于厨师知道了下张任务单的存放位置,然后向仓库发起请求:我需要第1格的东西。仓库收到命令以后取出所需东西,给厨师送回去,这就是第一步-取指。

2. 译码(Decode):相当于厨师分析任务单,比如任务单上写了炒菜,原料放在仓库第6格,炒完以后给A号盘子(通用寄存器)

3. 执行(Execute):按照任务的不同步骤,进行执行

4. 回写(Write-back):将炒完的菜盛放到A号盘子里

3. 计算机结构的简化模型

通过餐馆的例子,我们形象地了解了冯·诺依曼计算机的基本结构和指令执行过程。通过这个餐馆的模型,我们几乎可以一一对应地构造出一个简化的计算机结构模型。首先看到有CPU和存储器两大部件,中间通过系统总线(控制总线,地址总线和数据总线)相连。

存储器中包含了很多存储单元。存储单元的位宽由设计计算机时对存储器的编址方法确定,比如如果存储器按字节编址,则每个存储单元存放8位二进制数。另外,存储单元的地址是唯一的,不同存储单元地址互不相同。CPU要想访问某个存储单元,必须通过地址总线给出相应的地址,因此如果地址总线宽度为n,则CPU能管理的存储单元最多为2^n个。除了存储单元以后,存储器里还有MAR(Memory Address Register,存储器地址寄存器)和MDR(Memory Data Register,存储器数据寄存器),分别用于存放CPU正在读或写的存储单元的地址和数据。

再来看一下CPU。CPU中的控制器用于控制计算机各部件完成取指令,分析指令和执行指令等功能。主要组成部分包括IR(Instruction Register,指令寄存器),PC(Program Counter,程序计数器),MAR,MDR,指令译码部件,控制电路。IR存放“正在执行或即将执行的指令”,PC存放“下一条指令的存储单元地址”,具有自动增量计数功能。MAR在访存时用于存放“存储单元的地址”,和存储器上的MAR通过地址总线相连。MDR在访存时用于存放“对存储单元读或写的数据”,和存储器上的MDR通过数据总线相连。指令译码部件对IR中的指令进行译码,以确定IR中存放的是哪一条指令。当确定了是哪条指令之后,控制电路就可以产生对应的控制信号,在时序脉冲的同步下控制各个部件的动作。

CPU中的运算器用于算术运算和逻辑运算。核心部件ALU用于完成计算,X,Y,Z是ALU的数据暂存器,可视为ALU的一部分,F用于存放运算结果的状态(零/正负/进位/溢出)。R0~Rn-1是n个通用寄存器,用于临时存放数据,数据可以来自存储器,也可以来自于其他通用寄存器或ALU的输出。不同寄存器之间传递数据通过CPU的内部总线传递。

4. 计算机执行指令的过程

根据上述的计算机简化模型,我们再来重温一下计算机执行指令的过程。之前我们提到,计算机执行一条指令主要包含4个步骤:取指,译码,执行,回写。我们假设现在执行的指令是ADD R0, [6],表示把通用寄存器R0的内容和地址为6的存储单元的内容相加,运算结果更新到R0中。

1. 取指(Fetch):控制器发出控制信号,将PC寄存器中的内容通过内部总线传递到MAR中。MAR将存储的地址通过地址总线传到存储器的MAR中。与此同时,控制电路会在控制总线上发出相应的控制信号(READ)到存储器的控制逻辑单元,代表这次访问存储器的操作是要读数据。存储器通过地址译码器查找到对应存储单元的内容,并将此内容送到存储器的MDR。然后存储器的控制逻辑单元通过控制总线发送控制信号(READY)给CPU。同时MDR的数据通过数据总线送到CPU的MDR上。然后MDR中的内容通过内部总线传递到IR中。最后PC计数器更新为下一条指令所需要访问的地址。到此,取指阶段完成。

2. 译码(Decode):当前IR寄存器中的指令被送到指令译码器,译出这是一条“ADD R0, [6]”的指令)。这时发现其中一个操作数[6]还在存储器中,因此把要取的地址(0110)放到MAR中,随后的过程类似于第1步,取回来的数据放到MDR上。然后由于后面要进行ADD的操作,因此把两个操作数放到ALU的暂存器处,即R0的数据放到X,MDR的数据放到Y,这样计算所需的操作数就准备好了。

3. 执行(Execute):在控制电路的控制下,ALU就会进行运算,将X和Y的内容执行加法,结果写到Z。

4. 回写(Write-back):将运算结果写入到通用寄存器或存储器。对于这条指令是写到R0上,那么控制电路会给出控制信号,把Z的结果通过内部总线传递到R0上。

 5. 计算机的输入输出

前面的模型我们只讲到了运算器,控制器和存储器,本节我们引入另外两个部分:输入输出设备。毕竟如果没有输入输出设备,即使我们的cpu再强大,也没什么用。

现在我们考虑在模型机上加上输入输出设备,这里我们添加一个简化的输入输出设备——输入通过手动开关控制,输出通过小灯泡表示。这就是第一台微型计算机牛郎星8800所用到的输入输出设备。

现在我们把这样的输入输出设备接到我们的模型机上。我们可以设想这是一个类似于存储器结构的输入输出芯片,它内部有2个存储单元,每个单元都有自己的地址。这里设定的地址是1110和1111,和存储器里的地址都不相同,因此可以相互区分。

那么这个输入输出设备是如何和计算机的其他部分交互的呢?和存储器类似,也是通过系统总线相连。下面我们通过输入,输出两个简单场景来理解这一过程。

输入的简单场景:CPU通过地址总线发送要读取的地址(1111),地址总线上会有简单的分流逻辑,判断当前访问的对象是输入输出设备而不是存储器。同时控制电路通过控制总线发送READ信号,表示此次操作为一个读操作。然后和之前的指令执行过程类似,1111地址的内容11100000通过MDR返回给数据总线。 

输出的简单场景:CPU通过地址总线发送要写入的地址(1110),同时控制电路通过控制总线发送WRITE信号,表示此次操作为一个写操作。然后11001100通过数据总线传送给输入输出设备的MDR,再写入到1110存储单元的位置。 

 6. 冯·诺依曼结构和具体实现

现在我们对冯·诺依曼结构已经非常熟悉了,包括五个部分: 运算器,控制器,存储器,输入设备和输出设备。 

那这样原理性的框图和现代计算机的具体实现是如何对应的呢?以个人计算机为例,CPU代表的是运算器CA和控制器CC,主存(也常称为内存条)代表存储器M。那么CPU是如何获取指令并开始执行的呢?这块主板上采用的是个人计算机上长期占据主导地位的南北桥结构。CPU对外连接的一块芯片叫做北桥,CPU想要访问主存,就得通过北桥芯片。但这里我们还要注意,计算机刚启动的时候,主存里面是没有信息的,因为当计算机断电之后,主存的信息都会丢失。那在系统启动之后,CPU从哪里获取指令呢?我们可以看到北桥下方还有一块比较大的芯片,它就是南桥,南桥内部集成了很多输入输出设备的控制器,其中包括BIOS芯片,这个芯片存储容量很小,会保存一段比较简单但是十分重要的程序,包括检查主板上有哪些设备(显卡,键盘等),是否工作正常,这颗芯片是一颗只读存储器,当系统断电之后,只读存储器中保存的信息是不会丢失的。所以当CPU启动后,CPU可以依次通过北桥,南桥来访问BIOS芯片,从里面取得指令。

 整个南北桥的结构在现代计算机的演进中发生着快速的变化。下图和上图是同一个结构,图中红色的箭头代表传输压力大,为了减少性能瓶颈,南北桥的结构发生了一些演变。

首先,北桥中的主存控制器被移到了CPU芯片当中,这样CPU就能直接访问主存而不需要通过北桥,这样可以大大提高数据的传输率,进而提升系统的性能。现在,显示的这条通道就成了下一个要解决的问题。

因此在最新的个人计算机的CPU设计中,不仅包括了主存控制器,还包括PCIe控制器,可以直接连接显卡。这样北桥中最重要的部件都被集成到了CPU中,这样北桥就没有存在的必要了。将北桥中剩余的一些功能和南桥整合到一起之后,所谓南北桥的架构其实已经消失了,整个个人计算机的主板由3片式的架构缩减成了2片式。由于没有了北桥,南桥这个名字也显得有些奇怪了,所以它现在往往有一些不同的名字(如PCH)。现在CPU直接连接了主存和显卡,还与原先的南桥直接相连,这样就将原先通过主板的复杂的通路大多移到了芯片的内部,而芯片内部的数据传输率是远远高于主板的,这样就大大地提升了系统的性能。

那既然从3片缩减成了2片,我们可不可以进一步缩减呢?其实已经有人这么做了。这就是系统芯片的概念。

系统芯片(System-on-a-Chip, SoC):将计算机或其他电子系统集成为单一芯片的集成电路。

这是一个硬币大小的芯片,但在这一颗芯片内部集中了冯·诺依曼结构的所有组件。所以我们可以用这样的芯片制造出非常小巧的计算机。这种计算机只有手掌大小,但它的功能很完备,并拥有丰富的外部接口,与普通的计算机并没有什么差别。这样高集成度的优势就让系统芯片的技术广泛应用于智能手机/平板电脑等移动计算设备上。

那么原先计算机中那么多的芯片和板卡,为什么能够集中到越来越少的芯片当中呢?那就得说到一条著名的定律——摩尔定律:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。

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

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

相关文章

华为数通方向HCIP-DataCom H12-821题库(拖拽题,知识点总结)

以下是我在现有题库中整理的需要重点关注的考点内容,如有遗漏小伙伴可以留言补充。

【仿牛客论坛java项目】第五章 Kafka,构建TB级异步消息系统:阻塞队列、Kafka入门、Spring整合Kafka、发送系统通知、显示系统通知

这里写自定义目录标题 一、阻塞队列简单的阻塞队列测试案例总结阻塞队列 二、Kafka入门1、基础知识Kafka术语消息队列实现方式两种 2、配置3、启动全部命令启动 zookeeper 服务器再启动 kafka 服务器创建Topic关闭 4、总结Kafka的特点Kafka的术语 三、 Spring整合Kafka导入依赖…

R语言绘图相关函数(含实例)

目录 plot:可用于创建多种类型的图形 dev.new():新建画板 hist:绘制直方图 dotchart:绘制点图的函数 pie:绘制饼图 pair:绘制散点图矩阵 boxplot:绘制箱线图 scatterplot3D: 绘制三维散点图 par:修…

CTFhub-文件上传-前端验证

burp 抓包 --> 重发--> 查看源代码 用 GodZilla 生成木马 文件名为 1.php.jsp 上传-->抓包-->改包 (删掉 .jpg) --> 点击 放行 木马文件位置为:http://challenge-f0531d0c27641130.sandbox.ctfhub.com:10800/upload/1.php 用 蚁剑连接 ctfhub{4743b…

【Go 基础篇】Go语言结构体实例的创建详解

在Go语言中,结构体是一种强大的数据类型,允许我们定义自己的复杂数据结构。通过结构体,我们可以将不同类型的数据字段组合成一个单一的实例,从而更好地组织和管理数据。然而,在创建结构体实例时,有一些注意…

百度抓取香港服务器抓取超时是什么情况?

​ 网络延迟导致抓取超时 网络延迟是指从发送请求到接收响应之间的时间延迟。如果网络延迟过高,服务器可能无法及时响应请求,导致超时。在香港服务器上抓取数据时,如果网络延迟过高,可能会出现抓取超时的情况。 服务器负载过高可能…

设计模式-原型模式详解

文章目录 前言理论基础1. 原型模式定义2. 原型模式角色3. 原型模式工作过程4. 原型模式的优缺点 实战应用1. 原型模式适用场景2. 原型模式实现步骤3. 原型模式与单例模式的区别 原型模式的变体1. 带有原型管理器的原型模式2. 懒汉式单例模式的原型模式实现3. 细粒度原型模式 总…

系统架构技能之设计模式-抽象工厂模式

一、上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式。并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建。 工厂模式&…

JVM面试核心点

一、JDK体系 二、JVM体系 三、JVM内存模型 public class Math {public static final int data 666;public static UserEntity user new UserEntity();public int compute() { // 一个方法对应一块栈帧内存区域int a 1;int b 2;int c (ab)*10;return c;}public static voi…

Angular安全专辑之三 —— 授权绕过,利用漏洞控制管理员账户

这篇文章是针对实际项目中所出现的问题所做的一个总结。简单来说,就是授权绕过问题,管理员帐户被错误的接管。 详细情况是这样的,我们的项目中通常都会有用户身份验证功能,不同的用户拥有不同的权限。相对来说管理员账户所对应的…

openGauss学习笔记-57 openGauss 高级特性-并行查询

文章目录 openGauss学习笔记-57 openGauss 高级特性-并行查询57.1 适用场景与限制57.2 资源对SMP性能的影响57.3 其他因素对SMP性能的影响57.4 配置步骤 openGauss学习笔记-57 openGauss 高级特性-并行查询 openGauss的SMP并行技术是一种利用计算机多核CPU架构来实现多线程并行…

2023-9-2 Prim算法求最小生成树

题目链接&#xff1a;Prim算法求最小生成树 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 510, INF 0x3f3f3f3f;int n, m; int g[N][N]; int dist[N]; bool st[N];int prim() {memset(dist, 0x3f, size…

Qt应用开发(基础篇)——进度对话框 QProgressDialog

一、前言 QProgressDialog类继承于QDialog&#xff0c;是Qt设计用来反馈进度的对话框。 对话框QDialog QProgressDialog提供了一个进度条&#xff0c;表示当前程序的某操作的执行进度&#xff0c;让用户知道操作依旧在激活状态&#xff0c;配合按钮&#xff0c;用户就可以随时终…

qt文件操作

对话框练习 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//字体按钮 void Widget::on_ztbtn_clicked() {//调用QFontDia…

stable diffusion实践操作-常见lora模型介绍

本文专门开一节写Lora相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 模型分两种&#xff0c;一种是sd大模型&#xff0c;一种是类似Lora的小模型 国内的是&#xff1a;https://www.liblibai.com 国外的是&#xff1a;https:/…

TiDB Serverless Branching:通过数据库分支简化应用开发流程

2023 年 7 月 10 日&#xff0c;TiDB Serverless 正式商用。这是一个完全托管的数据库服务平台&#xff08;DBaaS&#xff09;&#xff0c;提供灵活的集群配置和基于用量的付费模式。紧随其后&#xff0c;TiDB Serverless Branching 的测试版也发布了。 TiDB Serverless Branc…

代码随想录算法训练营第二十四天|理论基础 77. 组合

理论基础 其实在讲解二叉树的时候&#xff0c;就给大家介绍过回溯&#xff0c;这次正式开启回溯算法&#xff0c;大家可以先看视频&#xff0c;对回溯算法有一个整体的了解。 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇…

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 目录 Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 一、简单介绍 二、OKHttp 4.xx 的 SDK 封装 aar 给 Unity 的使用注意 三、附录 OKHttp 的…

【记录】USSOCOM Urban3D 数据集读取与处理

Urban3D数据集内容简介 Urban3D数据集图像为正摄RGB影像&#xff0c;分辨率为50cm。 从SpaceNet上使用aws下载数据&#xff0c;文件夹结构为&#xff1a; |- 01-Provisional_Train|- GT|- GT中包含GTC&#xff0c;GTI&#xff0c;GTL.tif文件&#xff0c;GTL为ground truth b…

openssh---Windows下git安装配置gitlab

安装openssh 1. 专业版Win10/11默认自带&#xff0c;可以查看是否开启 1. Get-WindowsCapability -Online | Where-Object Name -like OpenSSH* 2. Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 3. Add-WindowsCapability -Online -Name OpenSSH.Serve…