冯诺伊曼结构

计算机体系结构
(重定向自冯·诺伊曼结构

冯诺伊曼结构(英语:Von Neumann architecture),也称冯纽曼模型(Von Neumann model)或普林斯顿结构(Princeton architecture),是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。本词描述的是一种实作通用图灵机的计算装置,以及一种相对于平行计算的序列式架构参考模型(referential model)。

冯诺伊曼结构的设计概念。

本架构隐约指导了将储存装置与中央处理器分开的概念,因此依本架构设计出的计算机又称存储程序计算机

理论

编辑

存储程序计算机在体系结构上主要特点有:

  1. 以运算单元为中心
  2. 采用存储程序原理
  3. 存储器是按地址访问、线性编址的空间
  4. 控制流由指令流产生
  5. 指令由操作码和地址码组成
  6. 数据以二进制编码

历史

编辑

最早的计算机器仅内含固定用途的程式。现代的某些计算机依然维持这样的设计方式,通常是为了简化或教育目的。例如一个计算器仅有固定的数学计算程式,它不能拿来当作文书处理软体,更不能拿来玩游戏。若想要改变此机器的程式,你必须更改线路、更改结构甚至重新设计此机器。当然最早的计算机并没有设计的那么可程式化。当时所谓的“重写程式”很可能指的是纸笔设计程式步骤,接著制订工程细节,再施工将机器的电路配线或结构改变。

而储存程式型电脑的概念改变了这一切。借由创造一组指令集架构,并将所谓的运算转化成一串程式指令的执行细节,让此机器更有弹性。藉著将指令当成一种特别型态的静态资料,一台储存程式型电脑可轻易改变其程式,并在程式控制下改变其运算内容。 冯诺伊曼结构储存程式型电脑是互相通用的名词,其用法将于下述。而哈佛结构则是一种将程式资料与普通资料分开储存的设计概念,但是它并未完全突破冯.诺伊曼架构。

储存程式型概念也可让程式执行时自我修改程式的运算内容。本概念的设计动机之一就是可让程式自行增加内容或改变程式指令的记忆体位置,因为早期的设计都要使用者手动修改。但随著索引暂存器与间接位置存取变成硬体架构的必备机制后,本功能就不如以往重要了。而程式自我修改这项特色也被现代程式设计所弃扬,因为它会造成理解与除错的难度,且现代中央处理器的管线与快取机制会让此功能效率降低。

从整体而言,将指令当成资料的概念使得组合语言编译器与其他自动编程工具得以实现;可以用这些“自动编程的程式”,以人类较易理解的方式编写程式[1];从局部来看,强调I/O的机器,例如Bitblt,想要修改画面上的图样,以往是认为若没有客制化硬体就办不到。但之后显示这些功能可以借由“执行中编译”技术而有效达到。

此架构当然有所缺陷,除了下列将述的冯诺伊曼瓶颈之外,修改程式很可能是非常具伤害性的,无论无意或设计错误。在一个简单的储存程式型电脑上,一个设计不良的程式可能会伤害自己、其他程式甚或是作业系统,导致当机缓冲区溢位就是一个典型例子。而创造或更改其他程式的能力也导致了恶意软体的出现。利用缓冲区溢位,一个恶意程式可以覆盖呼叫堆叠(Call stack)并覆写程式码,并且修改其他程式档案以造成连锁破坏。记忆体保护机制及其他形式的存取控制可以保护意外或恶意的程式码更动。

第一次提出及实作

编辑

“冯诺伊曼结构”这个词出自美籍犹太数学家约翰·冯诺伊曼John von Neumann)的论文:《EDVAC报告书的第一份草案》(First Draft of a Report on the EDVAC[2], 于1945年6月30日。冯诺依曼由于在曼哈顿工程中需要大量的运算,从而使用了当时最先进的两台计算机Mark I和ENIAC,在使用Mark I和ENIAC的过程中,他意识到了存储程序的重要性,从而提出了存储程序逻辑架构。虽然冯诺伊曼的概念非常新颖,但冯诺伊曼结构这个词,对冯·诺伊曼的合作伙伴、时人甚至先辈都不公平。

一份由德国工程师康拉德·楚泽Konrad Zuse)提出的专利应用就已在1936年点出这类概念。而储存程式型电脑的概念早在冯诺伊曼知晓ENIAC的存在前就已在宾州大学的摩尔电机学院流传了。此构想的确实创立者永远是个谜。

赫曼·鲁寇夫英语Herman Lukoff相信是艾克特创建此概念(见参考资料)。

莫奇利艾克特在1943年于他们建造ENIAC时写下关于储存程式的概念,另外,ENIAC计画管理员布莱德(Grist Brainerd)在1943年12月为ENIAC做的进度回报,就已隐约提及储存程式的概念(虽然也同时否决了在ENIAC实作的计画),他说“为了拥有最简单的实作计画以及不复杂的事务,ENIAC建造时后将不需要任何自动整备”。

当设计ENIAC时,它很清楚说明从读卡机或纸带读取指令是不够快的,因为ENIAC设计用于高速执行运算。因此ENIAC直接以电路管线设计程式,并在需要新程式时重新配接线路。设计师也很清楚他们需要更好的系统架构,因此在ENIAC建造期间第一份EDVAC的报告就已撰写完毕,并包含了储存程式的概念,此概念叙述程式指令储存在高速记忆体(水银延迟记忆体)中,因此可以在执行时快速存取。

