计算机系统结构¶
第 1 章 概论¶
从使用语言的角度,一台由软、硬件组成的通用计算机系统可以被看成是按功能划分的多层机器级组成的层次结构。层次结构由高到低依次为应用语言机器级、高级语言机器级、汇编语言机器级、操作系统机器级、传统语言机器级和微程序机器级。具体的计算机系统,其层次数的多少可以有所不同。

对使用某一级语言编程的程序员来讲,只要熟悉和遵守该级语言的使用规定,所编程序就总能在此机器上运行并得到结果,而不用考虑这个机器级是如何实现的。这里,“机器”被定义为能存储和执行相应语言程序的算法和数据结构的集合体。实际上,只有二进制机器指令,即传统所讲的机器语言与机器硬件直接对应,方可直接被硬件识别和执行。
各机器级的实现采用翻译技术或解释技术,或者是这两种技术的结合。
翻译技术是先用转换程序将高一级机器级上的程序整个地变换成低一级机器级上等效的程序,然后在低一级机器级上实现的技术。
解释技术则是在低级机器级上用它的一串语句或指令来仿真高级机器级上的一条语句或指令的功能,是通过对高级机器语言程序中的每条语句或指令逐条解释来实现的技术。
应用语言虚拟机器级 M5 是为满足专门的应用设计的。操作系统程序虽然已经发展成用高级语言(如 C 语言)编写,但最终还是要用机器语言程序或微指令程序来解释。它提供了传统机器语言级 M1 所没有,但为汇编语言与高级语言使用和实现所用的基本操作、命令及数据结构。例如,文件管理、存储管理、进程管理、多道程序共行,多重处理、作业控制等所用的操作命令、语句和数据结构等。因此,操作系统机器级 M2 放在传统机器语言级 M1 和汇编语言机器级 M3 之间是适宜的。传统机器语言级 M1 采用组合逻辑电路控制,其指令可直接用硬件来实现,也可以采用微程序控制,用微指令(L0)程序来解释实现。微指令直接控制硬件电路的操作。
就目前的状况来看,M0 用硬件实现,M1 用微程序实现(固件),M2 到 M5 大多是用软件实现。
所谓固件,是一种具有软件功能的硬件。例如,将软件固化在只读存储器这种大规模集成电路的硬、器件上,就是一种固件。
以软件为主实现的机器成为虚拟机器,以区别于由硬件或固件实现的实际机器。虚拟机器不一定全由软件是吗,有些操作也可用固件或硬件实现。例如,操作系统的某些命令可用微程序或硬件实现。
计算机系统结构的定义和内涵¶
从计算机的层次结构角度来看,系统结构是对计算机系统中各级界面的定义及其上下的功能分配。每级都有其自己的系统结构。
在此,先说明有关“透明”的概念。如果客观存在的事物或属性从某个角度看不到,则称对它是透明的。
不同机器级程序猿所看到的计算机属性是不同的,它就是计算机系统不同层次的界面。系统架构就是要研究对于某级,哪些属性应透明,哪些属性不应透明。
计算机系统结构也称计算机系统的体系结构,它只是系统结构中的一部分,指的是传统机器语言机器级的系统结构。其界面之上包括操作系统级、汇编语言级、高级语言级和应用语言级中所有软件的功能,该界面之下包括所有硬件和固件的功能。因此,它是软件和硬件/固件的交界面,是机器语言、汇编程序设计者或编译程序设计者看到的机器物理系统的抽象。
结论
计算机系统结构研究的软、硬件之间的功能分配以及对传统机器级界面的确定。为机器语言、汇编语言程序设计者或编译程序生成系统设计或生成的程序能在机器上正确运行提供应看到和遵循的计算机属性。
就目前的通用机来说,计算机系统结构的属性包括:
- 硬件能直接识别和处理的数据类型及格式等的数据表示
- 最小可寻址单位、寻址种类、地址计算等的寻址方式
- 通用/专用寄存器的设置、数量、字长、使用约定等的寄存器组织
- 二进制或汇编指令的操作类型、格式、排序方式、控制机构等的指令系统
- 主存的最小编址单位,编址方式、容量、最大可编址空间等的存储系统组织
- 中断的分类与分级、中断处理程序功能及入口地址等的中断机构
- 系统机器级的管态和用户态的定义与切换
- 输入/输出设备的连接、使用方式、流量、操作结束、出错指示等的机器级 I/O 结构
- 系统各部分的信息保护方式和保护机构等属性
从计算机系统结构的内涵可以看出,机器级内部的数据流和控制流的组成、逻辑设计和器件设计等都不属于计算机系统结构,就是说,它们对计算机系统结构设计是透明的。它们属于计算机组成或计算机实现的范畴。
-
计算机组成:
计算机组成指的是计算机系统结构等逻辑实现,包括机器级内部的数据流和控制流的组成以及逻辑设计等。
计算机组成着眼于机器级内部各事件的排序方式与控制机构、各部件的功能及各部件间的联系。
计算机组成设计要确定的方面一般包括:
- 数据通路宽度(数据总线一次并行传送的信息位数)
- 专用部件的设置(是否设置乘除法、浮点运算、字符处理、地址运算等专用部件,设置的数量与机器要达到的速度、价格及专用部件的使用频率等有关)
- 各种操作对部件的共享程度(分时共享使用程度高,虽然限制了速度,但价格便宜。设置部件多降低共享程度,因操作并行度提高,可提高速度,但价格也会提高)
- 功能部件的并行度(是用顺序串行,还是用重叠、流水或分布式控制和处理)
- 控制机构的组成方式(用硬件还是微程序控制,是单机处理还是多机或功能分布处理)
- 缓冲和排队技术(部件间如何设置及设置多大容量的缓冲器来协调它们的速度差。是用随机、先进先出、先进后出、优先级,还是用循环方式来安排事件处理的顺序)
- 预估、预判技术(用什么原则为优化性能预测未来行为)
- 可靠性技术(用何种冗余和容错技术来提高可靠性)
-
计算机实现:
计算机实现指的是计算机组成的物理实现,包括处理机、主存等部件的物理结构,器件的集成度和速度,器件、模块、插件、地板的划分与连接,专用器件的设计,微组装技术,信号传输,电源、冷却及整机装配技术等。
计算机实现的设计着眼于器件技术和微组装技术,其中,器件技术起着主导作用。
【例 1-2】¶
指令系统的确定属于计算机系统结构。
指令的实现,如取指令、指令操作码译码、计算操作数地址、取数、运算、送结果的操作安排和排序属于计算机组成。实现这些指令功能的具体电路、器件的设计及装配技术属于计算机实现。
确定指令系统中是否要设置乘法指令属于计算机系统结构。乘法指令是用专门的高速乘法器实现,还是靠用加法器和移位器经一连串时序信号控制其相加和右移来实现,属于计算机组成。
乘法器、加法-移位器的物理实现,如器件的类型、集成度、数量、价格,以及微组装技术的确定和选择属于计算机实现。
【例 1-3】¶

