冯 • 诺依曼体系结构
- 一、冯 • 诺依曼体系结构推导
- 阶段 1:初始计算机体系结构(仅输入、运算、输出)
- 阶段 2:加入控制功能,初步形成 CPU 概念
- 阶段 3:性能瓶颈与引入内存
- 阶段 4:最终冯·诺依曼体系结构
- 内存提高效率的机制:局部性原理
- 二、深入理解
- 1.使用 QQ 聊天时数据的流动过程
- 1.1 你的电脑(发送端)
- 1.2 网络传输(简略)
- 1.3 朋友的电脑(接收端)
- 2.冯·诺依曼体系结构在其中的体现
- 3.为什么要有这样的设计?
一、冯 • 诺依曼体系结构推导
冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。
数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构。
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
存储器:内存
外设:
输入设备:鼠标、键盘、摄像头、话筒、磁盘、网卡…
输出设备:显示器、播放器硬件、磁盘、网卡…
有的设备是纯输入、输出,也有既是输入又是输出的设备
CPU:
运算器:对我们的数据进行计算任务(算术运算,逻辑运算) 控制器:对我们的计算硬件流程进行一定的控制
以上这些都是独立的个体!各个硬件单元必须用“线”链接起来
- 系统总线
- IO总线
截至目前,我们所认识的计算机,都是有一个个的硬件组件组成
输入单元:包括键盘, 鼠标,扫描仪, 写板等
中央处理器(CPU):含有运算器和控制器等
输出单元:显示器,打印机等
关于冯诺依曼,必须强调几点:
- 这里的存储器指的是内存
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问 外设(输入或输出设备)
- 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
- 一句话,所有设备都只能直接和内存打交道。
冯·诺依曼体系结构的工作流程
冯·诺依曼体系结构的工作基于“存储程序”和“顺序执行”的原则,其基本流程如下:
- 取指令(Fetch):控制器从存储器中读取下一条指令(根据程序计数器的地址)。
- 解码(Decode):控制器解析指令,确定需要执行的作。
- 执行(Execute):运算器执行指令(可能涉及从存储器读取数据、计算、或将结果写回存储器)。
- 更新程序计数器:程序计数器加1,指向下一条指令,循环上述步骤。
阶段 1:初始计算机体系结构(仅输入、运算、输出)
描述:计算机最初的作用是解决问题,需要输入数据、进行运算并输出结果。因此,体系结构包括输入设备、运算功能和输出设备。
推导:
- 计算机通过输入设备获取数据或问题。
- 数据经过算术运算和逻辑运算后,通过输出设备显示结果。
- 然而,仅靠运算功能不足以协调数据流,缺乏控制机制。
阶段 2:加入控制功能,初步形成 CPU 概念
描述:为了协调输入、运算和输出的时机,引入控制功能(对应 C 语言中的判断、循环、函数跳转等)。将运算功能和控制功能整合,称为中央处理器(CPU)。
推导:
- CPU 整合了算术运算(加减乘除)、逻辑运算(与、或等)和控制功能。
- 但输入设备和输出设备相对于 CPU 速度极慢(木桶原理),导致整体性能受限。
阶段 3:性能瓶颈与引入内存
描述:由于输入/输出设备与 CPU 速度差异巨大,体系结构效率低下。引入内存作为缓冲,位于慢设备(输入/输出)和快设备(CPU)之间,缓解速度不匹配问题。
推导:
- 输入设备将数据存入内存,CPU 从内存读取数据处理后写回内存。
- 内存再将数据传输给输出设备。
- 内存速度介于输入/输出设备和 CPU 之间,起到缓冲作用,避免 CPU 因等待慢设备而闲置。
阶段 4:最终冯·诺依曼体系结构
描述:结合存储器(仅指内存,不包括外存)、CPU、输入设备和输出设备,形成经典的冯·诺依曼体系结构。数据在内存和 CPU 之间流动,输入输出通过内存缓冲。
推导:
- 内存成为数据传输的中介,CPU 与内存之间的高速交互是体系核心。
- 输入设备和输出设备通过内存与 CPU 间接通信,减少直接交互的瓶颈。
内存提高效率的机制:局部性原理
描述:内存通过局部性原理提高效率。当 CPU 访问某数据时,内存预加载其附近数据(空间局部性),并利用处理与加载并行进行(时间局部性),形成缓冲区效果。
推导:
- 空间局部性:内存加载一行数据时,预加载后续数据,减少 CPU 等待。
- 时间局部性:CPU 处理数据时,内存同时加载下一批数据,二者并行提高效率。
- 缓冲区:如 C 语言的
fflush
函数,内存存储数据直到缓冲区满,再输出到设备。
冯·诺依曼体系结构的推导是从简单输入-运算-输出的模型开始,逐步引入控制功能和内存,最终形成以内存和 CPU 为核心的结构。内存通过局部性原理和缓冲机制有效缓解了输入/输出设备与 CPU 速度不匹配的问题,成为现代计算机设计的基础。
二、深入理解
对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上,请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。 从你打开窗口,开始给他发消息,到他的到消息之后的数据流动过程。如果是在qq上发送文件呢?
1.使用 QQ 聊天时数据的流动过程
以下是从你敲击键盘到朋友看到消息的完整数据流动过程,结合冯·诺依曼体系结构和网络通信的视角:
1.1 你的电脑(发送端)
-
输入阶段(键盘 → 内存):
- 你在键盘上输入消息(例如“Hello”)。
- 键盘作为输入设备,将按键信号转换为电信号,存储到键盘控制器的寄存器中。
- 通过 I/O 总线,键盘控制器将数据写入内存(通常由操作系统的中断机制完成)。
- 冯·诺依曼特性:外设(如键盘)不直接与 CPU 交互,而是通过内存作为中介。
-
显示阶段(内存 → 显示器):
- 输入的消息被加载到内存后,QQ 客户端程序从内存读取数据。
- CPU 执行客户端代码,将消息渲染到显示缓冲区(内存中的一块区域)。
- 显示器(输出设备)通过 I/O 总线 从内存获取渲染数据,显示在你的屏幕上。
-
封装与发送阶段(内存 → 网卡):
- CPU 从内存读取消息,按照网络协议栈(TCP/IP)进行封装:
- 应用层:QQ 协议添加消息头。
- 传输层:TCP 添加端口号、序列号等。
- 网络层:IP 添加源和目标 IP 地址。
- 数据链路层:以太网帧封装。
- 封装后的数据写回内存。
- 网卡(输出设备)通过 I/O 总线 从内存读取数据,发送到网络。
- CPU 从内存读取消息,按照网络协议栈(TCP/IP)进行封装:
1.2 网络传输(简略)
- 数据经过路由器、交换机等网络设备,从你的网卡传输到朋友的网卡。
- 具体过程涉及物理层信号转换、数据链路层帧传递、网络层路由等(按你的要求忽略细节)。
1.3 朋友的电脑(接收端)
-
接收阶段(网卡 → 内存):
- 朋友的网卡(输入设备)接收到网络数据,存储到网卡的寄存器中。
- 通过 I/O 总线,网卡将数据写入内存。
- 冯·诺依曼特性:网卡作为外设,依然通过内存与 CPU 交互。
-
解包阶段(内存 → CPU → 内存):
- CPU 从内存读取数据,按协议栈逆向解包:
- 数据链路层:剥离以太网帧。
- 网络层:解析 IP 地址。
- 传输层:处理 TCP 头部。
- 应用层:提取 QQ 消息内容。
- 解包后的消息写回内存。
- CPU 从内存读取数据,按协议栈逆向解包:
-
显示阶段(内存 → 显示器):
- QQ 客户端从内存读取解包后的消息。
- CPU 执行渲染逻辑,将消息写入显示缓冲区。
- 显示器(输出设备)通过 I/O 总线 从内存获取数据,显示在朋友的屏幕上。
2.冯·诺依曼体系结构在其中的体现
冯·诺依曼体系结构的核心是 存储程序概念 和 CPU-内存-外设 的分工协作。以下是它在 QQ 聊天过程中的体现:
-
内存作为数据中转站:
- 所有外设(键盘、网卡、显示器)都通过内存与 CPU 交互。
- 原因:CPU 的处理速度远高于外设,直接交互会导致效率低下;内存作为缓冲区,解耦了 CPU 和外设的操作。
-
程序必须加载到内存:
- QQ 客户端的可执行文件存储在硬盘上,运行时加载到内存。
- 原因:CPU 只能从内存取指令和数据,硬盘(外设)的数据访问需要通过内存中转。
-
总线连接硬件:
- 系统总线:连接 CPU 和内存,传输指令和数据。
- I/O 总线:连接内存和外设(如键盘、网卡),负责数据输入输出。
-
寄存器的作用:
- 外设(如键盘、网卡)内部的寄存器暂存数据,再通过总线写入内存。
- 原因:寄存器速度快,适合缓冲瞬时数据,减少内存直接访问的压力。
3.为什么要有这样的设计?
-
为什么 CPU 只与内存打交道?
- 效率:CPU 的速度(GHz 级别)远超外设(MHz 或更低),直接与外设交互会浪费 CPU 时间。
- 解耦:通过内存中转,CPU 可以专注于计算,外设可以独立完成 I/O 操作。
-
为什么程序要加载到内存?
- 速度:内存的访问速度(纳秒级)比硬盘(毫秒级)快几个数量级,CPU 需要快速获取指令(但也会出现“内存墙”的问题)。
- 控制:内存由操作系统管理,便于分配和保护程序运行环境。
-
为什么外设需要寄存器?
- 缓冲:外设的处理速度慢,寄存器作为临时存储,避免数据丢失。
- 同步:寄存器与外设硬件直接相连,确保数据按序传输到内存。
-
为什么数据要经过封装和解包?
- 可靠性:网络协议(如 TCP)通过头部信息保证数据顺序和完整性。
- 通用性:分层封装(如 TCP/IP)让不同设备和软件能够协同工作。