冯诺依曼体系结构

冯诺依曼体系结构

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

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

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

这些硬件都是插在主板上,用各种系统总线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,也就是搬到内存里。然后再通过运算器进行加密封包等再写回存储器,再把文件数据刷新到网卡。通过网络,对方网卡接收,读到内存,再解包解密写回内存,还能帮我们打开对应的目标文件,然后把数据写到输出设备也就是对方的磁盘。所以这个文件就从我们的磁盘到对方的磁盘。

硬件是软件的骨架。

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

相关推荐
tianyuanwo9 小时前
tar打包过滤指定目录指南
linux·tar·过滤式打包
DARLING Zero two♡9 小时前
【Linux操作系统】简学深悟启示录:进程间通信
linux·运维·服务器
半梦半醒*9 小时前
gitlab部署
linux·运维·centos·ssh·gitlab·jenkins
知识分享小能手9 小时前
uni-app 入门学习教程,从入门到精通,uni-app组件 —— 知识点详解与实战案例(4)
前端·javascript·学习·微信小程序·小程序·前端框架·uni-app
wahkim9 小时前
Flutter 学习资源及视频
学习
摇滚侠9 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 属性优先级 行内写法 变量选择 笔记42
java·spring boot·笔记
摇滚侠9 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 总结 热部署 常用配置 笔记44
java·spring boot·笔记
云雾J视界9 小时前
Linux企业级解决方案架构:字节跳动短视频推荐系统全链路实践
linux·云原生·架构·kubernetes·音视频·glusterfs·elk stack
小白要努力sgy10 小时前
待学习--中间件
学习·中间件
rechol10 小时前
汇编与底层编程笔记
汇编·arm开发·笔记