从层次结构角度看,IBM370 系列中不同型号的机器从高级语言机器级、汇编语言机器级到传统语言机器级都是相同的。只是使用不同的组成和实现、不同微程序机器级使机器性能、价格不同。因此,设计何种系列机属于计算机系统结构,而系列内不同型号计算机的组织属于计算机组成。
IBM 370 系列的中央处理器都有相同的机器指令和汇编指令系统,只是指令的分析、执行在低档机上采用顺序方式进行,在高档机上则采用重叠、流水或其他并行处理方式。
数据总线宽度对程序员是透明的,是不需要知道的。
IBM 370 系列的各档机器都采用通道方式进行输出/输出,但在计算机组成上,低档机器可以采用结合型通道,让通道的功能借用中央处理机的某些部件完成,同一套硬件分时执行中央处理机和通道的功能,虽然系统速度性能低,但可以降低成本。而高档机器上采用独立性通道,单独设置通道硬件,与中央处理机并行,成本虽高,但系统速度提高了。
结论
机器/汇编指令系统、数据表示、是否采用通道方式输出/输出的确定属于计算机系统结构;指令采用顺序、重叠、流水还是其他方式解释,数据通路宽度的确定,通道采用结合型还是独立型,则属于计算机组成。
【例 1-4】¶
DEC 公司早先推出的 PDP-11 系列是以单总线结构著称的,它不属于计算机系统结构。
对于 PDP-11 或后来的 VAX-11 来说,单总线结构属于计算机组成,其机器级的 I/O 连接和使用方式才属于计算机系统结构,是程序设计者编写 I/O 程序时应当看到的。
计算机系统结构、组成和实现的相互关系和影响¶
计算机系统结构、组成、实现三者互不相同,但又相互影响。
一种组成可有多种不同的实现方法。这取决于要求的性能价格比及器件技术状况。
【例 1-5】¶
组成也会影响结构。微程序控制就是一个范例。通过改变控制存储器中的微程序,就可以改变系统的机器指令,改变结构。在一台计算机上提供对应多种指令系统的微程序,动态切换,结构可变,这是硬联控制组成技术无法做到的。
因此,系统结构的设计必须结合应用考虑,为软件和算法的实现提供更多、更好的支持,同时还要考虑可能采用和准备采用的组成技术。
组成设计向上决定于结构,向下受限于技术。然而,它们是可以与实现折中权衡的。
结构、组成和实现所包含的具体内容随着不同的时期及不同的计算机系统也会有差异。
结论:计算机系统结构设计的任务是进行软、硬件的功能分配,确定传统机器级的软、硬件界面。因此,它研究的是软、硬件的功能分配以及如何更好、更合理地实现分配给硬件的功能。
软、硬件取舍的基本原则¶
软、硬件的功能分配是计算机系统结构的主要任务,而软件和硬件在逻辑功能上又是等效的。
【例 1-6】¶
编译程序、操作系统等许多用机器语言子程序实现的功能,完全可以用组合电路硬件或微程序固件来解释实现。
原则1:
应考虑在现有硬、器件(主要是逻辑器件和存储器件)条件下,系统要有高的性能价格比,主要从实现费用、速度和其他性能要求来综合考虑。
结论:
只有对产量大的计算机系统,增大硬件功能实现的比例才是适宜的。如果用硬件实现不能给用户带来明显的好处,产量仍较低,则系统是不会有生命力的。
原则2:
要考虑到准备采用和可能采用的组成技术,使之尽可能不要过多或不合理地限制各种组成、实现技术的采用。
原则3:
不能仅从“硬”的角度考虑如何便于应用组成技术的成果和便于发挥器件技术的进展,还应从“软”的角度把如何为编译和操作系统的实现以及为高级语言程序的设计提供更多、更好的硬件支持放在首位。
结论:
应当进一步缩短高级语言和机器语言、操作系统与计算机系统结构、程序设计环境(如模块化、数据类型抽象)等与计算机系统结构之间存在的语义差距。
计算机系统的定量设计原理¶
在设计计算机系统时,一般应遵循如下的定量设计原理:
-
哈夫曼(\(Huffman\)) 压缩原理
尽可能加速处理高概率的事件远比加速处理概率很低的时间对性能的提高要显著。
-
\(Amdahl\) 定律
该定律可用于确定对系统中性能瓶颈部件采取措施提高速度后系统性能改进的程度,即系统加速比 \(S_{p}\)。
系统加速比 \(S_{p}\) 定义为系统改进后的性能与未改进时的性能的比值,或者定义为系统未改进时的程序执行时间 \(T_{old}\) 与改进后的程序执行时间 \(T_{new}\) 的比值。
系统加速比 \(S_{p}\) 与两个因素有关,即性能可改进比 \(f_{new}\) 和部件加速比 \(r_{new}\)。
性能可改进比 \(f_{new}\) 是系统性能可改进部分占用的时间与未改进时系统总执行时间的比值,显然,\(0 \le f_{new} \le 1\)。
部件加速比 \(r_{new}\)是系统性能可改进部分在改进后性能提高的比值,不难看出,\(r_{new} \ge 1\)。
这样,系统加速比为
\[ S_{p} = \frac{T_{old}}{T_{new}}=\frac{1}{(1-f_{new})+f_{new}/r_{new}} \]式中,分母的 \(1-f_{new}\) 为不能改进性能这部分的比例。
可见,当系统性能可改进比 \(f_{new}\) 为 \(0\) 时,\(S_{p} = 1\);而当部件加速比 \(r_{new}\) 趋于无穷大时,分母中的 \(f_{new}/r_{new}\) 将趋于 \(0\)。这里有
\[ S_{p}=\frac{1}{1-f_{new}} \]就是说,性能提高的幅度受限于性能改进部分所占的比例大小,而性能改善的极限又受性能可改进比 \(f_{new}\) 的约束。
\(Amdahl\) 定律告诉我们,改进效果好的高性能系统应是一个个部分性能均能平均得到提高的系统,不能只是其中某个功能部件性能的提高。
-
程序访问的局部性定律
程序访问的局部性包括了时间上和空间上的两个局部性。
时间上的局部性指的是现在正使用的信息可能不久还要使用,这是因为程序存在循环。
空间上的局部性指的是最近的将来要用到的信息很可能与现在正在使用的信息在程序位置上是邻近的,这是因为指令通常是顺序存放、顺序执行的,数据通常也是以向量、阵列、树、表等形式簇聚地存放在一起的。
计算机系统设计的主要任务¶
计算机系统设计的主要任务包括系统结构、组成和实现的设计。
计算机系统设计首先要根据市场和应用的情况。确定用户对计算机系统的功能、性能和价格的要求。其中,应用软件对功能的确定起主要作用。
- 要弄清其应用领域是专用的还是通用的。
- 要弄清软件兼容是放在哪级层次。
- 要弄清对操作系统有何要求。
- 要如何保证有高的标准化程度。对现有国际标准和国家标准应尽可能遵守,如各种浮点数标准、总线标准、网络标准、程序语言标准等。
在系统的功能确定后,就要考虑如何优化系统的设计,使之能有高的性能价格比。其中关键的是要考虑如何使软件和硬件功能的分配更为合理。协调平衡好软、硬件功能分配的比例,就能使系统获得更高的性能价格比。
在选择设计方案时,还要注意如何降低设计的复杂性。
系统结构设计应适应硬件技术、软件技术、器件技术、应用要求的发展变化。
硬件设计还要考虑有好的易扩性、兼容性,以便日后系统的升级换代。
计算即系统的设计方法¶
从多级层次结构出发,计算机系统的设计按多级层次结构的由上、下、中开始设计可以有“从上往下”、“从下往上”、“由中间开始”3种不同的设计方法。
-
“由上往下”设计,也称“由顶向底”设计。
它是先考虑如何满足应用要求,定好面向应用的那个虚拟机器级的特性和工作环境,再逐级向下设计,每设计下一级都考虑对上一级是优化的。这样设计出来的计算机系统必然是高效的。这是一种环境要求比较稳定的专用机的设计方法,无法用于通用机的设计。
“由上往下”设计是一种串行设计方法,设计周期较长。即使是“由上往下”设计,其传统机器级和微程序机器级一般都是在已有机器中“选型”,并不专门设计,也就是实际上难以真正做到面向应用是优化的。
-
“由下往上”设计,也称“由底向顶”设计。
它是先不管应用要求,只根据目前能用的器件,参照、吸收已有各种机器的特点,将微程序机器级(如果采用微程序控制)和传统机器级研制出来。然后,加适配用于不同应用领域的多种操作系统和编译系统软件,使应用人员可以依据不同的语言类型、数据形式,采用合适的系统软件和算法来满足应用的需要。
“由下往上”设计也是串行设计,同样也会延长设计周期。因此,这种设计在硬、器件技术飞速发展的今天来说,已很少采用。
-
“从中间开始”向两边设计。这是通用机一般采用的方法。
它可以克服“由上往下”和“由下往上”两种设计方法中,软、硬件设计分离和脱节的致命缺点。
“从中间开始”设计是选择从层次结构的主要软、硬界面开始设计,即在传统机器语言级与操作系统机器级之间进行合理的软、硬件功能分配。既要考虑到硬、器件的现状和发展,又考虑到可能使用的算法和数据结构,定义好这个界面,确定哪些功能由硬件实现,哪些功能由软件实现。同时,考虑硬件能对操作系统、编译系统的实现提供什么样的支持。然后,由这个中间界面分别向上、向下同时进行软、硬件的设计。
软件和硬件并行设计,大大缩短了系统的设计周期。这是一种比较好的交互式设计方法。当然,这要求设计者应同时具备丰富的软件、硬件、器件和应用等方面的知识。又由于软件设计周期一般比较长,为了能在硬件研制出来之前开展软件的设计测试,还应具备有效的软件设计环境和开发工具。
随着 VLSI 技术的迅速发展,硬件价格不断下降,软件却变得日益复杂,软件设计时间和费用在不断增大,加上对软件基本单元操作不断深入的认识,促使软、硬件界面上升,即现有软件功能将更多地由硬件完成,或者说硬件为软件设计提供更多的支持。
计算机设计的步骤大体是先进行需求分析。根据需求分析相应地写出需求分析说明书。接下来进行概念设计,最后通过模拟、测试,反复对所设计的系统进行优化和性能评价,使系统获得尽可能高的性能价格比。
软件发展对系统结构的影响¶
在系统结构设计时,提出应在新的系统结构上解决好软件的可移植性问题。
软件的可移植性(Portability)指的是软件不修改或只经少量修改就可由一台机器转移到另一台机器上运行,同一软件可应用于不同的环境。实践证明可靠的软件就能长期使用,不会因为机器更新需重新编写。
实现软件移植的技术主要有如下几种:
-
统一高级语言
由于高级语言时面向题目和算法的,与机器的具体结构关系不大,如果能统一出一种科满足各种应用需要的通用高级语言,那么用这种高级语言编写的应用软件就可以移植于不同的机器。如果操作系统的全部或一部分用这种高级语言编写,则系统软件中的这部分也可以移植。所以实现软件移植的一种技术就是如何统一高级语言,设计出一种完全通用的高级语言,为所有程序员使用。
至今虽然已有上百种高级语言,但没有一种是对各种应用真正通用的高级语言。这有以下几方面原因:
- 不同的用途要求语言的语法、语义结构不同。
- 人们对语言的基本结构看法不一。
- 即使同一种高级语言在不同厂家上的机器上也不能完全通用。
- 受习惯势力阻挠,人们不愿抛弃惯用的语言,因为熟悉、有经验,也不愿抛弃长期积累的、用原有语言编写并已被实践证明是正确的软件。
虽然统一高级语言很困难,但从长远看,仍是必须解决的重要问题。统一成一种或相对统一成少数几种高级语言对于节约软件研制的人力、物力和费用,加快人员的培养都有重要意义。
-
采用系列机
受相对统一成少数几种高级语言的启发,如果能在一定范围内不同型号的机器之间统一汇编语言,就可以在一定程度上解决汇编语言软件的移植问题。
系列机与前述的“从中间向两边”设计相呼应。
这种技术只能应用在结构相同或相似的机器之间的汇编程序的软件移植。
系列机较好地解决了软件环境要求相对稳定和硬、器件技术迅速发展的矛盾。
为了能使软件长期稳定,就要在相当长的时期里保证系列机结构基本不变,因此,在确定系列机结构时要非常慎重。其中最主要的是确定好系列机的指令系统、数据表示及概念性结构。
系列机的出现是计算机发展史上一个重要的里程碑。
由于系列内各档机器从程序设计者角度看,都具有相同的机器属性,因此按此属性编制的机器语言程序及编译程序都能不加修改地通用于各档机器,这种情况下的各档机器被称为是软件兼容(Software Compatibility)的,它们的区别仅在于运行时所需的时间不同。可见,这里的软件兼容是通过采用相同的系统结构来实现的。原则上讲,编译软件在一个系列内的各档机器上可共用一套,但操作系统就不同。由于操作系统级位于汇编语言机器级之下,更接近具体机器硬件,所以当机器间的组成、实现差别较大时,往往还需要修改或重新设计。
系列内各档机器之间的软件兼容从速度上和性能上有向上兼容和向下兼容的不同。向上(下)兼容指的是按某档机器编制的软件,不加修改就能运行于比它高(低)档的机器上。同一系列内的软件一般应做到向上兼容,但向下兼容就不一定,特别是于机器速度有关的实时性软件向下兼容就难以做到。而低档机器上的软件在高档机器上运行一般总是可以通过的,只是机器效率没有得到充分发挥而已。
随着器件价格的下降,为适应性能不断提高或应用领域不断扩大的需要,系列内后续研制出来的各档机器的系统结构应允许发展和变化。但这种改变只能是为提高性能所做的必要扩展,而且往往只是从改进系统软件(如编译软件)的性能出发来修改系统结构,尽可能不影响高级语言应用软件的兼容,尤其是不能缩小或删除运行已有软件的那部分指令和结构。
系列机发展新型号机器最主要的必须是保证应用软件的向后兼容。

