2.2 计算机体系结构中的一些有关概念

2.2.1 CISC与RISC

CISC是复杂指令集计算(Complex Instruction Set Computing)的缩写,RISC是精简指令集计算(Reduced Instruction Set Computing)的缩写,它们分别代表着当前微处理器的两大结构体系。

1.CISC结构微处理器的特点

目前CISC结构的微处理器主要应用于通用目的微机中,具有代表性的且仍被大量使用的有Intel的X86系列(包括与其兼容的AMD公司的产品)和Motorola的680X0系列。1980年以前的微处理器大部分采用的是CISC结构,其主要特点是指令的种类繁多(如早期的8086/8088CPU不包括浮点指令在内都有110多条指令),指令功能强大,指令的机器码长度因指令不同而不同,指令的执行时间也根据不同的指令有较大的差异。例如大家所熟悉的微处理器8086/8088的指令“INC AL”的机器码长度为1字节,指令执行时间为2个时钟周期。指令“MOV AX,[DI+1000]”机器码长度为4字节,指令执行时间为17个时钟周期。而除法指令“DIV BX”的机器码长度为2字节,指令执行时间为155个时钟周期。在CISC结构计算机这些众多的指令中,常用的指令只占到了一小部分(20%左右)。经统计使用最多的是传送类指令,其次是转移类指令,依次往下是测试和比较类指令,加、减、加1、减1类指令。这类最常用的指令只占指令集中指令数量的20%,但在程序中却占整个程序指令使用量的80%,被称为“二八定律”。许多功能强大的指令实际很少使用,但它们却往往占用了CPU中60%以上的晶体管并伴随着复杂的实现工艺。

2.RISC结构微处理器的特点

RISC结构主要针对CISC表现出的缺点而设计,它精简了CPU的指令集(实际上是精简了处理器的内部结构),统一了指令的字节长度,并将大部分指令执行时间限制在一个时钟周期。

RISC的概念最早是1975年由IBM在其小型机IBM-801的设计中提出的,但第一个实用的RISC微处理器诞生于美国加州大学伯克利分校,由Patterson和Sequin领导的一个小组于1981年研制出第一台这样的机器——RISC I机。相对于CISC,RISC结构的微处理器具有以下特点。

1)具有一个短小精悍的指令集

如果不包括衍生指令,大多数RISC微处理器的指令只有几十条,如ARM微处理器包括协处理指令在内共有55条指令,而早期的8086CPU不包括浮点指令都有110多条。

2)指令具有相同的机器码位长

常见的为32位,对有些不足32位的指令都将无用位填0。

3)95%的指令执行时间为一个时钟周期

剩余的5%指令也只需2个时钟周期,而且可以通过指令调度技术(Code Scheduling)在编译系统的帮助下在1个时钟周期完成。

4)没有采用CISC必用的微指令(微码)结构

由于CISC一条指令内会包含几种不同的寻址方式,所以需要采用微指令技术来实现。这种复杂的微指令结构将耗用芯片内多达60%的晶体管,造成芯片体积和功耗的加大。而RISC的指令中只含有单一的功能和寻址方式,不需要复杂的微指令结构,仅用硬件电路就可以实现,指令译码所用的晶体管只占总数的10%,所以可以大大减少芯片体积和功耗,因此可以增加其他的功能电路。

5)采用了载入/存储(Load/Store)模式

在CISC结构中,一条指令可实现存储器(源)到存储器(目的)的操作。例如指令“MUL WORD BYTE [DI]”,先从DI指向的存储器单元中取出数据与AL中的内容相乘,然后将结果回送到AX中去。这类指令不仅包含了对存储器单元的寻址,还包含了存储器内容和寄存器内容的乘法运算,所以必须有复杂的微指令结构参与操作方可实现。为了简化微指令结构,对存储器的访问RISC只设置了单一的寻址模式:将存储器数据加载到寄存器的寻址方式(Load),或寄存器数据保存到存储器的寻址方式(Store)。因此在RISC结构中将无法在一条指令中实现存储器到存储器的数据传输,也就不会出现CISC结构中广泛使用的存储器间接寻址方式。要想进行存储器到存储器的数据传输,需要先用一条Load指令从存储器读出数据,然后用一条Store指令将数存入存储器。这种模式借鉴于1976年推出的超级计算机CRAY1体系结构中的实现技术,所以也同时沿用了其术语称谓:Load/Store模式。

6)具有更多数量的寄存器

大多数的RISC CPU具有32个或更多的通用寄存器,其目的是为了避免对大量堆栈的使用。尽管RISC结构也使用堆栈,但不如CISC结构那样频繁和耗时。

3.CISC和RISC结构的优、缺点

CISC或RISC结构各自的优、缺点主要体现在硬件结构的复杂性和编程软件的复杂性两个方面。

