冯诺依曼体系结构

文章目录

一.冯诺依曼体系结构的主要组成部分

当代的计算机,本质上都是一堆硬件的集合(CPU、内存、磁盘、显卡等),这些硬件并不是毫无章法的堆放在一起,而是以冯.诺依曼体系结构来构成计算机的基本单元。

1.输入设备 & 输出设备

在计算机中,都是以二进制形式进行交互,我们是无法直接与内存或者CPU交互的,所以需要有输入设备,而计算机将数据处理之后,也是二进制形式,所以也有了输出设备。

  • 输入设备:键盘、鼠标、摄像头、磁盘、网卡等
  • 输出设备:显示屏、音响、磁盘、网卡等

这两个都是属于计算机的外设。

2.存储器

一般来说,存储器指的是内存和外存 ,但是对于CPU而言,类似于磁盘、U盘这样的外存,是属于输入输出设备的,所以这里的存储器指的是内存

3.运算器 & 控制器

在计算机,我们从外设将输入导入到内存中,然后再由运算器对我们的数据进行计算(算数运算、逻辑计算)

而什么时候将数据写入存储器,再又什么时候将数据导入中央处理器,或者又什么时候将处理完毕的数据传给存储器,再由存储器交给输出设备,这些过程都需要有硬件来进行控制,而控制器就是做这些工作。

这五大单元都各种有着各种的功能,都是独立的个体,然后用系统总线或I/O总线连接起来让其能交互,这就是冯.诺依曼结构的主要组成部分

二.为什么这么设计

通过存储器金字塔可以看出,离cpu越远,存储的容量越来大,效率越来越低,我们的输入输出设备,就处于金字塔的底层,他们的效率和cpu的效率完全不在一个级别,如果让他们直接和cpu交互,那势必会拖慢cpu的效率,从而我们计算机的整体效率就会以输入输出设备为主了,导致计算机的效率就会十分低下。

在此情况下,引入了一个比输入输出设备快,比cpu稍慢的内存,让输入设备先把数据读取到内存当中,然后cpu再从存储器拿数据,运算器将数据处理完毕之后,在交给存储器,最后再由存储器交给输出设备。那这样就能适配硬件层面上cpu和外设的速度差。

如果没有存储器,cpu直接对接输入输出设备,这种工作方式就是串行,一个环节影响着一个环节

有了存储器之后,数据可以预加载到内存中,要计算的时候就直接去内存拿数据即可,那这样就能加载数据和计算数据并行,从而在一定程度上提高效率。在这个过程中,存储器可以看成一个硬件级别的缓存空间。

那为何不将所有的存储设备造成寄存器级别的呢?

这在理论上可行,但势必会将计算机的造价变得十分高,过高的价格,那就不会被普及,不便于计算机的整体发展。有了内存的存在,就能以较小的成本,造出满足我们日常需求的计算机。

这就好比我们现在开的小汽车,基本就是烧油或者电驱动,这些每隔一段时间就要加油或者充电。要是用上核动力,那岂不美哉?那为何不普及呢?

这在技术层面是可以实现的,但是成本巨大,安全性不高,不利于小汽车的普及。

有了上述理论知识,就可以理解为什么程序要运行,必须先从磁盘加载到内存上当中

我们的代码在输入设备里面,要运行需要cpu的计算,这个过程就必须经过内存,这是冯诺依曼体系结构规定

所有的软件都必须遵守硬件结构,硬件属于计算机下限和边界,软件是上限,不管软件多牛,都得遵守规定!

三.现实案例

假设我们使用微信和别人聊天,这整个数据是如何流动的呢(不考虑网络和软件)?

这两台计算机,都是冯诺依曼体系结构,所有可以看作两个冯诺依曼体系结构交互。

当我们要给对方发信息的时候,这时候的输入设备就是键盘

输入的内容加载到内存,发送的消息里面不仅仅有消息,还有是谁发送的消息、发送消息的时间等,这些数据经过cpu打包计算之后再写回内存,最后发送在输出设备里面。

这里的输出设备不仅仅是显示器,本质上是发送到了网卡当中,显示器只是顺便的

这样我们的消息就发送出去了,那这时候,对方的输入设备就是网卡,输入设备将数据加载到内存,经过cpu的处理(解包、解压)再返回内存,最后由内存发送给输出设备,这时候对方就能看到我们所发送的消息


再假设,我们平时可能要发送一些文件给对方,这个文件是存储在磁盘当中,当我们拖拽这个文件发送的时候,这时候的输入设备就是磁盘

再经过这个体系发送给对方,当对方收到之后,这个文件并不是打开的,只是有一个图标,需要对方接收下载才能查看

如果对方当时并没有接收,第二天才接收,这时候这个文件还是存在的,这说明这个文件并不是在内存或者cpu,因为内存或者cpu属于掉电易失性存储。所以这个文件其实是在我们的磁盘上,这时候磁盘就属于输出设备

这整个过程,就是冯诺依曼体系结构


本文到此结束,码文不易,还请多多支持!!!

相关推荐
余额不足121381 小时前
C语言基础十六:枚举、c语言中文件的读写操作
linux·c语言·算法
ragnwang2 小时前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
罗伯特祥2 小时前
C调用gnuplot绘图的方法
c语言·plot
嵌入式科普3 小时前
嵌入式科普(24)从SPI和CAN通信重新理解“全双工”
c语言·stm32·can·spi·全双工·ra6m5
lqqjuly5 小时前
特殊的“Undefined Reference xxx“编译错误
c语言·c++
冰红茶兑滴水5 小时前
云备份项目--工具类编写
linux·c++
刘好念5 小时前
[OpenGL]使用 Compute Shader 实现矩阵点乘
c++·计算机图形学·opengl·glsl
2401_858286115 小时前
115.【C语言】数据结构之排序(希尔排序)
c语言·开发语言·数据结构·算法·排序算法
酒鬼猿6 小时前
C++进阶(二)--面向对象--继承
java·开发语言·c++
姚先生976 小时前
LeetCode 209. 长度最小的子数组 (C++实现)
c++·算法·leetcode