在要求汇编语言程序兼容的前提下,系统结构的发展是很有限的,有时连突破性的组成技术都无法采用。所以,这种软件兼容性要求到一定时候会反过来阻碍计算机系统结构的进一步变革。
因此,已积累的大量汇编语言应用软件资源不应轻易抛弃。同时为使新的系统结构有生命力,系列机概念和软件兼容性约束仍是设计新机器或新系列时所必须遵循的,只是到一定时候,不能固守旧系列,而要发展新系列。
-
仿真和模拟
-
模拟
系列机只能在系统结构相同或相近(允许向后稍许发展)的机器之间实现汇编语言软件的移植。为实现不同系统结构的机器之间的机器语言软件移植,就必须做到在一种机器的系统结构上实现另一种机器的系统结构。从系统结构的主要方面——指令系统来看,就是要在一种机器上实现另一种机器的指令系统,即另一种机器语言。
这种用机器语言程序解释实现软件移植的方法称为模拟(Simulation)。进行模拟的 A 机器称为宿主机,被模拟的 B 机器称为虚拟机。
为了使虚拟机的应用软件能在宿主机上运行,除了模拟虚拟机的机器语言外,还得模拟其存储体系、I/O 系统和控制台的操作,以及形成虚拟机的操作系统。让虚拟机的操作系统受宿主机操作系统的控制,如图所示:

