1.4 计算机的基本工作原理
1.4.1 存储程序工作原理
存储程序工作原理是冯·诺依曼(von Neumann)在1945年领导设计EDVAC计算机的过程中提出的。实际上就是计算机执行程序的方式,采用这种方式,要事先编制程序,并将程序(包含指令和数据)存入主存储器中,计算机在运行程序时,要能自动、连续地从主存储器中依次取出指令并执行。存储程序是计算机能高速自动运行的基础。
存储程序工作方式,可称为指令流驱动方式。即按照指令的执行序列,依次读取指令;根据指令所含的控制信息,调用数据进行处理。为了控制指令序列的执行顺序,设置一个程序计数器(Program Counter,PC),让它存放当前指令所在的存储单元的地址。如果程序是顺序执行的,那么每取出一条指令后,PC内容自动增1(在大多数情况下,程序的执行都是顺序的,即按照指令的先后顺序执行),指示下一条指令该从何处取得。如果程序实施转移,则将转移目标地址送入PC,以便按新地址读取后继指令。PC就像一个指针,一直指示着程序的执行进程,也就是指示指令流的形成。
存储程序工作原理奠定了现代计算机的基本结构思想,到目前为止,绝大多数计算机仍沿用这一结构,称为冯·诺依曼机结构。
冯·诺依曼机结构从本质有什么缺点,如何改进?
冯·诺依曼机结构从本质上讲是采取串行顺序处理的工作机制,即使有关数据已经准备好,也必须逐条执行指令序列。提高计算机性能的根本方向之一是并行处理,因此,人们一直在谋求突破冯·诺依曼机结构的束缚,这主要表现在以下两个方面。
①在冯·诺依曼机结构范畴内,对传统冯·诺依曼机进行改造。例如,采用多个处理部件,形成流水处理,依靠时间上的重叠提高处理效率;组成阵列机结构,形成单指令流多数据流,提高处理速度。这些改造已比较成熟,成为标准的计算机结构。比较活跃的研究是用多个冯·诺依曼机组成多机系统,支持并行算法结构。
②从根本上改变冯·诺依曼机的控制流驱动方式。例如,采用数据流驱动工作方式的数据流计算机,只要数据已经准备好,有关指令就可并行执行。这是真正非冯·诺依曼的计算机,它为并行处理开辟了新的前景。但由于控制的复杂性,仍处于实验探索之中。
1.4.2 计算机的工作过程
计算机的工作过程是执行程序的过程。程序是为求解特定问题而设计的指令序列,所以计算机的工作过程就是按照给定次序执行一系列指令的过程。按照存储程序工作原理,执行一条指令可以分为两个阶段进行:取指令和执行指令。于是计算机的工作过程也就是反复取指和执指的过程。
例如,求两个正整数a,b的较大值,即f=max(a,b),下面以虚拟机M5 层,C语言为例来编写程序。先看解题步骤如下:
①输入a和b这两个数;
②执行a赋值给f;
③判断,如果b>a,则执行b赋值给f;
④输出f;
⑤结束。
上述步骤用指令表达出来就是程序。在编写程序时,需要考虑给程序、数据分配存储单元。C语言的处理方式是以函数名对应程序段的首地址(注意冯·诺依曼机的工作特点之一就是程序存储在存储器中,而程序是包括指令和数据),函数对应的程序段就存放在以该地址开始的连续区域中。用C语言编写的程序如下:
main() {int a,b,f; //此指令的执行将在内存可用区域分配存储单元,用来装载 //相应数据 scanf(″% d% d″,&a,&b); //CPU执行此指令的过程是:从输入设备(键盘)输入两个整数 //通过数据总线传输给内存,按照分配的存储单元地址存入 f=a; //CPU从内存中读取该指令执行,从a所对应的存储单元中读 //取数据,再存入f所对应的存储单元中 if(b<a)f=b; printf(″% d″,f); //CPU执行此指令的过程是:把f所对应存储单元中的数据 //输出到输出设备(如显示器)上 }
可以看出,冯·诺依曼体系的计算机执行程序的过程。这一过程结合汇编语言程序的执行就更加清楚了。
数据a存放在主存300AH单元,数据b存放在主存300BH单元,运算结果f存放在主存300CH单元。用汇编语言编写的程序如下(这里没有考虑输入/输出):
单元地址 单元内容 2000H MOV Al,[300AH] 2001H MOV BL,[300BH] 2002H MOV [300CH],AL 2003H CMP BL,AL 2004H JG 2005H 2005H HLT 2006H MOV [300CH],BL 2007H HLT 300AH a 300BH b 300CH 存结果f
上述汇编语言源程序汇编为二进制代码形式的目标程序后,顺序存放到主存储器中。数据也以二进制代码形式存放在主存储器中。将程序首地址2000H送程序计数器PC,便启动了该程序的执行。
设数据b<a,程序的执行过程如下:
①取指令——PC的内容(2000H)送地址总线,主存2000H单元内容读入控制器。PC的内容自动增1。
执行指令——控制器译码所读取的指令(MOV AL,[300AH]),发出控制信号,完成取300AH单元中的内容a送寄存器AL的操作。
②取指令——PC的内容(2001H)送地址总线,主存2001H单元内容读入控制器,PC的内容自动增1。
执行指令——控制器译码所取指令(MOV BL,[300BH]),发出控制信号,完成取300BH单元中的内容b送寄存器BL的操作。
③取指令——PC的内容(2002H)送地址总线,主存2002H单元内容读入控制器,PC的内容自动增1。
执行指令——控制器译码所取指令(MOV [300CH],AL),发出控制信号,完成将寄存器AL的内容传送至300CH单元中的操作。
④取指令——PC的内容(2003H)送地址总线,主存2003H单元内容读入控制器,PC的内容自动增1。
执行指令——控制器译码所取指令(CMP BL,AL),发出控制信号,完成操作:S=0,Z=0(b>a)。
⑤取指令——PC的内容(2004H)送地址总线,主存2004H单元内容读入控制器,PC的内容自动增1。
执行指令——控制器译码所取指令(JG 2005H),发出控制信号,完成操作:S=0,Z=0(b>a),条件满足,转移,地址2006H送PC。注意,如果条件不满足,就不会执行“转移,地址2006H送PC”的操作了。
⑥取指令——PC的内容(2006H)送地址总线,主存2006H单元内容读入控制器,PC的内容自动增1。
执行指令——控制器译码所取指令(MOV [300CH],BL),发出控制信号,完成将寄存器BL的内容传送至300CH单元中的操作。
⑦取指令——PC的内容(2007H)送地址总线,主存2007H单元内容读入控制器,PC的内容自动增1。
执行指令——控制器译码所取指令(HLT),发出控制信号,停机,程序执行结束。