2.3 冯?诺依曼结构和哈佛结构
阿兰?图灵在1937年首次提出了一个通用计算设备的设想。他设想所有的计算都可能在一种特殊的机器上执行,这就是现在所说的图灵机。如果我们把计算机定义成一个数据处理器,计算机就可以被看作是一个接收输入数据、处理数据、产生输出数据的黑盒。尽管这个模型能够体现现代计算机的功能,但是它的定义还是太狭窄,因为按照这种定义,便携式计算器也可以认为是计算机。
基于通用图灵机建造的计算机都是在存储器中存储数据的。在1944 ~ 1945年期间,冯?诺依曼指出,鉴于程序和数据在逻辑上是相同的,程序也能存储在计算机的存储器中。
冯?诺依曼结构又称作普林斯顿体系结构(Princetion Architecture),这是由于冯?诺依曼当时在普林斯顿大学任职。该结构自提出以来,主导了电子计算机半个多世纪的发展,是计算机发展史上最重要的体系结构,是通用计算机使用的最主要结构。
2.3.1 冯?诺依曼理论
冯?诺依曼理论的思想是:应该把程序也存储在存储器里,让计算机自己负责从存储器里提取指令,执行指令,并循环式地执行这两个动作,如图2?5所示。这样计算机在执行程序的过程中,就可以完全摆脱外界的影响,以自己可能的速度(电子的速度)自动地运行。按照这种原理构造出来的计算机就是“存储程序控制计算机”,也被称作“冯?诺依曼计算机”,简称冯?诺依曼机。
从20世纪初,物理学和电子学科学家们就在争论制造可以进行数值计算的机器应该采用什么样的结构。人们被十进制这个人类习惯的计数方法所困扰,著名的ENIAC就是用的十进制,那时以研制模拟计算机的呼声更为响亮和有力。20世纪40年代,冯?诺依曼大胆地提出:抛弃十进制,采用二进制作为数字计算机的数制基础。同时,他还提出预先编制计算程序,然后由计算机来按照事前制定的计算顺
序来执行数值计算工作的思想,奠定了冯?诺依曼结构的理论基础,这就是著名的“存储程序控制原理”。
1946年6月,冯?诺依曼在“关于电子计算装置逻辑结构初探”的报告中正式提出了以二进制、程序存储和程序控制为核心的一系列思想,对ENIAC的缺陷进行了有效的改进,从而奠定了冯?诺依曼计算机的体系结构基础。计算机经过了几十年的发展,其体系结构也发生了许多改进,但冯?诺依曼提出的数字计算机的原则仍然没有突破。
冯?诺依曼理论的要点:
指令像数据那样存放在存储器中,并可以像数据那样进行处理。
指令格式使用二进制机器码表示。
使用程序存储控制方式工作。
这3条内容合称冯?诺依曼原理。EDVAC是最早采用冯?诺依曼体系结构的计算机。大半个世纪过去了,直到今天商品化的计算机还基本遵循着冯?诺依曼提出的原理。
2.3.2 冯?诺依曼体系结构
从冯?诺依曼原理的角度看,一台完整的计算机系统必须具有如下功能:运算、自我控制、存储、输入/输出(I/O)和用户界面。其中,运算、自我控制、存储、输入/输出功能由相应全称命名的功能模块实现,各模块之间通过连接线路传输信息,我们一般将其统称为计算机硬件系统;用户界面主要由软件实现,我们一般将其统称为计算机软件系统。因此,我们可以这样理解,现代计算机是由遵循冯?诺依曼原理的硬件和软件系统所构建的运算处理系统。冯?诺依曼体系结构主要具有以下特点:
指令与数据均使用二进制代码形式表现,电子线路采用二进制。
存储器中的指令与数据形式一致,机器对它们同等对待,不加区分。
指令在存储器中按执行顺序存储,并使用一个指令计数器来控制指令执行的方向,实现顺序执行或转移,即算法是顺序型的。
存储器的结构是按地址访问的顺序线性编址的一维结构。
计算机由5大部分组成:运算器、控制器、存储器、输入设备、输出设备。
指令由操作码和地址码两部分组成,操作码确定操作的类型,地址码指明操作数据存储的地址。
一个字长的各位同时进行处理,即在运算器中是并行的字处理。
运算器的基础是加法器。
二进制在工程上实现容易,因为具有两个稳定状态的电子器件众多,所以用二进制表示数据具有抗干扰能力强、可靠性高的优点,这是数字计算机最关键的因素。另一方面,数制基数越小,表示数的符号就越少,相应的运算规律也就愈简单。例如十进制乘法有“九九表”的55条规则,如果要采用电路实现十进制乘法,将非常复杂。而二进制的乘法只有3条规则,即:0×0=0、0×l=0(或者1×0=0)、1×l=1。用电路实现二进制乘法规则,只需一个两输入端的与门就可实现。二进制的“1”和“0”还正好与逻辑推理中的真和假对应,可以非常方便地实现逻辑运算和逻辑判断。
冯?诺依曼计算机的结构如图2?6所示。整个结构以运算器为中心,数据流动必须经过运算器,并由控制器进行控制。其5大部件相互关系及工作过程如下:
1)通过输入设备输入原始数据、计算程序以及给控制器的控制命令等,由控制器控制,将有关部分存入存储器(存储程序和数据)。
2)在控制器控制下从存储器读取一条指令到控制器,经译码分析将指令转换为控制信号控制运算器动作,需要的话,还要从存储器读取数据到运算器中。
3)运算器在控制器控制下完成规定操作,并将结果送回存储器或送到输出设备输出。
4)从存储器读取下一条指令,重复第2步以后的步骤,直到程序中包含的全部指令都执行完成或收到停止的指令为止。
运算器是用二进制进行算术和逻辑运算的部件。它由算术逻辑运算部件(ALU)和若干通用寄存器组成。ALU由组合逻辑电路构成,完成算术和逻辑运算。其中,算术运算指加减乘除和求补码等,它以加法运算为核心,减法通过补码变减为加,乘除通过一系列的加法和移位来完成。逻辑运算完成“与”、“或”、“非”和“异或”等基本逻辑运算。寄存器用来存放参加运算的数据以及保存运算结果。运算器除了完成运算之外,还可以传送数据,因此,运算器是计算机的关键部件之一,它的功能和运算速度对计算机来说至关重要。
控制器是计算机的指挥中心,它的作用是从存储器中取出指令,然后分析指令,发出由该指令规定的一系列操作命令,完成指令的功能。控制器是计算机的关键部件,它的功能直接关系到计算机性能,是计算机最复杂、最关键的部件。
输入/输出设备是计算机与外界联系的设备,因此也称为外设。计算机通过外设获得各种外界信息,并且通过外设输出运算处理结果。因此,计算机能够在各行各业大显身手,完成人难以实现的运算工作,控制机器生产完成人力难以实现的产品数量和质量。常见的主要外设有键盘、鼠标器、扫描仪、显示器、打印机、绘图仪等。前三者是典型的输入设备,而后三者是典型的输出设备。这些外设是人机联系最密切的设备。
2.3.3 冯?诺依曼结构的演变
冯?诺依曼结构是一种宏观的自动计算结构,现代通用电子计算机在设计时基本沿用了冯?诺依曼体系结构的原理。传统的冯?诺依曼计算机系统是串行执行的。其主要缺点有以下几点:
1)由于处理器与存储器之间的特殊关系,处理器要频繁访问存储器,而处理器的速度要高出存储器几个数量级,存在处理器与存储器之间的瓶颈;同时,由于其执行指令是串行的,由此造成指令串行执行效率低,不能充分发挥处理器功效。
2)在使用计算机语言的时候,人们常常使用高级语言,而高级语言与机器语言之间的差别是较大的,要用不同的编译和解释程序将高级语言的源程序翻译成机器可以识别的机器语言,从而带来较大的工作量。
3)由于冯?诺依曼计算机采用的是按地址访问的顺序存储空间,对于复杂的数据结构,必须经过地址映像存放才能解决问题,因此也带来了不便。
对于传统的冯?诺依曼计算机系统存在的缺点,计算机系统结构的设计者在极力寻求解决问题的办法,通常有两种方法可以使用。一种是改良的方法,即在现有的机型上进行不断改进,使系统更合理、更有效;另一种是革命的方法,那就是彻底推翻冯?诺依曼计算机系统的结构,重新设计更完整、更合理的系统。显然,革命的方法不论从哪个方面讲代价都是很大的,而且设计周期也会很长,况且设计出来的新结构也不一定就是完美的。因此,系统结构的设计者选择了改良的方法对现有的计算机体系结构进行改进,在实践中不断探索,以便设计出更好的系统。
随着电子技术的发展和实际使用的需要,现代计算机在结构设计上较冯?诺依曼结构有了进一步的演变,特别是在微观结构方面,基于LSI/VLSI技术的发展而有了更加明显的变化。与冯?诺依曼结构相比,现代计算机结构主要在以下方面有所演变:
1)将运算器与控制器集中于一块芯片,称为微处理器,并常用它作为中央处理器件(CPU),有时甚至将部分存储器和输入输出接口都集中到微处理器上,称作单片机。
2)采用并行控制、流水线等方法,开发并行性。采用并行控制技术和流水线技术,提高系统作业的吞吐率。引入流水线技术,将传统的串行执行方式转变为并行方式,充分利用处理器内部的功能部件,采用精简指令系统,单周期执行一条或多条指令以提高程序执行效率。
3)采用多体交叉存储器,增加存储带宽。采用多体交叉存储器,可以在一个存储器访问周期中同时对多个存储单元进行访问,可以进行多字的一次性存取,从而增加存储带宽。
4)以存储器为核心,使I/O设备和处理器可并行工作。传统的冯?诺依曼系统以运算器为核心,存储器、输入/输出设备都直接对应运算器,从而使得各种I/O设备无法与处理器并行工作。采用以存储器为核心的结构,可以提高I/O设备和处理器并行工作的能力,从而改进系统的性能。
5)现代机器采用总线(bus)技术。总线是连接计算机有关部件的一组信号线,是计算机中用来传送信息代码的公共通道,其作用是将计算机各个部件连接起来,并实现各部件之间正确的数据传输。冯?诺依曼机的五大部分之间都可以用总线连接。总线包括单总线、双总线和多总线结构。
采用总线结构主要有以下优点:
简化了系统结构,便于系统设计制造。
大大减少了连线数目,便于布线,减小体积,提高系统的可靠性。
便于接口设计,所有与总线连接的设备均采用类似的接口。
便于系统的扩充、更新与灵活配置,易于实现系统的模块化。
便于设备的软件设计,所有需要控制接口的软件就是对不同的接口地址进行操作。
便于故障诊断和维修,同时也降低了成本。
在后面的各章节中我们将分别介绍这些概念和技术。
2.3.4 哈佛结构
哈佛结构(Harvard Architecture,缩写为HARC)是一种将程序指令存储和数据存储分开的存储器结构,这一点与冯?诺依曼结构有本质的区别,由哈佛大学的学者提出。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。
哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和存储,执行时可以预先读取下一条指令。哈佛结构采用程序和数据空间独立的体系结构,目的是为了减轻程序运行时的访存瓶颈。例如在一条指令同时取两个操作数的运算中,在流水线处理时同时还有一个取指令操作,如果程序和数据通过一条总线访问,取指令和取数据必会产生冲突,而这对大运算量循环的执行效率是很不利的。哈佛结构能基本上解决取指和取数的冲突问题。
目前使用哈佛结构的中央处理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列芯片,还有Motorola公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9、ARM10和ARM11,51单片机也属于哈佛结构。