冯诺依曼体系结构

冯诺依曼体系结构

我们的计算机是由硬件构成的,但它们并非杂乱无序的,而是按照一定的组织结构将所有的硬件划分在一起的。

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。

我们的计算机都是按照图中这样的结构进行组织的。

这些硬件都是插在主板上,用各种系统总线IO总线连接起来构成计算机体系结构。

正常情况下我们的计算机一定要要有输入设备如键盘和鼠标、话筒、摄像头、网卡、磁盘等;

输入设备有显示器、磁盘、网卡、打印机等。

这些都叫做外界设备

计算机的核心任务就是进行数据处理,所以要给它数据,也要能给出处理结果,所以就是需要输入和输出设备。

CPU一般是由两部分构成,其实现在的CPU已经非常复杂了,但我们现在将其简化点来说:

CPU=运算器+控制器

运算器主要是用来做计算的,算数运算与逻辑运算。要么判断结果要么判断真假。

控制器主要是帮我们控制CPU去取指令、分析指令、执行指令等。

CPU也叫做中央处理器

存储器到底是什么?

其实就是内存

那磁盘叫什么呢?外存。外部存储。

输入设备、输出设备都是外设,CPU与存储器则是亲兄弟。

输入设备我们需要的是把外设的数据读到内存里,而输出设备需要我们把内存数据输入到外设中。

其中,磁盘和网卡比较特殊。网卡在以后学到网络再提,这里就只先说磁盘。

我们以前在C++学习中进行文件读取的时候,读文件就是把磁盘里的数据读到内存里。写文件就是把内存里的数据写到磁盘里。这种读写的动作,我们称为IO,Input/Output,所以像磁盘这样的设备可能不止是输入或者输出设备,可能既能输入也能输出。而我们现在在谈硬件,所以这个所谓IO是站在谁的角度的输入与输出呢?站在内存角度

我们站在内存角度,输入设备把数据给我们就是I,我们把数据给输出设备就是O

(为什么学习冯诺依曼体系?是为了解答以下的疑问)

1.软件运行,必须先加载到内存?程序运行之前,在哪里?

没有运行之前是在磁盘。

因为程序就是个文件。它就是一个编译好的在磁盘特定路径下的二进制文件。

为什么软件运行必须先加载到内存?为什么要从磁盘加载到内存呢?

现在我们先不去关注黑色的箭头也就是控制信号,先关心数据信号。

我们会发现,在计算机体系结构里数据的流动只能从输入设备流到内存,然后我们又看到,CPU读写数据(代码也是数据)只能从内存里。

在数据层面,CPU获取、写入只能从内存中进行。

**而是谁在运行我们的软件呢?是CPU执行我们的代码,访问我们的数据。**所以CPU只认内存就必须将程序将外设加载到内存。

因为我们是站在内存的角度,所以我们说的加载,本质就是I,Input。

我们执行printf的时候其实也并没有直接将内容打印到输出设备上。而是把数据放到一个缓冲区里,需要的时候再把这个数据刷新到外设。

数据从一个设备流动到另一个设备,说流动,其实是拷贝

++所以体系结构的效率由设备的"拷贝"效率决定。++

CPU在数据(代码也是数据)层面,只和内存打交道;同样的,外设也只和内存打交道。


那么,为什么冯诺依曼体系要这样设计呢?

为什么计算机体系结构不能直接这样呢?

(存储分级)

我们计算机里有各种存储设备,最近的有寄存器,主存即内存,再来还有外存比如本地磁盘,再往后可能还有光盘云盘。

在整个计算机世界里,存储这件事如果离CPU越近,存储容量往往越小,但是更快、更贵。离CPU越远存储容量越大也越便宜但是效率低。

所以输入输出设备属于外设,输入输出效率低,假设它们的运算效率都是毫秒级别,cpu的运算速度是纳秒级别的,1s=1000ms,1ms=1000μs,1μs=1000ns。所以毫秒和纳秒级别差距很大,所以当我们cpu快速处理完后交给输出设备但是输出设备很慢就得等,或者cpu已经处理完了但是下一批要处理的数据还没加载过来。

所以如果没有内存而是直接外设和cpu打交道,整个体系的效率就按照外设的效率来定义了。这是木桶原理