实际上是把它作为宿主机的一道应用程序,使原来分别在宿主机和虚拟机上运行的应用软件可以在宿主机上共同执行。所有为各种模拟所编制的解释程序统称为模拟程序。
模拟程序的编制是非常复杂和费时的。同时,虚拟机的每条机器指令是不能直接被宿主机的硬件执行的,需要经相应的由多条宿主机机器指令构成的解释程序来解释,这使得模拟的运行速度显著降低,实时性变差。
模拟方法只适合于一直运行时间短,使用次数少,而且在时间关系上没有约束和受限制的软件。
-
仿真
如果宿主机本身采用微程序控制,那么模拟时,一条 B 机器指令的执行就需要经过二重解释:先经 A 机器的机器语言程序解释,然后每条 A 机器指令又经一段微程序解释。
如果能直接用微程序去解释 B 机器的指令,如图所示,显然就会加快这一解释过程。这种用微程序直接解释另一种机器指令系统的方法就称为仿真(Emulation)。进行仿真的 A 机器称为宿主机,被仿真的 B 机器称为目标机。

这仿真所写的解释程序称为仿真微程序。于模拟一样,除了仿真目标机的指令系统之外,还要仿真其存储体系、I/O 系统和控制台的操作。
仿真和模拟的主要区别在于解释用的语言。仿真时用微程序解释,其解释程序存储于控制存储器中;而模拟是用机器语言程序解释,其解释程序存储于主存中。
仿真方法可以提高被移植软件的运行速度,但由于微程序机器级结构深深依赖于传统机器级结构,故当两种机器结构差别较大时,就很难仿真,特别是 I/O 系统差别较大时更是如此。
-
模拟和仿真的选择
不同系列间的软件移植一般是仿真和模拟并行。频繁使用的易于仿真的机器指令宜用仿真,以提高速度;很少使用的、难以仿真的指令及 I/O 操作宜用模拟。即使两种机器差别不大,往往也需用模拟来完成机器间的映像。
-
结论:
- 统一高级语言可以解决结构相同或完全不同的机器间的软件移植,从长远看是方向,但目前难以解决,只能做相对统一。
- 系列机是当前普遍采用的办法,但只能实现统一系列内的软件兼容,虽然允许发展、变化,但兼容的约束反过来会阻碍系统结构取得突破性的进展。
- 模拟灵活,可实现不同系统间的软件移植,但结构差异太大时,效率、速度回急剧下降。
- 仿真在速度上损失小,但不灵活,只能在差别不大的系统之间使用,否则效率也会过低且难以仿真,需与模拟相结合才行。
- 此外,发展异种机联网也是实现软件移植的一种途径。
20 世纪 80 年代,国际标准化组织(ISO)提出了发展开放式系统(Open System)的概念。设计出一种既独立于厂商,又遵循有关国际标准,使之具有可移植性、可交互操作性,让用户可以自由选择不同实现技术和多厂家产品的系统集成技术的系统。
随着软件工程的发展,软件设计工具、环境的建立和完善,以及应用软件越来越多改用高级语言编写,不一定非得把汇编语言级的软件兼容放在的首位,而是注意实现操作系统兼容。用户希望更新系统时,不必重新学习如何使用机器。因此,微型机操作系统种类繁多,但其操作系统却只有少数几种。所以,系统结构设计应注意解决操作系统的兼容问题。
应用的发展对系统结构的影响¶
各种应用对结构设计会提出范围广泛的要求。其中,程序可移植、高性能价格比、便于使用、减少命令种类、简化操作步骤、高可靠性、便于维护等都是基本的要求。
IBM 公司在 20 世纪 60 年代中期推出了 IBM360 等一批多功能通用机,并采用系列机,提供性能、价格不同的各档机器。用户可根据不同应用需要来选购,包括外设数量、规格、主存规模均可选购。这标志着计算机工业开始走向成熟。这样的方式利于软件积累,使计算机发展进入良性循环。
回顾这几十年的发展,巨、大、中、小、微、亚微、微微型机的性能、价格随时间变化的趋势大致如下图所示,其中虚线为等性能线。

