冯•诺伊曼体系结构——也被称为冯•诺依曼模型或普林斯顿体系结构——是一种基于数学家和物理学家约翰•冯•诺依曼等人在1945年EDVAC报告初稿中描述的计算机体系结构。[1] 该文档描述了一个具有以下组件的电子数字计算机的设计架构:
术语“冯•诺依曼体系结构”已经发展到表示任何存储程序计算机,其中取指令和数据操作因共享总线而不能同时发生。这被称为冯•诺依曼瓶颈,通常会限制系统的性能。[3]
冯•诺依曼架构机器的设计比哈佛架构机器更简单——哈佛架构机器也是一个存储程序系统,但有一组专用的地址和数据总线用于读取和写入存储器,另一组地址和数据总线用于获取指令。
存储程序数字计算机将程序指令和数据保存在读写随机存取存储器(RAM)中。存储程序计算机是20世纪40年代程序控制计算机之上的一个进步,如Colossus和ENIAC。这些都是通过设置开关和插入配线电缆来编程的,以便在不同的功能单元之间路由数据和控制信号。绝大多数现代计算机对数据和程序指令使用相同的内存。冯•诺依曼与哈佛的区别在于高速缓存体系结构,而不是主存储器(分离式高速缓存体系结构)。
最早的计算机有固定的程序。一些非常简单的计算机仍然使用这种设计,无论是为了简单还是为了训练。例如,台式计算器(原则上)是一台固定程序计算机。它能做基础数学,但不能运行文字处理器或游戏。改变固定程序机器的程序需要重新布线、重组或重新设计机器。最早的计算机与其说是“编程的”,不如说是为特定任务“设计的”。“重新编程”——在可能的情况下——是一个艰苦的过程,首先是流程图和纸质笔记,紧接着是详细的工程设计,最后经常是艰苦的物理重新布线和重建机器的过程。在ENIAC上建立和调试一个程序可能需要三周时间。[4]
在存储程序计算机的设计下,这种情况发生了变化。根据设计,存储程序计算机包括指令集,并且可以在存储器中存储一组详述计算的指令(一种程序)。
存储程序设计还允许自修改代码。这种设施的一个早期动机是需要一个程序来增加或修改指令的地址部分,这在早期设计中操作者必须手动完成。当变址寄存器和间接寻址成为机器体系结构的常见特征时,这就变得不那么重要了。另一个用途是使用立即寻址将常用数据嵌入指令流。自修改代码在很大程度上不受欢迎,因为它通常很难理解和调试,而且在现代处理器流水线和缓存模式下效率低下。
在很大程度上,将指令视为数据的能力使得汇编器、编译器、链接器、加载器和其他自动化编程工具成为可能。[5]
它使“编写程序的程序”成为可能。这使得一个复杂的自托管计算生态系统在冯•诺依曼架构机器周围蓬勃发展。
一些高级语言通过提供抽象的、独立于机器的方式在运行时操纵可执行代码(例如,LISP),或者通过使用运行时信息来调整即时编译(例如,托管在Java虚拟机上的语言,或者嵌入在网络浏览器中的语言),来利用冯•诺伊曼体系结构。
在较小的规模上,一些重复的操作,如BITBLT或像素和顶点着色器,可以通过即时编译技术在通用处理器上加速。这是一种一直很流行的自修改代码的使用方法。
数学家艾伦•图灵在马克斯·纽曼在剑桥大学的讲座的提醒下注意到数学逻辑问题,他在1936年写了一篇题为《可计算的数,及其在Entscheidungs问题上的应用》的论文,该论文在《伦敦数学学会学报》上发表。在论文中,他描述了一个他称之为通用计算机的假想机器,现在被称为“通用图灵机”。这个假设的机器有一个包含指令和数据的无限存储器(用今天的术语来说是内存)。1935年,约翰•冯•诺依曼在剑桥大学当客座教授时结识了图灵,1936-1937年,图灵在新泽西州普林斯顿高等研究院读博士期间,他也一直与图灵在一起。对于他当时是否知道图灵在1936年发表的论文还不清楚。
1936年,康拉德·楚泽还在两项专利申请中预计,机器指令可以存储在用于数据的同一存储器中。[6]
独立地说,1943年12月,在宾夕法尼亚大学摩尔电气工程学院开发ENIAC的普雷斯珀•埃克特和约翰•毛克利写了关于存储程序概念的文章。 [7][8] 在设计一台新机器EDVAC时,埃克特在1944年1月写道,他们将把数据和程序存储在一个新的可寻址存储设备——水银金属延迟线存储器中。这是第一次提出建造实用的存储程序机器。那时,他和毛克利不知道图灵的工作。
冯•诺伊曼参与了洛斯阿拉莫斯国家实验室的曼哈顿项目,该项目需要大量的计算。这使他在1944年夏天参加了ENIAC项目。在那里,他加入了正在进行的关于这台存储程序计算机EDVAC设计的讨论。作为该小组的一员,他根据埃克特和毛奇利的工作,写了一篇名为《EDVAC评估报告初稿》[1] 的说明。当他的同事赫尔曼•戈德斯坦传播该说明的时候该文章还未完成,上面只有冯•诺依曼的名字。[9] 这让埃克特和毛克利惊愕不已。这篇论文被冯•诺依曼在美国和欧洲的几十位同事阅读,并影响了下一轮计算机设计。
杰克•科普兰认为“把电子存储程序数字计算机称为‘冯•诺依曼机器’在历史上是不恰当的”。他在洛斯阿拉莫斯的同事斯坦•弗兰克尔谈到冯·诺依曼对图灵思想的尊重:
我知道大约在1943年或1944年,冯·诺依曼非常清楚图灵1936年论文的根本重要性……冯·诺依曼向我介绍了那篇论文,在他的敦促下,我仔细研究了它。许多人称赞冯•诺依曼为“计算机之父”(现代意义上的计算机之父),但我确信他自己永远不会犯那个错误。也许他很可能被称为助产士,但他坚定地向我和其他人强调,基本概念是来自于图灵——就巴贝奇没有预料到的情况而言……图灵和冯•诺依曼当然也对这些概念的“实践化”做出了实质性贡献,但我不认为这些可以与介绍和解释计算机能够将活动程序存储于存储器并且在活动过程中进行修改的概念的重要性相比。
在“初稿”报告传阅时,图灵正在编写一份题为“电子计算器提案”的报告。它在工程和编程细节中描述了他对一种他称之为自动计算引擎的机器(ACE)的想法[10]。1946年2月19日,他将此提交给英国国家物理实验室的执行委员会。尽管图灵从他在布莱切利公园的战时经历中知道他的提议是可行的,但关于Colossus计算机的秘密后来被隐藏了几十年,阻止了他说出这些内容。产生了多种关于ACE设计的实现。
冯•诺依曼(von Neumann)和图灵(Turing)的论文都描述了存储程序计算机,但冯•诺依曼早期的论文获得了更大的传阅,其概述的计算机体系结构被称为“冯•诺依曼体系结构”。在1953年出版的《美国计算机》一章中的一节《比想象的更快:数字计算机研讨会》(由鲍登编辑)内容如下:
普林斯顿高等研究,机器研究所
1945年,随后在ENIAC被建造的费城摩尔工程学院工作的冯•诺依曼教授,代表其研究组的同事发表了关于数字计算机逻辑设计报告。该报告载有对机器设计的详细提议,该机器后来被称为EDVAC(电子离散变量自动计算机)。这台机器最近才在美国完成,但是冯•诺依曼的报告启发了剑桥的EDSAC(电子延迟存储自动计算器)的建造。
1947年,伯克、戈尔茨廷和冯•诺依曼发表了另一份报告,概述了另一种类型的机器(这次是一种并行机器)的设计,这种机器速度极快,可能每秒能运行20,000次。他们指出,构建这样一台机器的突出问题是开发具有即时可访问内容的合适存储。起初,他们建议使用一种特殊的RAC普林斯顿实验室发明的真空管——叫做“Selectron”。这些管子既昂贵又难以制造,所以冯•诺依曼后来决定基于Williams存储器制造一台机器。这台机器——于1952年6月在普林斯顿完成——成为众所周知的Maniac。这台机器的设计启发了至少六台现在正在美国制造的机器,它们都亲切地被称为“Johniacs”。
在同一本书中,关于ACE的一章的前两段内容如下:[11]
国家物理实验室的自动计算
体现自动电子计算技术发展和改进的最现代的数字计算机之一是最近在国家物理实验室展示的Teddington计算机,它是由实验室工作人员中的一小组数学家和电子研究工程师,并在英国电气有限公司的一些生产工程师的协助下设计和建造的。到目前为止,实验室里安装的设备只是一个更大的装置的先导模型,这个装置将被称为自动计算引擎,但尽管体积相对较小,仅包含大约800个热离子阀,而可以从第十二、十三和十四板判断出,它是一个极其快速和通用的计算机器。
机器计算的基本概念和抽象原理是由罗斯福•图灵博士在一篇论文中阐述的。1936年在伦敦数学学会前阅读,但是英国在这种机器上的工作被战争推迟了。然而,在1945年,国家物理实验室的J.R. Womersley先生对这些问题进行了检查,其随后成为实验室数学部门的主管。图灵博士和一小群专家加入了他的行列,到1947年,初步规划已经足够先进,足以保证成立上述特别小组。1948年4月,后者成为实验室的电子部门,由科尔布鲁克先生负责。
初稿描述了一个被许多大学和公司用来建造他们的计算机的设计。[12] 在这些不同的计算机中,只有ILLIAC和ORDVAC具有兼容的指令集。
以下年表中的日期信息很难按顺序排列。有些日期是首次运行测试程序的日期,有些日期是首次演示或完成计算机的日期,有些日期是首次交付或安装的日期。
程序存储器和数据存储器之间的共享总线导致冯·诺依曼的瓶颈,即与存储器量相比,中央处理器和存储器之间的有限吞吐量(数据传输速率)。由于单个总线一次只能访问两类内存中的一类,所以吞吐量低于CPU的工作速率。当需要中央处理器对大量数据执行最小处理时,严重限制了有效的处理速度。中央处理器不断被迫等待所需的数据移入或移出内存。由于CPU速度和内存大小的增长速度比它们之间的吞吐量快得多,瓶颈已经成为一个更大的问题,并且随着每一代新的CPU,这个问题的严重性也会增加。
冯·诺依曼瓶颈是由约翰·巴科斯在1977年的美国计算机学会图灵奖演讲中描述的。根据巴克斯所说:
确实有一个变更存储设备的方法,比借由冯·诺伊曼瓶颈流通大量数据更为先进。瓶颈这词不仅是对于问题本身数据流量的叙述,更重要的是,也是个使我们的思考方法局限在‘一次一字符’模式的智能瓶颈。它使我们怯于思考更广泛的概念。因此,编程成为一种项目与详述通过冯·诺伊曼瓶颈的字符数据流,且大部分的问题不在于数据的特征,而是如何找出数据。[22][23]
缓解措施
有几种已知的方法可以缓解冯·诺依曼的性能瓶颈。例如,下面这些都可以提高的表现:
这个问题也可以通过使用并行计算来回避,例如使用非统一内存访问(NUMA)架构——这种方法通常被超级计算机采用。尚不清楚巴克斯批评的智能瓶颈自1977年以来是否发生了很大变化。巴克斯提出的解决方案没有产生重大影响。现代函数编程和面向对象编程远不如像FORTRAN这样的早期语言那样倾向于“来回推送大量的字“,但在内部,这仍然是计算机花费大量时间做的事情,甚至是高度并行的超级计算机。
截至1996年,一项数据库基准研究发现,四分之三的CPU周期都在等待内存。研究人员预计,以多线程或单芯片多处理增加指令流数量将使这一瓶颈变得更加严重。[24] 在多核处理器的背景中,需要额外的开销来保持处理器和线程之间的高速缓存一致性。
除了冯·诺依曼瓶颈之外,程序修改可能是非常有害的,无论是出于偶然还是出于设计。在一些简单的存储程序计算机设计中,出现故障的程序会损坏自身、其他程序或操作系统,还可能导致计算机崩溃。内存保护和其他形式的访问控制通常可以防止意外的和恶意的程序修改。
^von Neumann, John (1945), First Draft of a Report on the EDVAC (PDF), archived from the original (PDF) on 2013-03-14, retrieved 2011-08-24.
^Ganesan 2009.
^Markgraf, Joey D. (2007), The Von Neumann Bottleneck, archived from the original on December 12, 2013.
^Copeland 2006,第104页.
^MFTL (My Favorite Toy Language) entry Jargon File 4.4.7, retrieved 2008-07-11.
^"Electronic Digital Computers", Nature, 162: 487, September 25, 1948, doi:10.1038/162487a0, archived from the original on April 6, 2009, retrieved April 10, 2009.
^Lukoff, Herman (1979). From Dits to Bits: A personal history of the electronic computer. Portland, Oregon, USA: Robotics Press. ISBN 0-89661-002-0. LCCN 79-90567..
^ENIAC project administrator Grist Brainerd's December 1943 progress report for the first period of the ENIAC's development implicitly proposed the stored program concept (while simultaneously rejecting its implementation in the ENIAC) by stating that "in order to have the simplest project and not to complicate matters," the ENIAC would be constructed without any "automatic regulation."..
^Copeland 2006,第113页.
^Bowden 1953,第176,177页.
^Bowden 1953,第135页.
^"Electronic Computer Project". Institute for Advanced Study. Retrieved 2011-05-26..
^Campbell-Kelly, Martin (April 1982). "The Development of Computer Programming in Britain (1945 to 1955)". IEEE Annals of the History of Computing. 4 (2): 121–139. doi:10.1109/MAHC.1982.10016..
^Robertson, James E. (1955), Illiac Design Techniques, report number UIUCDCS-R-1955-146, Digital Computer Laboratory, University of Illinois at Urbana-Champaign.
^Selective Sequence Electronic Calculator (USPTO Web site).
^Selective Sequence Electronic Calculator (Google Patents).
^Grosch, Herbert R. J. (1991), Computer: Bit Slices From a Life, Third Millennium Books, ISBN 0-88733-085-1.
^Lavington, Simon, ed. (2012). Alan Turing and his Contemporaries: Building the World's First Computers. London: British Computer Society. p. 61. ISBN 9781906124908..
^Johnson, Roger (April 2008). "School of Computer Science & Information Systems: A Short History" (PDF). Birkbeck College. University of London. Retrieved 2017-07-23..
^Bell, C. Gordon; Cady, R.; McFarland, H.; O'Laughlin, J.; Noonan, R.; Wulf, W. (1970), "A New Architecture for Mini-Computers—The DEC PDP-11" (PDF), Spring Joint Computer Conference, pp. 657–675.
^Null, Linda; Lobur, Julia (2010), The essentials of computer organization and architecture (3rd ed.), Jones & Bartlett Learning, pp. 36, 199–203, ISBN 978-1-4496-0006-8.
^Backus, John W. "Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs". doi:10.1145/359576.359579..
^Dijkstra, Edsger W. "E. W. Dijkstra Archive: A review of the 1977 Turing Award Lecture". Retrieved 2008-07-11..
^Sites, Richard L.; Patt, Yale. "Architects Look to Processors of Future". Microprocessor report. 1996.
暂无