如果要直接用寄存器来构建外设,那就成本非常高。所以为了能平衡成本和效率,就引入了内存。内存效率也可以认为是微秒(或者其实是纳秒)级别的。

有了内存的存在,将来我们的输入设备的数据就可以提前放到内存里,怎么提前由操作系统决定。

内存(存储器)就可以对外设和CPU的速度做一定的适配,这样就可以以较低的成本获得一台效率不错的计算机。

当代计算机是性价比的产物。

芯片技术+摩尔定律(现在有点失效了),随着时代发展计算机就越来越便宜,效率也越来越高。

后来随着时代发展有了操作系统这种东西,操作系统在内存里,加载的时候就在内存里,它用算法可以将外设中的数据提前搬到内存里,就可以让CPU直接去读了。(局部性原理?内存发挥最大效果)

理解数据流动

一对朋友,一个在北京一个在南京,网络聊天,北京的这人发送的字符串是如何显示到朋友的显示器上的?

(网络部分先淡化理解)

本质是两台冯诺依曼体系在进行聊天

登录聊天软件比如QQ的本质是启动一个软件,本质是将其可执行程序加载到内存了。

我们双击的过程就是加载。

现在QQ就在内存里,所以我们通过输入设备也就是键盘将我们的数据交给内存的QQ。数据就从哪输入设备流动到了存储器。

发送数据一方面我们要加密保证数据安全等,

把"你好"交给运算器转化成比如乱码的加密结构,写回内存,再通过QQ将数据打到自己体系结构的输出设备,在这我们的输入设备就是网卡。

网卡未来就会把数据交到网络里,再由网络交给目标机器。

目标机器的输入设备拿到数据,它的输入设备只能是网卡。

然后朋友也要将QQ启动起来加载到内存里,然后将数据从网卡到内存给QQ,交给运算器解密成"你好",然后再把"你好"写到内存(存储器),再刷新到输出设备也就是显示器。

这就是没有网络知识,纯站在冯诺依曼体系上对这个数据流动的理解。

所以我们的软件本质上都是在处理存储器和CPU之间的关系。我们写的算法、链表、增删查改,就是为了让我们的中央处理器去修改存储器内部相关的代码和数据。就是让它俩打交道。

当然在聊天时我们不仅能把信息发给对面还能在自己的显示器看到,这就是刷新时不仅在网卡刷一份,在自己的显示器也刷一份。

那如果是发送文件,而不是聊天呢?

文件本质也是数据。

文件先在磁盘上,当我们拖拽文件时本质是将磁盘文件拷贝到QQ,也就是搬到内存里。然后再通过运算器进行加密封包等再写回存储器,再把文件数据刷新到网卡。通过网络,对方网卡接收,读到内存,再解包解密写回内存,还能帮我们打开对应的目标文件,然后把数据写到输出设备也就是对方的磁盘。所以这个文件就从我们的磁盘到对方的磁盘。

硬件是软件的骨架。

所以很多软件问题通过转化为冯诺依曼体系结构我们就能将其理解。

相关推荐
今天我又学废了1 小时前
学习记录,隐式对象,隐式类
学习
#HakunaMatata1 小时前
Java 中 List 接口的学习笔记
java·学习·list
小雄abc1 小时前
决定系数R2 浅谈三 : 决定系数R2与相关系数r的关系、决定系数R2是否等于相关系数r的平方
经验分享·笔记·深度学习·算法·机器学习·学习方法·论文笔记
Magnetic_h1 小时前
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)
笔记·学习·ios·objective-c·cocoa
是小李呀~2 小时前
C盘扩容(亲测有效)
笔记
明金同学2 小时前
腾讯云海外服务器Window切换为linux系统(从Window DD 到 Linux)
linux·服务器·腾讯云
CC大煊3 小时前
【Linux】vi/vim 使用技巧
linux·运维·vim
cwtlw3 小时前
CSS学习记录11
前端·css·笔记·学习·其他
是十一月末3 小时前
Linux的基本功能和命令
linux·服务器·开发语言·数据库
暮已深3 小时前
【RTAB-Map+VINS-Fusion+euroc】(Ubuntu 20.04)三维稠密重建-实践笔记
linux·笔记·ubuntu