图 1-8 各种机器性能、价格随时间变化的趋势
计算机的性能是硬件性能(主频、CPU 运算速度、字长、数据类型看、主存容量、寻址范围、存储体系、I/O 处理能力、I/O 设备量、指令系统等)、软件性能(高级语言状况、操作系统功能、用户程序包的配置等)、可靠性、可用性等多种指标的综合。
微型机的发展有两个趋势:
- 利用 VLSI 的发展,维持价格提高性能,向小型机靠拢;
- 维持性能降低价格,发展更低档的亚微型和微微型(掌上型)计算机,进一步扩大应用。
在性能上,高档的微型机替代低档的小型机以及超级小型机,高档的超级小型机代替低档的大、中型机是推动大、中、小、微各型机器不断提高其性能的重要因素
计算机工业在处理性能和价格的关系上大致也是这两种趋势:
- 维持价格、提高性能。沿图 1-8 中的水平实线发展
- 维持性能,降低价格,沿图 1-8 中的虚线向下发展
不断降低价格,可促进计算机的推广和应用,反过来对计算机工业的迅速发展起到更为重要的作用。
从系统结构的观点来看,各型(档)计算机性能随时间的推移,其实就是在低档(型)机上引用甚至照搬高档(型)机的结构和组成。当然,使用对象不同,也允许小型机和微型机的结构组成有所创新。
对巨、大型机来说,为满足高速、高性能,就要不断研制新的结构和组成,否则难以推出更高性能的计算机。巨、大型机一般采取维持价格、提高性能或提高价格、提高性能来研究和采用新的结构及组成。
为保持小、微型机的便宜价格水平,从结构和组成上采用为不同用途提供相应选购件或扩展部件的做法是可取的。
随着应用领域的扩充,应用要求的提高,必然要求研制优化于这种应用的系统结构。应注意在不破坏软件兼容的前提下, 将专用机研制的系统结构成果迅速转移到通用机上,提高通用机的功能和性能,使其得到推广。
计算机应用可归纳为向上升级的 4 类:
- 数据处理(Data Processing)
- 信息处理(Information Processing)
- 知识处理(Knowledge Processing)
- 智能处理(Intelligence Processing)
20 世纪 90 年代后期,计算机已逐渐转入知识处理领域,并进而发展为智能处理。为此,必将促使计算机系统结构在支持高速并行处理、自然语言破解、知识获取、知识表示、知识利用、逻辑推理、智能处理等方面有新的进展和突破。
器件的发展对系统结构的影响¶
计算机所用器件已从电子管、晶体管、小规模集成电路、大规模集成电路迅速发展到超大规模集成电路,并使用或开始使用砷化镓器件、高密度组装技术和光电子集成技术。在此期间,器件的功能和使用方法发生了很大变化,由早先使用非用户片,发展到现场片和用户片,它影响着结构和组成技术的发展。
非用户片也称通用片,其功能是由器件厂家生产时固定的,器件的用户(即机器设计者)只能使用,不能改变器件内部功能。其中,门电路、触发器、多路开关、加法器、译码器、寄存器、计数器等逻辑类器件的集成度难以提高。因为它将使器件引线倍增,并影响到器件的通用性。相比之下,存储类器件适应于集成度的提高,容量增大一倍,只增加一个地址输入端,通用性反而更强。由于销量大,厂家愿意改进工艺,进一步提高其性能,降低其价格。
20 世纪 70 年代中期出现了现场片,用户根据需要可改变器件内部功能。
用户片是专门按照用户要求生产的高集成度的 VLSI 器件,完全按用户要求设计的用户片称为全用户片。全用户片由于设计周期长,设计费用高,销量小,成本高,器件厂家一般不愿意生产。为解决器件厂与整机厂的矛盾,发展门阵列、门-触发器阵列等半用户片不失为一种好的选择。生产工序基本按通用片进行,仅最后在门电路或触发器间连线时按用户要求制作。
一般同一系列内各档机器可分别用通用片、现场片或用户片实现。就是同一型号机器也是先用通用片或现场片实现,等机器成熟并取得用户信任后,再改用半用户片或全用户片实现。至于高速机器一般一开始就用门阵列片或用户片,只有这样,才能发挥出单元电路的高速性。
器件的发展改变了逻辑设计的传统方法。应当考虑采用什么样的组成能充分利用 VLSI 器件技术发展带来的好处,以及选用什么样的 VLSI 器件能使机器性能价格比更高。应着眼于在满足系统结构所提出的功能和速度的要求下,缩短设计周期,提高系统效能及可使用批量生产的通用 VLSI 片。同时,对于使用现场片的计算机,只用过去那些硬的逻辑设计方法是不行的,更主要的是应用诸如微汇编、微高级语言、计算机辅助设计等软的方法来设计。对于使用用户片的计算机,机器设计和芯片设计密不可分,机器设计的关键就是芯片设计。要保证芯片利用率,必须采用计算机辅助设计,机器设计者是通过辅助设计系统来参与用户片的设计的。
几十年来,器件的速度(门、触发器的级延迟,存储器的存储周期等)、集成度、体积、可靠性、价格都随时间呈指数地改进,使计算机的性能价格比有了显著提高。
器件的发展是推动结构和组成前进的关键因素。计算机组成的发展反过来也会促使器件发展。
器件发展加速了结构的“下移”。大型机的各种数据表示、指令系统、操作系统很快出现在小、微型机上。器件的发展为多 CPU 分布处理、智能终端、智能机的发展提供了基础。
器件的发展促进了算法、语言和软件的发展。
系统结构设计者要密切了解器件的现状和发展,关注和分析新器件会给计算机系统结构带来什么样的新途径和新方向。
结论:软件、应用、器件对计算机系统结构的发展有着很大的影响,反过来,计算机系统结构的发展又会对软件、应用、器件提出新的发展要求。结构设计不仅要了解结构、组成、实现,还要充分了解软件、应用、器件的发展,这样才能对计算机系统结构进行有效的设计、研究和探索。
并行的概念与开发¶
器件技术,尤其是微电子技术的迅速发展是促进计算机和系统性能迅速改进的关键和基础。
系统结构和并行处理(Parallel Processing)技术的发展是至关重要的。
无论是数值计算、数据处理、信息处理、知识处理,还是智能处理,都隐含有同时进行运算或操作的成分。解题中具有可以同时进行运算或操作的特性,称为并行性(Parallelism)。
并行性包含同时性和并发性二重含义。
同时性(Simultaneity)指两个或多个事件在同一时刻发生。
并发性(Concurrency)指两个或多个事件在同一时间间隔内发生。
开发并行性的目的是为了能并行处理,以提高计算机解题的效率。
从不同角度,并行性有不同的等级。
-
从计算机系统执行程序的角度来看,并行性等级由低到高可分为四级:
- 指令内部——一条指令内部各个微操作之间的并行执行
- 指令之间——多条指令的并行执行
- 任务或进程之间——多个任务或程序段的并行执行
- 作业或程序之间——多个作业或多道程序的并行执行
-
从计算机系统中处理数据的角度来看,并行性等级从低到高可以分为四级:
- 位串字符——同时只对一个字的一位进行处理,这通常是指传统的串行单处理机,没有并行性。
- 位并字符——同时对一个字的全部位进行处理,这通常是指传统的并行单处理机,开始出现并行性。
- 位片串字并——同时对许多字的同一位(称位片)进行处理,开始进入并行处理领域。
- 全并行——同时对许多字的全部或部分位组进行处理。
-
并行性是贯穿于计算机信息加工的各个步骤和阶段的,从这个角度看,并行性等级又分为:
- 存储器操作并行——可用单体单字、多体单字或多体多字方式在一个存储周期内访问多个字,进而采用按内容访问方式在一个存储周期内用位片串字并获全并行方式实现对存储器中大量字的高速并行比较、检索、更新、变换等操作。典型的例子就是并行存储器系统和以相联存储器为核心构成的项链处理机。
- 处理器操作步骤并行——指令的取指、分析、执行,浮点加法的求阶差、对阶、尾加、舍入、规格化等操作,执行步骤在时间上重叠流水地进行。典型的例子就是流水线处理机。
- 处理器操作并行——通过重复设置大量处理单元,让它们在同一控制器控制下按同一指令要求对向量、数组中各元素同时操作。典型的例子就是阵列处理机。
- 指令、任务、作业并行——这是较高级的并行。虽然它也可以包含操作、操作步骤等较低级的并行,但与操作级并行不同。指令级以上的并行时多个处理机同时对多条指令和相关的多数据组进行处理,操作级并行是对同一条指令及其相关的数据组进行处理。前者属于多指令流多数据流计算机,后者属于单指令流多数据流计算机。典型的例子就是多处理机。
在特定时期里,器件的发展会因物理工艺、价格等条件的限制而有一定的限制。在同一种器件技术水平上,进一步提高计算机系统性能的有效途径就是开发并行性,挖掘潜在的并行能力,提高并行处理和操作的程度。
并行性开放的途径¶
开发并行性的途径有时间重叠、资源重复和资源共享等。
-
时间重叠(Time Interleaving)
是在并行性概念中引入时间因素,让多个处理过程在时间上相互错开,轮流重叠地使用同一套硬件设备的各个部分,加快硬件周期来赢得速度。

-
资源重复(Resource Replication)
是在并行概念中引入空间因素,通过重复设置硬件资源来提高可靠性或性能。双工系统是通过使用两台相同的计算机完成同一任务来提高可靠性的。
资源重复不仅可以提高可靠性,还可以进一步用成百上千万台微处理机互连构成多计算机或机群系统,提高系统的速度性能。

