1.2 计算机系统结构的概念
1.2.1 计算机系统的层次结构
计算机系统由硬件(hardware)和软件(software)组成。人们认识计算机,往往考虑它能起什么作用,用户该怎样使用它才能发挥其功能。事实上,从人们使用机器的角度,可以将系统看成是按功能划分的从第0级至第6级等7层机器级组成的层次结构,如图1.1所示。其中,第0级和第1级为“实际机器”,第2级至第6级为“虚拟机器”。
图1.1 计算机系统的层次结构
对“虚拟机器”用户来说,他是通过该层次的语言来了解和使用计算机的。例如,高级语言程序员面向的就是高级语言计算机,只要熟悉和遵循高级语言的使用规定,所编写的程序总是能在这台机器上运行并得到结果,而用不着考虑这台机器是如何通过下一层的汇编语言或机器语言来实现程序的有关功能,更不用了解底层的硬件是如何工作的。在他看来,“机器”就是能存储和执行相应语言程序的算法和数据结构的集合体。
“虚拟机器”的特征是由软件实现机器功能,体现了由机器语言、汇编语言、高级语言到应用程序语言的层次性。一般来说,上层语言语句或命令的功能,是由下层语言的翻译或解释来实现的。翻译(translation)是先用转换程序将高一级机器上的程序整体变换为低一级机器级上等效的程序,然后再在低一级机器级实现的技术;解释(interpretation)则是在低一级机器级上用它的一串语句或指令来仿真高级机器级上的一条语句或指令的功能,是通过对高一级的机器级语言程序中的每条语句或指令进行逐条解释来实现的技术。越往上层,越接近最终用户而远离实际机器。
“实际机器”的使用者,其主要任务是设计和维护机器。第1级机器由微程序(固件)实现。所谓固件(firmware)是一种具有软件功能的硬件,例如将软件固化在ROM上。一个微程序往往对应一条机器指令,它根据该指令操作所需要的控制时序,配备一套微指令,编写出微程序,控制信息在寄存器、运算器等之间的传送。第0级机器是具体的硬联逻辑电路,实现各个微指令的功能或微操作信号的要求。这些硬件,往往是大规模集成电路及其连接通路。
这里有两点要指出,一是上述层次的划分及其层次间的相互关系并非绝对的,它们之间可能有交叉。例如,高级语言程序经编译后可能跳过汇编语言程序直接以机器语言程序实现;操作系统程序有可能使用高级语言(如C语言)而不是汇编语言编写;有些机器指令可以直接使用组合逻辑电路实现,不一定非要由微程序解释实现。
二是软件和硬件在逻辑上是等效的。原理上,软件的功能可用硬件或固件完成,硬件的功能也可用软件模拟完成,只是性能、价格、实现的难易程度不同。例如,一条逻辑运算指令,可直接用组合电路实现;反过来,一次复杂的逻辑运算,即使没有具体对应的逻辑电路,仍可用一条或若干条机器指令来完成。又如,早期的8位计算机很多没有乘除法指令,实现乘除法必须用加减移位指令编程来实现。以后的计算机有了乘除法器硬件,就可以设置乘除法指令,直接执行乘除法运算。今天,很多复杂的计算机硬件电路,都可以采用软件方法编程来实现硬件或固件形式,如基于FPGA(Field Programmable Gate Array)的SOPC(System On Programmable Chip)技术。也就是说,计算机系统发展到今天,软、硬件的界限变得越来越模糊。具有相同功能的计算机系统,很难说哪些功能只能用软件实现,哪些功能只能用硬件实现。在满足应用的前提下,其软、硬件功能分配的比例,应从系统的应用、效率、速度、成本、资源状况等多个方面综合考虑,从而对软、硬件取舍进行综合平衡。
1.2.2 计算机系统结构的定义
1.计算机系统结构的含义
计算机系统结构(computer architecture)一词最早由Amdahl等人在1964年提出。定义为由计算机程序设计者所看到的一个计算机系统的属性,即概念性结构和功能特性,这实际上是计算机系统的外特性。显然,不同机器级的使用者看到的计算机属性是不相同的。在计算机技术中,客观存在的事物或属性,从某个角度来看,它好像不存在,称之为透明性。例如,高级语言程序员所看到的计算机属性主要是高级语言系统,以及操作系统、数据库管理系统、网络软件等用户界面。那些汇编语言程序员所看到的计算机属性,例如通用寄存器、中断机构等,对他来说是透明的。可见,不同机器级具有不同的外特性,因而具有不同的计算机系统结构。
传统机器级的系统结构的含义,正是Amdahl等人讨论系统结构的立脚点。这一级处于“虚拟机器”和“实际机器”,也即软件和硬件的交界面,是各级程序设计者所看到的机器物理系统的抽象。在这一级,实际上体现了系统软硬件功能的比例分配和平衡。因此,计算机系统结构研究的是软、硬件之间功能分配及对传统机器级界面的确定,提供机器语言、汇编语言程序员,或编译程序生成系统为其设计或生成的程序能在机器上正确运行,所应看到和遵循的计算机属性。
2007年,John L. Hennessy和David A. Patterson在其新版的权威著作《计算机系统结构——量化研究方法》(Computer Architecture: A Quantitative Approach)中提出,系统结构一词应包含计算机设计的三个方面:指令集系统结构、组成和硬件,后者习惯称为计算机实现。他们所说的指令集系统结构(Instruction Set Architecture,ISA),指的就是传统机器级的系统结构。一般情况下,ISA都被归类为通用的寄存器系统结构,其操作数是寄存器或存储器地址。如80x86拥有16个通用寄存器和16个支持浮点运算的寄存器,MIPS拥有32个通用寄存器和32个浮点寄存器。前者可通过多种指令访问存储器,称为register-memory式ISA,后者只能通过装载和存储指令来访问存储器,称为load-store式ISA。ISA的属性包括:
① 机器内的数据表示,即硬件能直接识别和处理的数据类型。
② 寻址方式,包括最小可寻址单位、寻址类别、地址计算等。
③ 通用或专用寄存器的设置、字长、数量和使用方式。
④ 指令系统,包括机器指令的操作类型、格式、指令间的排序和控制机构等。
⑤ 存储系统组织,包括内存的最小编址单位、编址方式、容量、最大可编址空间等。
⑥ 中断机构,包括中断类型、中断响应、中断向量、中断处理程序功能等。
⑦ 机器工作状态的定义和切换,如管态和目态等。
⑧ 输入/输出结构,包括输入/输出的连接、传送方式、流量、操作结束、出错标志等。
⑨ 信息保护,包括信息保护方式和硬件对信息保护的支持等。
本书侧重于指令系统结构(ISA)的设计与描述,如无特别声明,书中用词“系统结构”均指的是指令集系统结构。
2.计算机组成与实现
计算机组成(computer organization)指的是系统结构的逻辑实现,包括机器级内的数据流和控制流的组成及逻辑设计等。计算机组成的任务是在指令集系统结构确定分配给硬件系统的功能和概念结构之后,研究各组成部分的内部构造和相互联系,以实现机器指令级的各种功能和特性。这种联系包括各功能部件的配置、相互连接和相互作用。
各功能部件的性能参数相互匹配,是计算机组成合理的重要标志,因而相应地就有很多计算机组成方法。例如,设计出层次存储系统和虚拟存储技术来解决主存容量和速度问题。为了平衡输入/输出流量设备和处理器之间的信息流量,研究出通道、外围处理机等方式。为了提高处理机的速度,研究出先行控制、流水线、多执行部件等方式。为了加快运算速度、高效优化运算器结构,出现了多种自动调度算法和组成结构等。
计算机组成要解决的问题是在所希望达到的性能和价格下,怎样最佳、最合理地把各种设备和部件组织成计算机,以实现所确定的ISA。一般情况下,计算机组成设计要确定的方面应包括:
① 数据通路宽度的确定,即数据总线上一次并行传送的信息位数。
② 专用部件的设置,即应设置哪些专用部件,如乘除法器、浮点运算器、字符处理部件、地址运算部件等。专用部件设置的数量与机器要达到的速度、专用部件的使用频率及允许的价格等有关。
③ 各种操作对部件的共享程度;若共享程度高,使用部件会少,但必须分时使用,这又限制了速度。若多设置部件降低共享程度,即操作并行度高可提高速度,但成本也会提高。
④ 功能部件的并行度,功能部件的控制和处理方式是采用顺序串行,还是采用重叠、流水线或分布处理。
⑤ 控制机构的组成方式,事件、操作的排序机构是采用硬联控制还是用微程序控制,是单机处理还是多机处理或功能分布处理。
⑥ 缓冲和排队技术,在不同部件之间怎样设置及设置多大容量的缓冲器来弥补它们的速度差异;是用随机方式,还是FIFO、FILO、优先级或循环方式来安排处理事件顺序。
⑦ 预估、预判技术,用什么原则预测未来行为,以便优化性能。
⑧ 可靠性技术,采用什么样的冗余技术和容错技术来提高可靠性。
例如,AMD Opteron 64和Intel Pentium 4拥有相同的ISA,都执行x86指令系统,但却有完全不同的组成,包括流水线和Cache结构。
计算机实现(computer implementation)是计算机组成的物理实现,包括机器各个部分的物理结构如器件、模块、插件、底板、电源的划分和连接等;物理性能如电参数、传输速度、动态范围、集成度等;制作装配技术如微组装技术、整机装配技术等。其主导作用是器件技术与微组装技术。
3.系统结构、计算机组成与实现之间的关系
系统结构、计算机组成和计算机实现是3个不同而又密切相关的概念。
● 系统结构主要考虑的是计算机系统软、硬件界面的划分。
● 计算机组成是系统结构的逻辑实现。
● 计算机实现是计算机组成的物理实现。
例如,指令系统的确定属系统结构;指令的实现,如取指令、取操作数、运算、送结果等的具体操作及其排序方式属计算机组成;而实现这些指令的功能的具体电路、器件的设计及装配技术属计算机实现。
又如,是否要有乘法指令由系统结构确定;乘法指令由专门的高速乘法器实现,还是用加法-移位方法实现由计算机组成确定;而具体设计乘法器或者加法-移位器硬件属于计算机实现的任务。
还可以主存系统为例,其容量、编址方式取决于系统结构;为达到性能价格要求,主存速度该为多少,逻辑结构是否采用多体交叉属于计算机组成;而存储器件选定、连接电路设计等属于计算机实现。
可见,系统结构决定了组成,而组成设计向下受限于实现技术。还应看到系统结构、组成和实现所包含的具体内容是随不同时期及不同机器而有所不同。在有些计算机系统中作为系统结构的内容,在其他计算机系统中可能作为组成和实现的内容。如高速缓冲存储器先是作为组成的内容提出来,对程序员是透明的。然而,有些机器为了提高高速缓存的效率,设置了高速缓存的管理指令,使程序员参与高速缓存的管理,这样高速缓存有可能成为系统结构的内容。随着计算机技术的发展,软件硬化和硬件软化的普遍实施,特别是VLSI的发展更使得结构、组成和实现融于一体,有时难以区分。
由于计算机组成和计算机实现关系密切,有人将它们合称为计算机实现,即计算机系统的逻辑实现和物理实现。集成电路技术、半导体DRAM、磁盘技术和网络实现技术极大地影响了现代计算机系统结构的实现。
1.2.3 计算机系统设计的主要方法
计算机系统由多级层次组成,从哪一层次开始设计就形成了三种设计方法。
1.“由下往上”(bottom-up)设计
它根据硬件技术水平和现有器件情况,首先设计出微程序机器级和传统机器级,然后在此基础上,再设计操作系统、汇编语言、高级语言等虚拟机器级。早期由于硬件价格昂贵,硬件性能很大程度上决定机器的性能,因此人们更关注硬件结构,而软件技术往往处于被动地位。这种从硬件到软件的设计思路容易形成软、硬件脱节。硬件固定不能改变,在硬件飞速发展的时候,不能及时改进硬件结构;软件又不能获得最新硬件的支持,结果软件繁杂、效率低。这种方法很难适应系统的设计要求,到了20世纪70年代以后很少被人采用。
2.“由上往下”(top-down)设计
这种方法首先考虑如何满足应用要求,确定好针对某一层次的使用者,机器应具有的基本功能和特性,如基本命令、指令或语言结构、数据类型和格式等。然后再逐级往下设计,直到有硬件执行或解释那级为止。每一级都要考虑如何优化上一级实现。这种从应用到实现的设计方法很适合专用机的设计。但是当应用对象或范围变化时,由于软、硬件在设计上脱节,不能利用最新的软件技术,从而使系统效率急剧下降。
3.“由中间开始”(middle-out)设计
这里的“中间”系指软、硬件交界面,一般指在传统机器级与操作系统机器级之间。该方法要求首先对这个界面进行详尽的描述与软、硬件功能分配,同时考虑硬件能为软件提供什么支持。再由此中间点向上向下同时进行设计。软件系统从操作系统、汇编、编译系统进行设计,硬件从传统机器级、微程序机器级、硬联逻辑机器级进行设计。这种方法的优点是避免了软、硬件脱节,设计周期短,有利于优化设计;但设计人员必须具备软硬件知识,还要求有效的软件设计环境和开发工具,从而便于分析、评价和设计。
这种方法引发了计算机系统结构的研究,并很快占据设计方法的主导地位。