艾伦·图灵在1946年2月19日讲演了一份包含程式储存型电脑(Pilot ACE)完整设计的论文。

冯诺伊曼瓶颈

编辑

将CPU与记忆体分开并非十全十美,反而会导致所谓的冯诺伊曼瓶颈(Von Neumann bottleneck):在CPU与记忆体之间的流量(资料传输率)与记忆体的容量相比起来相当小,在现代电脑中,流量与CPU的工作效率相比之下非常小,在某些情况下(当CPU需要在巨大的资料上执行一些简单指令时),资料流量就成了整体效率非常严重的限制。CPU将会在资料输入或输出记忆体时闲置。由于CPU速度远大于记忆体读写速率,因此瓶颈问题越来越严重。

而冯诺伊曼瓶颈是约翰·巴科斯在1977年ACM图灵奖得奖致词时第一次出现,根据巴科斯所言:

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

原文如下:

Surely there must be a less primitive way of making big changes in the store than by pushing vast numbers of words back and forth through the von Neumann bottleneck. Not only is this tube a literal bottleneck for the data traffic of a problem, but, more importantly, it is an intellectual bottleneck that has kept us tied to word-at-a-time thinking instead of encouraging us to think in terms of the larger conceptual units of the task at hand. Thus programming is basically planning and detailing the enormous traffic of words through the von Neumann bottleneck, and much of that traffic concerns not significant data itself, but where to find it.[3][4]

在CPU与记忆体间的快取记忆体抒解了冯诺伊曼瓶颈的效能问题。另外,分支预测branch prediction)演算法的建立也帮助缓和了此问题。巴科斯在1977年论述的“智能瓶颈”已改变甚多。且巴科斯对于此问题的解决方案并没有造成明显影响。现代的函数式编程以及物件导向编程已较少执行如早期Fortran一般会“将大量数值从记忆体搬入搬出的操作”,但平心而论,这些操作的确占用电脑大部分的执行时间。

早期的储存程式型电脑

编辑

下列的日期资料很难给予一个适当的日期顺序。一些是第一次执行测试程式的日期;一些是电脑第一次公开展示或完成建造的日期;还有一些是第一次散布及安装日期。

制造者 型号 测试日期 完成日期 展示日期 备注
IBM SSEC 1948年1月27日 由于他的某些零件是机械式的,因此不算完全的电子电脑。
曼彻斯特大学 SSEM 1948年6月21日 第一个完全电子式且执行储存程式概念的电脑。
它在1948年6月21日以52分钟执行了一个因式分解程式,
之后执行了一个简单除法演算,以及一个判定两整数是否互质的程式。
宾夕法尼亚大学 ENIAC 1948年9月16日 借由执行一个Adele Goldstine为冯诺伊曼所写的程式,
展示它已被修改为储存程式型电脑。
Eckert-Mauchly Computer Corporation英语Eckert-Mauchly Computer Corporation 1949年2、3、4月 1949年9月
曼彻斯特大学 Mark I 1949年4月建造中版本
1949年10月正式版本
Cambridge EDSAC 1949年5月6日
宾夕法尼亚大学 EDVAC 1949年 1951年
欧澳两洲合作 CSIR Mk I 1949年11月
NIST SEAC 1950年4月
NPL Pilot ACE 1950年5月10日 1950年12月
NIST SWAC 1950年7月
MIT Whirlwind 1950年12月 1951年4月
雷明顿兰德公司 第一代
ERA Atlas
1950年12月 之后的商业版本是ERA 1101/UNIVAC 1101

参考文献

编辑

引用

编辑
  1. ^ "MFTL" entry, Jargon File 4.4.7. [2006-12-28]. (原始内容存档于2011-08-05). 
  2. ^ First Draft of a Report on the EDVAC页面存档备份,存于互联网档案馆) (PDF, 420 KB)
  3. ^ 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. 
  4. ^ Dijkstra, Edsger W. E. W. Dijkstra Archive: A review of the 1977 Turing Award Lecture. [2008-07-11]. (原始内容存档于2020-02-26). 

书籍

编辑
  • The First Computers: History and Architectures:由Raúl Rojas与Ulf Hashagen编辑,MIT Press,2000. ISBN 0-262-18197-5
  • From Dits to Bits... : A Personal History of the Electronic Computer,Herman Lukoff,1979. Robotics Press, ISBN 0-89661-002-0
  • Martin Davis(2000),第八章,"Making the first Universal computers",Engines of Logic: Mathematicians and the origin of the Computer,W. W. Norton & Company,Inc. New York. ISBN 0-393-32229-7 pbk。
  • Can Programming be Liberated from the von Neumann Style?,John Backus,1977 ACM Turing Award Lecture. Communications of the ACM,August 1978,Volume 21,Number 8. 线上PDF
  • C. Gordon Bell与Allen Newell(1971),Computer Structures: Readings and Examples,McGraw-Hill Book Company,New York. Massive(668页)。

参见

编辑