The Wayback Machine - https://web.archive.org/web/20221028213451/https://baike.sogou.com/kexue/d10119.htm

冯·诺依曼结构

编辑
冯诺依曼体系结构的框架

冯•诺伊曼体系结构——也被称为冯•诺依曼模型或普林斯顿体系结构——是一种基于数学家和物理学家约翰•冯•诺依曼等人在1945年EDVAC报告初稿中描述的计算机体系结构。[1] 该文档描述了一个具有以下组件的电子数字计算机的设计架构:

  • 包含算术逻辑单元和处理器寄存器的处理单元
  • 包含指令寄存器和程序计数器的控制单元
  • 存储数据和指令的存储器
  • 外部大容量存储器
  • 输入和输出机制[1][2]

术语“冯•诺依曼体系结构”已经发展到表示任何存储程序计算机,其中取指令和数据操作因共享总线而不能同时发生。这被称为冯•诺依曼瓶颈,通常会限制系统的性能。[3]

冯•诺依曼架构机器的设计比哈佛架构机器更简单——哈佛架构机器也是一个存储程序系统,但有一组专用的地址和数据总线用于读取和写入存储器,另一组地址和数据总线用于获取指令。

存储程序数字计算机将程序指令和数据保存在读写随机存取存储器(RAM)中。存储程序计算机是20世纪40年代程序控制计算机之上的一个进步,如Colossus和ENIAC。这些都是通过设置开关和插入配线电缆来编程的,以便在不同的功能单元之间路由数据和控制信号。绝大多数现代计算机对数据和程序指令使用相同的内存。冯•诺依曼与哈佛的区别在于高速缓存体系结构,而不是主存储器(分离式高速缓存体系结构)。

1 历史编辑

最早的计算机有固定的程序。一些非常简单的计算机仍然使用这种设计,无论是为了简单还是为了训练。例如,台式计算器(原则上)是一台固定程序计算机。它能做基础数学,但不能运行文字处理器或游戏。改变固定程序机器的程序需要重新布线、重组或重新设计机器。最早的计算机与其说是“编程的”,不如说是为特定任务“设计的”。“重新编程”——在可能的情况下——是一个艰苦的过程,首先是流程图和纸质笔记,紧接着是详细的工程设计,最后经常是艰苦的物理重新布线和重建机器的过程。在ENIAC上建立和调试一个程序可能需要三周时间。[4]

在存储程序计算机的设计下,这种情况发生了变化。根据设计,存储程序计算机包括指令集,并且可以在存储器中存储一组详述计算的指令(一种程序)。

存储程序设计还允许自修改代码。这种设施的一个早期动机是需要一个程序来增加或修改指令的地址部分,这在早期设计中操作者必须手动完成。当变址寄存器和间接寻址成为机器体系结构的常见特征时,这就变得不那么重要了。另一个用途是使用立即寻址将常用数据嵌入指令流。自修改代码在很大程度上不受欢迎,因为它通常很难理解和调试,而且在现代处理器流水线和缓存模式下效率低下。

2 能力编辑

在很大程度上,将指令视为数据的能力使得汇编器、编译器、链接器、加载器和其他自动化编程工具成为可能。[5]

它使“编写程序的程序”成为可能。这使得一个复杂的自托管计算生态系统在冯•诺依曼架构机器周围蓬勃发展。

一些高级语言通过提供抽象的、独立于机器的方式在运行时操纵可执行代码(例如,LISP),或者通过使用运行时信息来调整即时编译(例如,托管在Java虚拟机上的语言,或者嵌入在网络浏览器中的语言),来利用冯•诺伊曼体系结构。

在较小的规模上,一些重复的操作,如BITBLT或像素和顶点着色器,可以通过即时编译技术在通用处理器上加速。这是一种一直很流行的自修改代码的使用方法。

3 存储程序概念的发展编辑

数学家艾伦•图灵在马克斯·纽曼在剑桥大学的讲座的提醒下注意到数学逻辑问题,他在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月,后者成为实验室的电子部门,由科尔布鲁克先生负责。

4 早期冯·诺依曼架构计算机编辑