-
资源共享(Resource Sharing)
是用软件方法,让多个用户按一定时间顺序轮流使用同一套资源来提高资源利用率,相应地也就提高了系统的性能。
多道程序分时系统是典型的资源共享实例。它通过共享 CPU、主存,以降低系统价格,提高设备利用率。资源共享不仅是 CPU、主存、外设等硬件资源的共享,也包括软件、信息资源的共享。
结论:计算机系统通过各种技术途径,从不同角度和不同并行性等级上同时采取多种并行性措施,可以是执行程序方面的,也可以是处理数据方面的,还可以是在信息加工不同步骤和阶段上的。当并行性上升到一定季节形成新的结构时,就进入到并行处理的专门领域,如执行程序的并行性达到任务或进程级,处理数据的并行性达到位片串字并。并行处理是信息处理的一种有效形式,它着重发掘解题过程中的并行性。并行性的开发和并行处理技术的研究实际上是硬件、软件、语言、算法、性能评价的综合。
计算机系统的并行性发展¶
多处理机、多计算机系统是目前 MPP 计算机研究和开发的热点,某些产品已进入市场。由数十至上千台微处理机组成的小、中规模并行处理机已进入实用和商品化阶段。多处理机包括多向量机及机群系统是今后并行处理计算机发展的准流。
目前性能最好的计算机离应用所要求的目标还有较大距离。因此,在现代 MPP 系统的研究中,除了需要开发硬件结构外,还要解决提供好的软件环境和系统的可用性、可扩展性等问题,希望软件和算法在并行性方面有新的突破。目前正研究和形成用共享虚拟存储器的异构型计算机网络来求解大型问题的处理技术。
多机系统的耦合度¶
多机系统包括多处理机系统和多计算机系统。多处理机系统和多计算机系统是有差别的。
多处理机系统是由多台处理机组成的单一系统,各处理机都有自己的控制部件,可带本地存储器,能执行各自的程序,但都受逻辑上同一的操作系统控制。处理机之间以文件、单一数据或项链、数组等形式交互作用,全面实现作业、任务、指令、数据各级的并行。
多计算机系统则是由多台独立的计算机组成的系统。各计算机分别在逻辑上独立的操作系统控制下运行,计算机之间可以互不通信,即使通信也只是经通道或通信线路以文件或数据集形式进行,实现多个作业间的并行。
一般用耦合度反映多机系统中各机器之间物理连接的紧密度和交叉作用能力的强弱,有最低耦合、松散耦合和紧密耦合之分。
各种脱机处理系统是最低耦合系统(Least Coupled System),其耦合度最低,除通过某种存储介质外,各计算机之间无物理连接,也无共享的联机硬件资源。例如,独立外围计算机系统由主机和外围计算机组成,后者脱机工作,只通过磁盘、磁带等对主机的输入/输出提供支持。
如果多台计算机通过通道或通信线路实现互连,共享某些如磁带、磁盘等外围设备,以较低频带在文件或数据集一级相互作用,则这种系统被称为松散耦合系统(Loosely Coupled System)或间接耦合系统(Indirectly Coupled System)。它有两种形式:一种是多台功能专用的计算机通过通道和共享的外围设备相连,各计算机以文件或数据集形式将结果送到共享的外设,供其他计算机继续处理,使系统获得较高效率;另一种是各计算机经通信线路互连成计算机网,各取所长,求得更大范围内的资源共享。这两种形式一般都是非对称的(由不同类型的计算机组成)并采用异步工作方式,结构较灵活,系统已扩展,但需花费辅助操作开销,且系统信息的传输频带较窄,难以满足任务一级的并行处理,因而特别适合于分布处理。
如果多台计算机经总线或高速开关互连,共享主存,有较高的信息传输速率,可实现数据集一级、任务级、作业级并行,则称此系统为紧密耦合系统(Tightly Coupled System)或直接耦合系统(Directly Coupled System)。它可以是主辅机方式配合工作的非对称型系统,但更多的是对称型多处理机系统,在统一的操作系统管理下追求各处理机高效率和负荷的均衡。
计算机系统的分类¶
从不同观点、不同角度可对现有计算机系统提出多种不同的分类方法。这里着重介绍弗林分类法。
1966年,弗林提出按指令流和数据流的多倍性对计算机系统分类。
指令流是指机器执行的指令序列。
数据流是指由指令流调用的的数据序列。包括输入数据和中间结果。
多倍行是指在系统性能瓶颈部件上处于同一执行阶段的指令数或数据的最大可能个数。据此,把计算机系统分成单指令流单数据流(Single Instruction Stream Single Data Stream,SISD)、单指令流多数据流(Single Instruction Stream Multiple Data Stream,SIMD)、多指令流单数据流(MISD)和多指令流多数据流(MIMD)四大类。对应于者四类计算机的基本结构框图如下图所示:

SISD 系统如 a 所示,是传统的单处理器计算机。尽管它可以设置多个并行的存储体和多个操作部件,但指令部件每次只对一条指令译码,只对一个操作部分分配数据,均属 SISD 系统。流水方式的单处理计算机也可归入 SISD 系统。
SIMD 系统如 b 所示,具有代表性的例子是阵列处理机和相联处理机。如果把“多倍性”定义中的“处于同一执行阶段”理解为一条指令的操作全过程,则流水线处理机也可包括在内。
MISD 系统如 c 所示,它由 n 个处理单元,按 n 条不同指令的要求对同一个数据流及其中间结果进行不同的处理,一个处理单元的输出作为另一个处理单元的输入,这类系统在实际中很少见,因为在指令级并行,而在数组级却未并行,与高一级并行通常包含低一级并行的做法不符。不过有人把处理机间的宏流水及脉动阵列流水机都归属于 MISD 系统。
MIMD 系统是指能实现作业、任务、指令和数组各级全面并行的多机系统。d 图是 n 个处理机共享主存的紧密耦合多处理机。不直接共享主存的松散耦合多处理机及多计算机系统也属于 MIMD 系统。它是多个独立的 SISD 单处理机系统的集合,也称多倍 SISD 系统(MSISD)。
弗林分类法能反映出大多数计算机的并行工作方式和结构特点,使用范围较广,但只能对控制流机器分类。像数据流计算机就无法用这种方法分类,而且对广泛使用的流水线处理的分类也不确切。这种分类有时难以反映系统工作原理上的特色。
1978年,库克提出用指令流和执行流及多倍性来描述计算机系统总控制器的结构特点。这样,他将计算机系统也分成四类:
- 单指令流单执行流(SISE)——典型的单处理机系统
- 单指令流多执行流(SIME)——带多操作部件的处理机
- 多指令流单执行流(MISE)——带指令级多道程序的单处理机
- 多指令流多执行流(MIME)——典型的多处理机系统
1972年,冯泽云提出了用数据处理的并行度来定量地描述各种计算机特征的冯氏分类法。他把计算机系统分成四类:
- 字串位串(WSBS)——称位串处理方式
- 字串位并(WSBP)——称字(字片)处理方式
- 字并位串(WPBS)——称位(位片)处理方式
- 字并位并(WPBP)——称全并行处理方式
此外,还可以从对执行程序或指令的控制方式上,将计算机系统分为由控制驱动的控制流方式,由数据驱动的数据流方式,按需求驱动的归约(Reduction)方式,以及按模式驱动(Pattern Driven)的匹配(Matching)方式等。
第 2 章 数据表示、寻址方式与指令系统¶
数据表示与数据结构¶
数据表示指的是能由计算机硬件识别和引用的数据类型,表现在它有对这种类型的数据进行操作的指令和运算部件。
串、队、栈、向量、阵列、链表、树、图等事软件要处理的各种数据结构,它们反映了应用中要用到的各种数据元素或信息单元之间的结构关系。
数据结构是要通过软件映像,变成计算机中所具有的数据表示来实现的。不同的数据表示可为数据结构的实现提供不同的支持,表现为实现效率和方便性的不同。数据结构和数据表示是软、硬件的交界面。系统结构设计在软、硬件功能分配时,应考虑在计算机中设置哪些数据表示,以便对应用中的数据结构有较高的实现效率,这是以花费适当的硬件为代价的。因此,数据表示的确定实质上是软、硬件的取舍。
早期的计算机只有定点数据表示,要想用浮点数就得用两个定点数来分别表示其阶码和尾数。
20 世纪 50 年代初提出的变址操作,为向量、阵列数据结构锇实现提供了直接支持。变址操作使得不同修改程序就能用循环方法对向量、阵列的各元素进行运算,有利于实现程序的可再入性。

可变长字符串数据表示的引入有力地支持了串数据结构的实现,包括设置字符串运算指令(如连接、传送、插入、删除、比较、编辑等)、按字节编址的访问方式和寻址硬件,以及在指令中增设字段指明首字符地址和字符串长度。这种可变长串的操作对输入、输出、事务处理、编译都有用。
高级数据表示¶
自定义数据表示¶
自定义(Self-defining)数据表示包括标志符数据表示和数据描述符两类。
-
标志符数据表示
在处理运算符和数据类型的关系上,高级语言和机器语言的差别很大。高级语言用类型说明语句指明数据类型,让数据类型直接与数据本身联系在一起,运算符不反映数据类型,是通用的。
为缩短高级语言与机器语言的这种语义差距,让计算机中每个数据都带如下类型标志位:

