一套用了 70 年的计算机架构 —— 冯·诺依曼架构
本文已收录到 GitHub · AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群。
前言
大家好,我是小彭。
上一篇文章里,我们讨论了可计算问题与图灵机的计算机模型。在理解了图灵机模型后,我们将从和图灵同时代的另一位计算机科学家提出的 “冯·诺依曼架构” 开始,正式开始计算机组成原理的核心内容。
那么,冯·诺依曼架构是怎样的结构呢,冯·诺依曼架构是基于图灵机的吗,我们现在用的手机和电脑还在使用冯·诺依曼架构吗?今天我们将围绕这些问题展开。
学习路线图:
1. 计算机的早期历史
在 1936 年,艾伦·图灵在论文《论可计算数及其在可判定性问题上的应用》中开创性地提出了计算机的通用逻辑模型 —— 图灵机模型。这一理论深刻地影响了第一代计算机科学家,更多能够实现计算功能的计算机被制造出来,图灵也因此被誉为 “计算机科学之父”。
随着计算机的元器件从继电器升级到电子管(也叫真空管),计算机也从 “机电” 时代进入到 “电子” 时代。第一台电子计算机一般认为是 ABC( Atanasoff-Berry Computer),然而它与其他早期的计算机一样,都是 不可重新编程 的(参考资料上的用词是 “不可编程”,我认为 “不可重新编程” 更恰当)。一台计算机只能执行一个特定的程序,如果需要修改程序功能,就需要将整个计算器拆开,然后重新组装电路。
到了 1943 年,Colossus Mark I 计算机(巨人 1 号)在英国 Bletchley 公园(二战时的密码破译机构)被建造出来,以破解纳粹通信,好家伙一口气造了 10 台。 Colossus Mark I 被认为是第一台可编程的电子计算机,编程方法就是使用大量的开关和插线板(PlugBoards)。 但 Colossus Mark I 并不是通用计算机,它只被设计用于执行密码分析相关的计算。
Colossus Mark I
—— 图片引用自 Wikipedia
直到 1945 年,John Mauchly 和 J. Presper Eckert 在美国宾夕法尼亚大学建造了 ENIAC(Electronic Numerical Integrator and Computer,中译:埃尼亚克), ENIAC 被认为是第一台可编程的通用电子计算机,也被认为是第一台现代意义上的计算机。 但是,ENIAC 和 Colossus Mark I 一样都使用插线板编程,虽然不需要拆掉整台计算机来重新编程,但是编程效率依然非常低,据说一个简单程序在 ENIAC 上编程最多要花费三个星期。
这对于早期异常昂贵的计算机来说,需要停机这么长时间来重新编程是无法接受的。人们迫切需要一种更高效更灵活的编程方式,有人开始研究 使用存储器来保存程序和程序处理的数据。 在 1944 年,ENIAC 的发明者之一 J. Presper Eckert 发明了一种基于水银管的存储器,这为后来的存储程序概念提供了实现基础。
ENIAC
—— 图片引用自 Wikipedia
在建造 ENIAC 的同时,Mauchly 和 Eckert 也在同步研究一种新设计 EDVAC,并向 John von Neumann(冯·诺依曼)提出咨询。冯·诺依曼也参与到 EDVAC 项目中,并且写了一份著名的内部文档 《First Draft of a Report on the EDVAC》 ,详细阐述了 “存储程序计算机(Stored-program Computer)” 的概念,这就是后来人们所说的 “冯·诺依曼架构”。
后来,他们在 1947 年对 ENIAC 进行诸多改进,ENIAC 也成为了世界上第一台存储程序计算机。而 1948 年建造完成的 Manchester Baby 则被认为是世界上第一台基于冯·诺依曼架构的通用计算机。从 Baby 到现在 70 多年的时间,所有的单片机、PC 电脑、智能手机、服务器依然在遵循这一计算机架构。 现代所有的计算机科学上的发展都是在软件和硬件能力上做优化,根本上的计算机架构依然没有改变。 冯·诺依曼也因而被誉为 “电子计算机之父”。
2. 冯·诺依曼架构 —— 电子计算机的实现结构
2.1 什么是冯·诺依曼架构?
冯·诺依曼架构(Von Neumann Architecture) 是冯·诺依曼和其他人提出的电子计算机通用架构。冯·诺依曼架构将通用计算机定义为以下 3 个基本原则:
- 1、采用二进制: 指令和数据均采用二进制格式;
- 2、存储程序: 一个计算机程序,不可能只有一条指令,而是由成千上万条指令组成的。指令和数据均存储在存储器中,而不是早期的插线板中,计算机按需从存储器中取指令和取数据;
- 3、计算机由 5 个硬件组成: 运算器、控制器、存储器、输入设备和输出设备。在最开始的计算机中,五个部件是围绕着运算器运转的,这使得存储器和 I/O 设备之间的数据传送也需要经过运算器。 而现代计算机中,五个部件是围绕着存储器运转的,这使得存储器和 I/O 设备可以直接完成数据传送,而不需要经过 CPU。
冯·诺依曼架构
—— 图片引用自 Wikepedia
在冯·诺依曼架构之前还有一个哈佛架构,现在说的比较少。两者的区别在于冯·诺依曼是将指令和数据存储在同一个存储器的不同位置,存在争用问题;而哈弗架构将指令和数据存储在不同存储器中,规避了争用问题,与 CPU L1 缓存将指令和数据分离的思想类似。
2.2 冯·诺依曼瓶颈
冯·诺依曼瓶颈的概念最早由 John Backus 在 1977 年的图灵奖领奖演讲中提出: 由于 CPU 和存储器之间共享同一个系统总线,并且 CPU 和存储器之间存在巨大的速度差,导致 CPU 需要不断地被迫等待数据读取或写入到存储器,因此遏制了 CPU 的吞吐量 (关于总线系统,我们后面会专门讲)。
要从根本上解决冯·诺依曼瓶颈,还是只能重新构建一套新的计算机体系,例如生物计算机、量子计算机。不过,目前它们都还处在非常原始的阶段。现代计算机体系只能采用优化策略来减弱冯·诺依曼瓶颈的影响,这些内容我们后面都会提到,例如:
- 1、增加一个位于 CPU 和主内存之间的高速缓存
- 2、将指令缓存和数据缓存分离
- 3、CPU 分支预测
- 4、将存储器集成到 CPU 芯片内部,以减少内存访问(SoC 芯片)
相关文章:
3. 总结
如果说图灵机描述的是计算机的抽象模型,那么冯·诺依曼架构则是对图灵机这个抽象模型的实现架构。 冯诺依曼架构确立了现代电子计算机的基础和结构,学习计算机组成原理,其实就是学习和拆解冯诺依曼架构。计算机组成原理怎么学,我们下回说。关注我,带你了解更多。
参考资料
- Von Neumann architecture —— Wikipedia
- Von Neumann Bottleneck —— Wikipedia
- Harvard Architecture —— Wikipedia
- Stored-program Computer —— Wikipedia
- EDVAC —— Wikipedia
- EDIAC —— Wikipedia
- Delay-line memory —— Wikipedia
- Colossus Computer —— Wikipedia
- Manchester Baby —— Wikipedia