CISC结构的CPU虽然有着晶体管数量多、结构复杂、功耗大等缺点,但是其丰富的指令集使得编程方便简捷。由于有许多功能强大的指令,所以实现同样功能所使用的代码量比RISC结构CPU少很多。而RISC结构微处理器则有着晶体管数量少、功耗低、指令平均执行速度高等优点,但由于其指令集仅提供一些使用频度高的指令,对于一些CISC结构下一条指令就可以完成的功能就必须用多条指令甚至是复杂的程序体来实现。假定一个程序总的执行时间为T,T=N×C×S,式中N是要执行的指令数,C是平均每条指令执行所需的时钟周期数,S是处理器时钟周期。为提高程序的执行速度,CISC和R1SC都努力减小S,即提高处理器的时钟速率。CISC是着眼减小N,却付出了较大C的代价;RISC是力图减小C,却付出了较大N的代价。CISC技术的复杂性在于硬件,在于CPU内部用于实现复杂指令必须的微指令控制器实现技术。RISC技术的复杂性在于软件,在于编译程序的编写与优化。因此RISC微处理器直接用汇编语言编程将是一项繁复的工作,故编程多采用C或其他高级语言。正是由于CISC和RISC结构各自的优缺点,这两种结构也都在相互渗透,而且其界限也越来越模糊。例如Intel的Pentium微处理器中的U流水线采用的是传统的CISC结构方式,而V流水线则采用了RISC结构方式。另一方面,RISC处理器为了提高其功能也在不断的扩充其指令系统,如浮点指令、DSP指令、Java指令、多媒体指令等。可能有一天我们会感觉到精简指令集处理器的指令集并不精简。

2.2.2 冯·纽曼(Von Neuman)结构和哈佛(Harvard)结构

1.冯·纽曼结构(Von Neumann Architecture)

冯·纽曼结构为经典的计算机系统架构方式,其主要特征为程序中指令与数据使用相同的存储空间,因此指令与数据可相混,即数据作为指令使用也无妨,反之亦然。

该结构率先在1945年由被誉为“现代电脑之父”的美籍奥地利科学家冯·纽曼首先提出,故称为冯·纽曼结构。其原创贡献在于提出了“存储程序”的概念和计算机运用二进制运行的原理,后来人们把利用这种概念和原理设计的电子计算机系统统称为“冯·纽曼型结构”计算机。X86 CPU中的实模式就采用了冯·纽曼结构。冯·纽曼结构的处理器指令与数据使用同一个存储器,经由同一个总线传输,如图2-2所示。

图2-2 冯·纽曼结构示意图

冯·纽曼结构处理器具有以下几个特点:

  • 必须有一个存储器;
  • 必须有一个控制器;
  • 必须有一个运算器,用于完成算术运算和逻辑运算;
  • 必须有输入和输出设备,用于进行人机通信。

冯·纽曼的主要贡献就是提出并实现了“存储程序”的概念。由于指令和数据都是二进制码,指令和操作数的地址又密切相关,因此代码和数据共享同一存储区和同一总线是一种自然的选择。但是这种指令和数据共享同一总线的结构,使得信息流的传输成为限制计算机性能的瓶颈,影响了数据处理速度的提高。例如当程序中出现大的数据块访问操作时,CISC处理器可以采用两种方式:一种是等待数据传输结束再运行后续的指令,显然CPU利用率会降低;另一种是在DMA控制器的配合下采用所谓的周期窃取技术,利用CPU取指令/执行指令的间隙窃取数据总线的控制权,断断续续地完成数据的传输。虽然CPU不会等待,但是需要在CPU和DMA控制器间不断的切换总线控制权,这将影响系统的运行速度。

2.哈佛结构(Harvard Architecture)

哈佛结构的主要特点是程序和数据分别由不同的存储区提供,而且采用独立的总线进行访问。因最早的实现结构出现在哈佛·马克一号计算机(Harvard Mark I calculator)上,故称为哈佛结构(但早期这部机器的程序由打孔纸带输入,数据则存于机器内部)。X86 CPU系列的保护模式也采用了该结构。由于数字信号处理一般需要较大的运算量和较高的运算速度,为了提高数据吞吐量,需要进行大量数字信号处理的处理器大多采用哈佛结构,如DSP处理器等。早期的哈佛结构示意图如图2-3所示。

与冯·纽曼结构处理器比较,哈佛结构处理器有两个明显的特点:

  • 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
  • 使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。

后来,又提出了改进型哈佛结构,如图2-4所示,这种结构中虽然在CPU外部共用了一组地址和数据线,但内部对程序和数据仍然是分别进行访问的机制。

图2-3 哈佛结构

图2-4 改进型哈佛结构

改进型哈佛结构的特点为:

  • 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存,以便实现并行处理;
  • 具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;
  • CPU内部保留了程序和数据分别访问结构,但外部分时复用一组地址和数据总线。

3.冯·纽曼结构与哈佛结构工作方式的区别

在典型情况下,完成一条指令需要3个步骤,即取指令、指令译码和执行指令。从指令流的定时关系也可看出冯·纽曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令时序例子,如图2-5所示。

图2-5 冯·纽曼结构处理器指令流的定时关系示意图

指令1至指令3均为存数据指令。对于冯·纽曼结构处理器,由于取指令和存数据要从同一个存储空间存取,经同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。

采用哈佛结构处理以上同样的3条存取数指令如图2-6所示,由于取指令和存取数据分别经由不同的存储空间和不同的总线,使得各条指令可以重叠执行,这样,也就克服了数据流传输的瓶颈,提高了运算速度。

图2-6 哈佛结构处理器指令流的定时关系示意图

在ARM处理器系列中,ARM7TDMI采用了冯·纽曼结构,所以其内核的高速数据缓存器Cache就只有一个统一的存储区;而ARM9及之后的处理器则采用了哈佛结构,其内核有相互独立的数据Cache(D Cache)和代码Cache(I Cache)。