以说明数据值究竟是二进制整数、十进制整数、浮点数、字符串还是地址字,将数据类型与数据本身直接联系在一起。这样,机器语言中的操作码也就和高级语言中的运算符一样,可以通用于各种数据类型的操作了。这种数据表示称为标志符数据表示。
标志符数据表示在 20 世纪 60 年代初就已被采用。
标志符虽然主要用于指明数据类型,也可用于指明所用的信息类型。标志符应由编译程序建立,对高级语言程序透明,以减轻应用程序员的负担。
标志符数据表示的主要优点是:
- 简化了指令系统和程序设计
- 简化了编译程序
- 便于实现一致性校验
- 能由硬件自动变换数据类型
- 支持数据库系统的实现与数据类型无关的要求
- 为软件调试和应用软件开发提供了支持
用标志符数据表示可能带来两个问题:
- 每个数据字因增设标志符,会增加程序所占的主存空间。但只要合理设计,这种增加量是很小的,甚至有可能减少。因为指令种类减少,缩短了操作码位数。
- 采用标志符会降低指令的执行速度/因为需要增加按标志符确定数据属性及判断操作数之间是否相容等操作,单条指令的执行速度会下降。但总体上看,由于程序的编制和调试时间的缩短,而使解题总开销时间也缩短了。所以,引入标志符数据表示对微观性能(计算机的运行速度)不利,但对宏观性能(解题总时间)是有利的。

综上所述,标志符数据表示有明显的优点,加上硬件和存储器价格持续下降,使这种能缩小高级语言和机器语言语义差距的标志符数据表示得到了广泛的使用。
-
数据描述符
为进一步减少标志符所占的存储空间,对向量、数组、记录等数据,由于元素属性相同,因此发展出数据描述符。数据描述符和标志符的差别在于标志符是和每个数据相连的,合存在一个存储单元中,描述单个数据的类型特征;数据描述符则是与数据分开存放,用于描述所要访问的数据是整块的还是单个的,访问改数据块或数据元素所要的地址以及其他信息等。

前 3 位为“000”,表示该字为数据;前 3 位为“101”,表示该字为数据描述符。当是数据描述符时,用 8 位标志位描述数据特性。当描述的是整块数据时,“地址”字段用于指明首元素的地址,“长度”字段用于指明块内的元素个数。
采用描述符方式取操作数的过程如下图所示。按指令操作数地址 x、y 访存,取来的字,若其前 3 位为“000”,就是所需的操作数;若为“101”,表明它是描述符,将它取到描述符寄存器,由它的标志位、长度和地址字段联合控制,经地址形成逻辑形成操作数的地址,再访存取数据。对于数据块,访存取到寄存器的描述符可用于块内所有元素,不必每次访存取元素时都去访存取描述符。这样,一条指令就能执行对整个数据块的运算。

可以将描述符按树型连接来描述多维数组。用描述符方法实现阵列数据的索引要比用变址方法实现更方便,且便于检查出程序中的阵列越界错误。

数据表述符方法为向量、数组数据结构的实现提供了一定的支持,有利于简化编译中的代码生成,可以比变址法更快地形成元素地址。但向量、阵列各元素能否同时并行运算与是否采用数据描述符却没有直接关系,它取决于运算器和控制器的结构。
向量、数组数据表示¶
为向量、数组数据结构的实现和快速运算提供更好的硬件支持的方法是增设向量、数组数据表示,组成向量机。有向量数据表示的处理机就是向量处理机,如向量流水机、阵列机、相联处理机等。
在没有向量、数组表示的计算机上经编译后需借助于变址操作实现。
在有向量、数组数据表示的向量处理机上,硬件上设置有丰富的向量或阵列运算指令,配有流水或阵列方式处理的高速运算器,只需用一条如下的向量加法指令

下图为向量变址所需用到的参数,每一行为一个元素。基地址是向量的第一个元素的地址。由基地址加位移量形成起始地址,表示参加运算的首元素地址。设置位移量可实现向量的斜排运算。向量长度可用于校验所形成的元素地址是否越界。元素步距表示向量相邻元素间的偏移。多数计算机采用寄存器寻址,只给出存放参数的寄存器号。
引入向量、数组数据表示不能只加快形成元素地址,更重要的是便于实现把向量各元素成块顶取到中央处理器。用一条向量、数组指令流水或同时对整个向量、数组高速处理。用硬件判断下标是否越界,并让越界判断和元素运算并行。比起用与向量、阵列无关的机器语言和数据表示串行判断下标是否越界,循环控制运算来实现阵列处理,其速度、效率要高得多,编译程序也简单得多。所以高速的巨型机都设置有向量数据表示。现在向量、数组数据表示已下移到通用机和系列机上。

堆栈数据表示¶
堆栈数据结构在编译和子程序调用中很有用,为高效实现,不少计算机都设有堆栈数据表示。有堆栈数据表示的计算机称为堆栈计算机。
一般通用寄存器型计算机对堆栈数据结构实现的支持是较差的。表现为堆栈操作用的机器指令数少,功能单一,堆栈置于存储器内,访问堆栈的速度低,通常指用于保存子程序调用时的返回地址,少量用堆栈来实现程序之间的参数传递。
堆栈计算机表现于:
- 由高速寄存器组成的硬件堆栈,并附加控制电路,让它与主存中的堆栈区在逻辑上构成整体,使堆栈的访问速度是寄存器的,容量是主存的。
- 有丰富的堆栈操作指令且功能很强,可直接对堆栈中的数据进行各种运算和处理。
- 有力地支持了高级语言程序的编译。
- 有力地支持了子程序的嵌套和递归调用。子程序调用另一子程序称嵌套调用,子程序直接或经其他子程序间接调用自己成直接或间接递归调用。堆栈机器能及时释放不同的单元以及在访问堆栈时较多地使用零地址指令,省去了地址码字段。即使访问主存,一般也采用相对寻址,使访存的地址码位数较少,从而使堆栈计算机上程序的总位数及程序执行所用到的存储单元数减少,存储效率提高。

引入数据表示的原则¶
从根本上讲,存储器一维线性的存储结构与要求经常使用的多维离散数据结构有着很大差距。即使是名称变量,大多也不是顺序存储,而是离散分布的,这当然不利于数据结构的实现。因此,如何根据实现数据结构的需要来设计和改进计算机系统结构是应当重视的。
遵循什么原则来确定计算机的数据表示,除了基本数据表示不可少外,其他高级数据表示的引入可从两个方面来衡量。
原则1
看系统的效率是否有显著提高,包括实现时间和存储空间是否有显著减少。实现时间是否减少又主要看在主存和处理机之间传送的信息量是否减少。传送的信息量越少,实现时间就越少。
原则2
看引入这种数据表示后,其通用性和利用率是否提高。如果只对某种数据结构的实现效率很高,而对其他数据结构的实现效率很低,或者引入这种数据表示在应用中很少用到,那么为此所耗费的硬件过多却并未在性能上得到好处,必然导致性能价格比的下降,特别是一些复杂的数据表示。
【例 2-4】¶
引入具有树型数据表示的树结构式计算机,对树数据结构的实现是高效的,但对堆栈、向量、链表等数据结构的实现都是低效的。
目前除了基本数据表示外,根据应用环境,可引入较复杂的高级数据表示,有自定义数据表示、堆栈数据表示和向量、数据数据表示。
浮点数尾数基值的选择¶
当计算机字长相同时,用浮点数表示实数比用定点数表示有更大的可表示数范围。不少计算机都采用类似下图所示的格式表示一个浮点数。图中的阶码部分包含了阶符和阶值两部分。阶码部分可用原码、补码或增码(也称移码)表示。不管怎么表示,p+1 位阶码部分中影响阶值大小的实际只有 p 位。

