冯·诺依曼结构与哈佛结构浅析

前言


1945 年 6 月 30 日, 约翰 · 冯 · 诺依曼与戈德斯坦等人联名发表著名的 101 页报告:「First Draft of a Report on the EDVAC (EDVAC 报告书的第一份草案;EDVAC:Electronic Discrete Variable Automatic Computer, 电子数据计算机)


1946年7-8月间, 约翰 · 冯 · 诺依曼等人又提出了一个更加完善的设计报告「Preliminary Discussion of the the Logical Design of an Electronic Computing Instrument」(电子计算机逻辑设计初探)。 


报告指出:

(1)计算机应采用二进制, 不但数据采用二进制, 程序指令也采用二进制;

(2)计算机由5部分构成: 运算器、 控制器、 存储器、 输入和输出装置

(3)程序由指令组成并和数据一起存放在存储器中, 机器按程序指定的逻辑顺序, 把指令从存储器中读出来并逐条执行, 从而自动完成程序描述的处理工作, 即「存储程序」思想。


冯·诺伊曼结构


这里我们不谈论前两点,只谈谈由第三点“存储程序”思想衍生出的结构: 冯 · 诺依曼结构, 即「将程序指令和数据存储在一起」的存储器结构, 也可称之为普林斯顿结构(可能是只以他的名字命名较为不公, 所以也有人以约翰 · 冯· 诺依曼曾任教的大学普林斯顿来命名该结构)。 下面是个人对冯 · 诺依曼结构的理解。

  • 首先,冯·诺伊曼结构的本质是「存储器结构, 什么是存储器(Memory)? 现代的存储器种类很多, 个人认为冯 · 诺依曼结构当中的存储器指的是我们现在说的 RAM(Random Access Memory,随机读取存储器), 暂时可以理解为是 PC 中的内存(条), 而不是指硬盘等存储器(如有不同看法,欢迎发表), 理解这一点很重要。
  • 其次, 什么是程序指令和数据? 程序指令本质就是控制计算机进行相关运算的一些二进制「编码」(在冯·诺依曼机中指的是二进制码),但是这些编码」是人为事先定义、计算机可理解。那么数据呢?数据就是人为输入和程序指令被执行后产生的编码」, 计算机不可理解」。冯 · 诺依曼之所以将这两者都存储在 RAM 中,就是因为它们本质上都是编码」。但是这两者之间还有一个重要的区别: 程序指令在执行时是不可变的, 而数据则是可变的。 所以我们可以认为程序指令的目的实际上就是为了产生数据和改变数据。 这意味着将程序指令和数据放在同一块存储器上可能造成程序指令的不稳定(即程序指令在执行时容易被改写, 这也是为什么 PC 机上程序容易出现崩溃的部分原因)。
  • 最后, CPU 和存储器之间通过什么进行沟通? 我们知道冯 · 诺依曼机的 CPU 需要从 RAM 中读写数据, 取指令、 翻译指令、 执行指令。 后两者 CPU 可独立完成, 前两者 CPU 则需要通过系统总线与 RAM 进行沟通。 系统总线分为地址总线, 数据总线和控制总线, 分别用于传输地址信号、 数据信号和控制信号(但要注意这几种总线不一定是独立的,比如数据总线可能会承担地址总线的功能), 由于将指令和数据放在一起,冯 · 诺依曼结构是比较节省总线资源的。

明白了上述几点,就可以理解下图了:


冯·诺依曼结构与哈佛结构浅析_第1张图片

哈佛结构


那么哈佛结构呢? 哈佛结构远没有冯 · 诺依曼结构那么有名, 但个人认为这种结构的地位应当是与冯 · 诺依曼相当的。 也有很多人认为哈佛结构是冯·诺依曼的改进型, 但很少人知道哈佛结构是早于冯 · 诺依曼结构出现的。 这种结构的最早体现是在 1937 设计(1944年投入使用)的 ASCC MARK I(马克1号), 由 IBM 的 Howard Aiken(霍华德·艾肯)设计(具体历史请参照参考资料 [1], 英文资料)。这台计算机使用打卡纸存储程序指令, 而数据则存储在处理器中, 使用十进制进行计算, 这种结构的计算机计算能力完全无法与现代的计算机相比。 与 EDVAC 的运算能力也相去甚远, 但为后来的哈佛结构计算机提供了极其宝贵的参考价值。 当时的哈佛结构并不像现在那么清晰, 也许 Howard AiKen 本人也没有意识到将数据和程序指令分开的意义。 而我们现在所认知的哈佛结构实际上是经过后人完善的, 即「将程序指令和数据存储分开存储的存储器结构」。


哈佛结构计算机将程序指令和数据分开的做法实际上是保护了程序指令, 将程序指令放在 ROM (Read Only Memory, 只读存储器)或 Flash 等存储器中, 可以有效地保护程序指令在执行时不被改写; 而数据则保存在 RAM中, 可以读写。 但是由于多了一种存储器, 那么 CPU 与 RAM 的系统总线也必然会增加, 这会增加成本和设计的复杂度。 这也是早期的电脑很少使用哈佛结构的原因。 不过后来在此基础上提出了改进型哈佛结构, 即将两组系统总线合为一组, 使用分时复用的方式进行访问, 节省了总线资源, 而且没有改变哈佛结构数据和程序指令分开存储的本质。


下图即为哈佛结构示意图:

冯·诺依曼结构与哈佛结构浅析_第2张图片


在哈佛结构和冯诺依曼结构的基础上, 后来的人在 CPU 内部增加了缓存(Cache), 分为 D-Cache 和 I-Cache。 分别用于存储数据和程序指令; 在外部则使用RAM存储数据和指令。 只有需要改变时, 缓存才会到 RAM 中加载新的数据。 这种方式实际上从内部看属于哈佛结构, 在外部看则属于冯·诺依曼结构, 这是一种混合式结构, 而现在的计算机大部分都是如此, 而不再是纯粹的冯·诺依曼结构或者哈佛结构。


2017年1月19日

Kilento

参考资料


[1] 霍华德·艾肯 : http://history-computer.com/ModernComputer/Relays/Aiken.html

你可能感兴趣的:(计算机科学基础)