初稿描述了一个被许多大学和公司用来建造他们的计算机的设计。[12] 在这些不同的计算机中,只有ILLIAC和ORDVAC具有兼容的指令集。

  • ARC2(伯克贝克,伦敦大学)于1948年5月12日正式上线[13]
  • Manchester Baby(英国,曼彻斯特维多利亚大学)于1948年6月21日首次成功运行了一个存储程序
  • EDSAC(英国,剑桥大学)是第一台实用的存储程序电子计算机(1949年5月)
  • Manchester Mark 1(英国,曼彻斯特大学)从Manchester Baby机器发展而来(1949年6月)
  • CSIRAC(澳大利亚科学和工业研究理事会)澳大利亚(1949年11月)
  • EDVAC(阿伯丁试验场计算机实验室弹道研究实验室,1951年)
  • ORDVAC(伊利诺伊州大学)马里兰州阿伯丁试验场(1951年11月完工)[14]
  • IAS机器,普林斯顿大学(1952年1月)
  • MANIAC,洛斯阿拉莫斯科学实验室 (1952年3月)
  • ILLIAC,伊利诺伊大学(1952年9月)
  • BESM-1,莫斯科(1952)
  • AVIDAC,阿尔贡国家实验室(1953年)
  • ORACLE,橡树岭国家实验室(1953年6月)
  • BESK,斯德哥尔摩(1953)
  • JOHNNIAC,兰德公司(1954年1月)
  • DASK,丹麦(1955)
  • WEIZAC,以色列雷霍沃特魏茨曼科学研究所(1955)
  • PERM,慕尼黑(1956?)
  • SILLIAC,悉尼(1956)

5 早期存储程序计算机编辑

以下年表中的日期信息很难按顺序排列。有些日期是首次运行测试程序的日期,有些日期是首次演示或完成计算机的日期,有些日期是首次交付或安装的日期。

  • IBM SSEC公司有能力将指令视为数据,并于1948年1月27日公开展示。这种能力在一项美国专利中被宣称。[15][16]然而,它是部分机电的,而不是完全电子的。实际上,由于内存有限,指令是从纸带上读取的。[17]
  • 伦敦大学伯克贝克分校安德鲁·布斯和凯瑟琳·布斯开发的ARC2于1948年5月12日正式上线。[13]它的特点是第一个转鼓储存装置。[18][19]
  • Manchester Baby是第一台运行存储程序的全电子计算机。1948年6月21日,在运行了一个简单的除法程序和一个显示两个数字相对质数的程序后,它运行了52分钟的因式分解程序。
  • ENIAC被修改为作为一个最初的只读存储程序计算机运行(使用程序只读存储器的功能表),并在1948年9月16日由Adele Goldstine运行的程序证明了。
  • BINAC在1949年2月、3月和4月运行了一些测试程序,尽管直到1949年9月才完成。
  • Manchester Mark 1是从Baby项目(婴儿机)发展而来的。Mark 1的一个中间版本在1949年4月已经可以运行程序,但是直到1949年10月才完成。
  • EDSAC在1949年5月6日运行了它的第一个程序。
  • EDVAC于1949年8月交付,但它有问题,影响了它直到1951年才投入正常运行。
  • CSIR Mk I在1949年11月运行了它的第一个程序。
  • SEAC于1950年4月展示。
  • Pilot ACE在1950年5月10日运行了它的第一个程序,并在1950年12月进行了演示。
  • SWAC于1950年7月完成。
  • Whirlwind于1950年12月完成,并于1951年4月投入实际使用。
  • 1950年12月安装了第一代ERA Atlas(后来的商业版本为ERA 1101/UNIVAC 1101)。

6 演变编辑

Single system bus evolution of the architecture

在20世纪60年代和70年代的几十年里,计算机通常变得越来越小和越来越快,这导致了它们的体系结构的进化。例如,内存映射输入/输出让输入和输出设备被视为存储。[20] 单个系统总线可用于以更低的成本提供模块化系统。这有时被称为架构的“精简”。[21]在接下来的几十年里,简单的微控制器有时会省略模型的特征,以降低成本和尺寸。大型计算机增加了性能更高的功能。

7 设计限制编辑

7.1 冯·诺依曼瓶颈

程序存储器和数据存储器之间的共享总线导致冯·诺依曼的瓶颈,即与存储器量相比,中央处理器和存储器之间的有限吞吐量(数据传输速率)。由于单个总线一次只能访问两类内存中的一类,所以吞吐量低于CPU的工作速率。当需要中央处理器对大量数据执行最小处理时,严重限制了有效的处理速度。中央处理器不断被迫等待所需的数据移入或移出内存。由于CPU速度和内存大小的增长速度比它们之间的吞吐量快得多,瓶颈已经成为一个更大的问题,并且随着每一代新的CPU,这个问题的严重性也会增加。

冯·诺依曼瓶颈是由约翰·巴科斯在1977年的美国计算机学会图灵奖演讲中描述的。根据巴克斯所说:

确实有一个变更存储设备的方法,比借由冯·诺伊曼瓶颈流通大量数据更为先进。瓶颈这词不仅是对于问题本身数据流量的叙述,更重要的是,也是个使我们的思考方法局限在‘一次一字符’模式的智能瓶颈。它使我们怯于思考更广泛的概念。因此,编程成为一种项目与详述通过冯·诺伊曼瓶颈的字符数据流,且大部分的问题不在于数据的特征,而是如何找出数据。[22][23]

缓解措施

有几种已知的方法可以缓解冯·诺依曼的性能瓶颈。例如,下面这些都可以提高的表现:

  • 在中央处理器和主存储器之间提供高速缓存
  • 为数据和指令提供单独的高速缓存或单独的访问路径(所谓的改进哈佛体系结构)
  • 使用分支预测算法和逻辑
  • 提供有限的中央处理器堆栈或其他片上暂存存储器以减少存储器访问
  • 将中央处理器和存储器层次结构实现为片上系统,提供更大的本地访问,从而减少延迟并增加处理器寄存器和主存储器之间的吞吐量

这个问题也可以通过使用并行计算来回避,例如使用非统一内存访问(NUMA)架构——这种方法通常被超级计算机采用。尚不清楚巴克斯批评的智能瓶颈自1977年以来是否发生了很大变化。巴克斯提出的解决方案没有产生重大影响。现代函数编程和面向对象编程远不如像FORTRAN这样的早期语言那样倾向于“来回推送大量的字“,但在内部,这仍然是计算机花费大量时间做的事情,甚至是高度并行的超级计算机。

截至1996年,一项数据库基准研究发现,四分之三的CPU周期都在等待内存。研究人员预计,以多线程或单芯片多处理增加指令流数量将使这一瓶颈变得更加严重。[24] 在多核处理器的背景中,需要额外的开销来保持处理器和线程之间的高速缓存一致性。

7.2 自修改代码

除了冯·诺依曼瓶颈之外,程序修改可能是非常有害的,无论是出于偶然还是出于设计。在一些简单的存储程序计算机设计中,出现故障的程序会损坏自身、其他程序或操作系统,还可能导致计算机崩溃。内存保护和其他形式的访问控制通常可以防止意外的和恶意的程序修改。

参考文献

  • [1]

    ^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.

  • [2]

    ^Ganesan 2009.

  • [3]

    ^Markgraf, Joey D. (2007), The Von Neumann Bottleneck, archived from the original on December 12, 2013.

  • [4]

    ^Copeland 2006,第104页.

  • [5]

    ^MFTL (My Favorite Toy Language) entry Jargon File 4.4.7, retrieved 2008-07-11.

  • [6]

    ^"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.

  • [7]

    ^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..

  • [8]

    ^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."..

  • [9]

    ^Copeland 2006,第113页.

  • [10]

    ^Bowden 1953,第176,177页.

  • [11]

    ^Bowden 1953,第135页.

  • [12]

    ^"Electronic Computer Project". Institute for Advanced Study. Retrieved 2011-05-26..

  • [13]

    ^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..

  • [14]

    ^Robertson, James E. (1955), Illiac Design Techniques, report number UIUCDCS-R-1955-146, Digital Computer Laboratory, University of Illinois at Urbana-Champaign.

  • [15]

    ^Selective Sequence Electronic Calculator (USPTO Web site).

  • [16]

    ^Selective Sequence Electronic Calculator (Google Patents).

  • [17]

    ^Grosch, Herbert R. J. (1991), Computer: Bit Slices From a Life, Third Millennium Books, ISBN 0-88733-085-1.

  • [18]

    ^Lavington, Simon, ed. (2012). Alan Turing and his Contemporaries: Building the World's First Computers. London: British Computer Society. p. 61. ISBN 9781906124908..

  • [19]

    ^Johnson, Roger (April 2008). "School of Computer Science & Information Systems: A Short History" (PDF). Birkbeck College. University of London. Retrieved 2017-07-23..

  • [20]

    ^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.

  • [21]

    ^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.

  • [22]

    ^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..

  • [23]

    ^Dijkstra, Edsger W. "E. W. Dijkstra Archive: A review of the 1977 Turing Award Lecture". Retrieved 2008-07-11..

  • [24]

    ^Sites, Richard L.; Patt, Yale. "Architects Look to Processors of Future". Microprocessor report. 1996.

阅读 3762
版本记录
  • 暂无