数学中实数在数轴上时连续分布的。但由于计算机字长有限,浮点数只能表示出数轴上分散于正、负两个区间上的部分离散值。如下图所示

显然,浮点数阶值的位数 \(p\) 主要影响两个可表示区的大小,即可表示数的范围大小,而尾数的位数 \(m\) 主要影响在可表示区中能表示值的精度。由于计算机中尾数位数限制,实数难以精确表示,因此,不得不用较接近的可表示数来近似表示,产生的误差大小就是数的表示精度。当总的计算机字长定好后,浮点数表示中 \(p\) 和 \(m\) 的位数主要是根据数的表示范围和精度来确定的。然而,当阶值位数 \(p\) 一定时,尾数采用什么进制都会影响到数的可表示范围、精度及数在数轴上分布的离散程度。在计算机中阶码都采用二进制,这样可避免运算中因对阶造成的精度和有效数值的过多损失。
下表的左部列出了阶值采用二进制 \(p\) 位,尾数采用 \(r_{m}\) 进制 \(m'\) 位,在非负阶、正尾数、规格化条件下有关浮点数各种特性参数的一般式。
| 条件:非负阶、正尾数、规格化 | 阶值:二进制 \(p\) 位 尾数:\(r_{m}\) 进制 \(m'\) 位 |
若 \(p=2,m=4\) 当 \(r_{m}=2\)(即 \(m'=4\))时 |
若 \(p=2,m=4\) 当 \(r_{m}=16\) (即 \(m'=1\) )时 |
|---|---|---|---|
| 可表示最小尾数值 | \(1 \times r_{m}^{-1}\)(即 \(r_{m}^{-1}\)) | 1/2 | 1/16 |
| 可表示最大尾数值 | \(1-1 \times r_{m}^{-m'}\)(即 \(1-r_{m}^{-m'}\)) 特例:\(1-2^{-m}\) |
15/16 | 15/16 |
| 最大阶值 | \(2^{p}-1\) | 3 | 3 |
| 可表示最小值 | \(r_{m}^{0} \times r_{m}^{-1}\)(即 \(r_{m}^{-1}\)) | 1/2 | 1/16 |
| 可表示最大值 | \(r_{m}^{(2p-1)} \times (1-r_{m}^{-m'})\) 特例:\(r_{m}^{(2p-1)} \times (1-2^{-m})\) |
7.5 | 3840 |
| 可表示的尾数个数 | \(r_{m}^{m'} \times (r_{m}-1)/r_{m}\) 特例:\(2^{m} \times (r_{m}-1)/r_{m}\) |
8 | 15 |
| 可表示阶的个数 | \(2^{p}\) | 4 | 4 |
| 可表示数的个数 | \(2^{p} \times r_{m}^{m'} \times (r_{m}-1)/r_{m}\) 特例:\(2^{p} \times 2^{m} \times (r_{m}-1)/r_{m}\) |
32 | 60 |
注:表中特例是指 \(r_{m}\) 为 \(2\) 的整数次幂时,用 \(r_{m}^{m'}=2^{m}\) 代入。
所谓规格化正尾数,就是正尾数小数点后的第 1 个 \(r_{m}\) 进制数位不是 0 的数。因为尾数为全“\(0\)”的数是机器零,不作为计算机中可表示的数。所以,最小正尾数值应当是 \(r_{m}\) 进制尾数的小数点后第 1 个 \(r_{m}\) 进制位数为“\(1\)”,其余数位全为“\(0\)”的数值,即 \(1 \times r_{m}^{-1}\)。最大正尾数值当然是 \(r_{m}\) 进制尾数各数位均为 \(r_{m}-1\)。
由于是非负阶,最小阶应当是阶值部分为全“\(0\)”,所以,最小阶为 0。
按浮点数表示格式的含义,浮点数的值应当是 \(r_{m}^{阶值} \times 尾数值\)。可表示浮点数的最小值应当是阶为非负阶的最小值 0,尾数为规格化最小正尾数值。
可表示的浮点数规格化数的总个数应当是可表示阶的个数与可表示尾数的个数的乘积。
讨论尾数 \(r_{m}\) 取不同值的影响,当然是在相同的计算机位数,即相同的阶值位数 p、尾数位数 m 的情况下,不同的 \(r_{m}\) 对特性参数的影响。
浮点数尾数的下溢处理方法¶
减少运算中的精度损失关键是要处理好运算尾数中超出字长的部分,使之精度损失最小。下面讨论浮点数尾数下溢的几种处理方法。

-
截断法
截断法是将尾数超出计算机字长的部分截去,其误差曲线如图 a 所示。
这种方法的好处是实现最简单,不增加硬件,不需要处理时间,但由于最大误差较大,平均误差大且无法调节,因而已很少使用。
-
舍入法
舍入法是在计算机运算的规定字长之外增设一位附加位,存放溢出部分的最高位,每当进行尾数下溢处理时,加附加位加 1(二进制整数相当于加 0.5,二进制小数相当于加 \(2^{-(m+1)}\))。其误差曲线如图 b 所示。
这种方法的好处是实现简单,增加的硬件很少,最大误差小,平均误差接近于零。主要缺点是处理速度慢,需要花费在数的附加位加 1 以及因此产生进位的时间。最坏情况下可能需要从尾数从最低位进位至最高位,甚至发生尾数上溢而必须再进行右移。所以在中低速计算机上或要求精度损失尽可能小的场合下使用较多。
-
恒置“1”法
恒置“1”法是将计算机运算的规定字长的最低位恒置位“1”。其误差曲线如图 c 所示。
这种方法的好处是实现最简单,不需要增加硬件和处理时间,平均误差趋于 0,主要缺点是最大误差最大,比截断法还大。多用于中、高速计算机。至于最大误差大的问题,由于中、高速计算机的尾数位数要比小、微型机的长的多,因此,实际的最大误差要小得多。

-
查表舍入法
查表舍入法是用 ROM 或 PLA 存放下溢处理表,如图所示的就是用 \(2^{k}\) 个字的 ROM 存放下溢处理表,其 k 位地址使用尾数最低的 k-1 位和准备舍弃掉的最高位状态,读出的内容就是对应 k-1 位的下溢处理结果。ROM 中下溢处理表内容可根据情况由设计者事先填好。
通常,下溢处理表的内容安排成当尾数最低 k-1 位为全“1”时,以截断法设置处理结果,即输出 k-1 位的全“1”,其余情况按舍入法设置下溢处理结果。这样,截断法的负误差可补偿舍入法产生的正误差,使平均误差为 0.它集中了上述各种下溢处理方法的优点,避免了舍入法所需相加和进位的时间。因 ROM 的读出时间比加法时间少,所以,查表舍入法速度较快。图 d 表示 8 字 ROM,即 k=3 的情况。
由上可见,ROM 查表舍入法速度较快,平均误差可调节到 0,是较好的方法。缺点是硬件量大,不过随着器件价格的下降和集成度的改进,使用将会增多。
计算机组成设计必须注意解决好数的下溢处理,因为这种精度损失对系统程序和应用程序设计者都是透明的,设计得不好,同样的题目在用不同下溢处理方法的计算机上会得到不同的运算结果。下溢处理方法的选择是在速度、误差、造价、实现方便等多方面的综合权衡。
通过对浮点数尾数基数大小和下溢处理方法选择的讲述,可以看出,系统结构的研究方法往往是设法找出影响问题的各个因素,建立起相关的数学模型(可以是数学公式,也可以是图形曲线)。为了简化模型,去除一些不影响结论的枝节因素,尽可能推导出一些定量公式,以便得到必要的结论来指导设计。