【书摘】计算机组成 结构化方法

计算机系统由三个部分组成:处理器、存储器和输入输出设备。


计算机系统组成

计算机系统由三个部分组成:处理器、存储器和输入输出设备。处理器的任务是每次从存储器中取出一条指令,对指令进行译码,然后执行指令。取指、译码和执行指令这个循环总是可以用算法进行描述,而且,事实上,一些计算机的这个循环就是由底层软件来实现的。为提高运行速度,目前的许多计算机已经有一条或多条流水线,或有了多个可并行操作的功能部件。

多处理器系统已经越来越普遍。并行计算机有以下几类:同一运算同时在多个数据集合上操作的阵列处理器,多 CPU 共享公共内存的多 CPU 计算机,以及每台计算机有自己的内存,通过消息传递进行通信的多计算机系统。

存储器系统可分为主存储器和辅助存储器。主存储器用来存放当前正在执行的程序,其访问时间比较短——最多为几十纳秒,且和被访问的地址无关。高速缓存的访问时间更短。为提高可靠性,一些存储器还有纠错码。

辅助存储器正相反,访问时间比较长(几毫秒或更长)且和被读或写的数据的位置有关。磁带、磁盘和光盘是最常用的辅助存储器。

输入/输出设备用于计算机和外部世界交换信息。它们通过一条或多条总线和处理器及存储器连接。大多数输入/输出设备使用 ASCII 字符集,尽管随着计算机产业的全球化,UNICODE 正迅速得到大家的认可。

数字逻辑层

计算机由包含有很多被称为门的微型开关的集成电路制造而成。最普通的门为与门、或门、与非门、或非门和非门。将单个的门直接组合其他就可以构造出一些简单的电路。

复杂一些的电路有多路复用器、多路分解器、译码器、解码器、移位器和算术逻辑部件。任意的布尔函数军可以用可编程逻辑阵列 PLA 实现。如果需要多个布尔函数,PLA 就更有优势了。布尔代数的定律可以用来将电路从一种形式转换为另一种形式。在许多情况下,可以用这种办法来得到更简洁经济的电路。

计算机通过加法器来完成算术运算。1 位全加器可以由两个半加器构成,多位加法器则是由多个全加器组成的,每个全加器都把自己产生的进位传给它左边的那个全加器。

(静态)存储器由锁存器和触发器组成,它们都能存放一位信息。可以将它们线性组合成 8 位的锁存器和触发器,或者是 2 的指数位的实际使用的任何内存储器。内存可分为 RAM、ROM、PROM、EPROM、EEPROM 和闪存。静态 RAM 不需要刷新,只要不断电,它可以一直保存数据。与此相反,动态 RAM 必须定期刷新,以补偿芯片中小电容的电荷的泄露。

计算机系统中的各个部件通过总线连接在一起。一般 CPU 的许多(但不是全部)管脚可以直接驱动一个总线信号。总线信号可以分为地址信号、数据信号和控制信号。同步总线由一个主时钟驱动,异步总线以全握手方式来使从设备和主设备同步。

微体系结构层

数据通路是所有 CPU 的核心,它包括一些寄存器,一条、两条或者三条总线,一个或者更多的功能单元(比如 ALU 和移位器)。主执行循环包括从寄存器取操作数,通过总线把它们传送给 ALU 和其他的功能单元执行,然后把最终的结果存回寄存器。

数据通路可以由定序器控制,定序器从控制存储器中取出微指令。每条微指令都由在一个时钟周期内控制数据通路的位构成,这些位定义了选择的操作数、执行的运算和如何处理运算结果。另外,每条微指令都定义了其后继微指令,一般是给出后继微指令的地址。某些微指令在使用基地址之前要通过把某些位和基地址进行或(OR)操作来修改这个地址。

设计微体系结构层有多种方式。存在许多权衡,包括使用双总线设计还是三总线设计,是否编码微指令的字段,是否使用预取,流水线的深浅,等等。可以使用不同的措施提高系统性能。cache 是其中主要的一种。直接映射的 cache 和组相连的 cache 是最常见的加速内存访问的高速缓存。静态和动态的分支预测也很重要,其他的措施还有乱序执行和推测执行。

指令系统层

大多数人把指令系统层看作是『机器语言』。该层次的计算机由面向字节活着面向字的数十兆字节大小的内存和像 MOVE, ADD 和 BEQ 这样的指令组成。

大多数现代计算机的内存是由一系列的字节组成的,每 4 个或者 8 个字节组成一个字。通常有 8-32 个可用的寄存器,每个寄存器保存一个字。

指令通常有一个、两个或者三个操作数,寻址方式包括立即寻址、直接寻址、寄存器寻址、变址寻址和其他一些寻址方式。某些计算机还有大量的复杂的寻址模式。指令通常用于转移数据,执行单目或双目运算,包括算术或逻辑运算、跳转、过程调用和循环,有时候还包括 I/O。典型的指令包括把一个字从内存移到寄存器中(或者相反),加减乘除两个寄存器或者一个寄存器和一个内存字,或者比较在寄存器和内存中的两个字。一台计算机的指令系统的指令条数超过 200 条是很常见的,CISC 机器甚至还有更多的指令。

可以通过使用各种原语来实现第 2 级的控制流,这些原语包括跳转、过程调用、协同过程调用、陷阱和中断。跳转用于中止一个指令序列并开始一个新的指令序列。过程是一种抽象机制,它允许把一部分程序独立出来作为一个单元,这个单元可以在多个地方被调用。协同过程允许两个线程同时执行。陷阱用于通知例外情况,比如算术运算溢出。中断允许 I/O 和主计算过程并行执行,当 I/O 完成之后 CPU 可以得到一个信号。

操作系统层

我们可以把操作系统看成是用于说明指令系统层没有的体系结构特性的解释器。其主要部分有虚拟内存、虚拟输入/输出指令和用于并行处理的一些工具。

虚拟内存是一种体系结构特性,它的目的是为了允许程序使用比计算机的物理内存更多的地址空间,或者是提供一个一致的和灵活的内存保护及共享机制。虚拟内存的实现方式有页式、段式和段页式。在页式虚拟内存中,地址空间被分成大小相等的虚拟页。其中的某些页被映射到物理页帧,其他的页则不映射。对映射页的访问将由 MMU 转换到正确的物理地址。引用一个没有映射的页将产生一个缺页。

在操作系统曾,最重要的输入 / 输出抽象是文件。文件由一系列的字节活着逻辑记录组成,读写文件时并不需要知道磁盘、磁带和其他输入/输出设备是如何工作的。文件可以顺序访问,也可以通过记录号或者主键进行随机访问。目录可以用来把文件分成组。文件可以保存在连续的扇区中或者零散地分布在磁盘上。在后一种情况下(这种情况在硬盘上经常发生),需要使用数据结构来定位文件的块。系统可以通过使用链表活着位图来掌握空闲的磁盘存储区的情况。

并行处理通常采用多个进程分时使用一个 CPU 的方式来模拟和实现。如果不对进程间通信加以控制,将会导致竞争条件。为了解决这一问题,引入了同步原语,信号量就是同步原语的一个简单的例子。使用信号量,可以很容易并且很完美地解决生产者-消费者问题。

UNIX 和 XP 是复杂操作系统的两个例子。它们都支持分页和内存映射文件。它们也都支持层次型的文件系统,其中文件都是由字节序列组成的。最后一点,UNIX 和 XP 都支持进程和线程以及用于进程和线程的同步机制

汇编语言层

虽然大多数程序可以也应该使用高级语言编写,但是在某些情况下汇编语言也是必不可少的。在缺乏资源的移动计算设备中使用的程序一般都需要使用汇编语言编写,智能卡、科学仪器中的嵌入式处理器、无线的便携式数字助理都属于这类移动计算设备。汇编语言程序是底层的机器语言程序的符号表示。汇编器负责把汇编语言程序翻译成机器语言程序。

程序的执行速度对于某些应用来说是至关重要的,对于这些应用来说,单纯使用汇编语言编写程序并不是最好的方案,更好的方法是首先使用高级语言编写整个程序,然后测量程序的执行时间,最后使用汇编语言重新编写其中最耗时的部分。这样做的依据是在实际使用中,通常程序的大部分执行时间都花费在一小部分代码上。

许多汇编器都提供了宏,程序员可以使用宏为常用的代码序列起个符号名,这样可以方便后面的引用。一般来说,这些宏还可以使用参数,参数的用法很简单。宏是使用一系列字符串处理算法实现的。

大多数汇编器都使用两趟扫描技术。第一趟扫描建立一张符号表,符号表中主要存放标号、直接量和显式声明的标识符。这些符号可以采用无序的方式保存然后执行顺序查找,或者首先排序然后进行二分搜索,或者使用散列技术。如果在第一趟扫描过程中不需要删除符号,散列是最好的方法。第二趟扫描执行代码生成。某些伪指令在第一趟扫描中处理,而另一些在第二趟扫描中处理。

独立汇编的程序可以被链接到一汽,形成一个可以运行的可执行二进制程序。这部分工作是链接器完成的。链接器的主要任务是重定位和绑定符号名。动态链接是指直到实际调用某个过程时才链接该过程的一种技术。Windows DLL 和 UNIX 的共享库都使用动态链接技术。

并行计算机体系结构

因为散热和其他因素,依靠提高时钟频率使得计算机运行得更快变得越来越困难。设计者不得不寻找其他的方法来提高计算机的运行速度,大多数设计者都将目光转向了并行。并行可以从差别很大的不同层次引用,可以从很底层紧密耦合的处理元件开始,直到很高层松散耦合的并行。

最底层是芯片内部的并行,也就是说,并行行为都发生在一个单独的芯片内部。芯片内并行的第一种形式就是指令级并行,在这种并行中,一条指令活着一个指令序列能够发射由不同功能单元并行执行的多个操作。芯片内并行的第二种形式是多线程,在这种并行中,CPU 可以在多个线程之间来回切换,产生处一个虚拟而多处理器。芯片内并行的第三种形式是单片多处理器,在这种并行中,同一个芯片中设置了两个或者更多个内核并且允许它们同时运行。

向上的一个层次是协处理器,典型的协处理器就是一些在某些特殊方面提供额外处理能力的插件板,例如网络协议处理或者多媒体等。这些额外的处理器能够减轻主 CPU 的负载,在协处理器进行某些特殊任务的处理时,主 CPU 可以完成其他工作。

再往上的一个层次是共享内存的多处理器。多处理器系统由两个或者更多共享内存的成熟 CPU 构成。UMA 多处理器通过共享(监听)总线、交叉开关活着多级交换网络进行通信。它们的特征是对所有内存的访问都有一致的访问时间。相反,虽然 NUMA 多处理器也是在同样的共享地址空间上运行进程,但是对远程内存的访问时间比本地内存要略微长一些。最后,COMA 多处理器是另外一种变种,在 COMA 中,cache 块可以根据需要在不同的机器间移动,不像其他设计那样有固定的位置。

多计算机系统是由具有大量 CPU 但并不共享公共内存的系统构成的。每个系统都有自己的私有内存,通过消息传递的方式进行互相通信。MPP 是使用专用通信网络的大型多计算机系统。集群是由比较简单的非定制组件构成的系统。

多计算机系统通常使用 MPI 这样的消息传递软件包进行编程。另一种可以替代消息传递软件包的策略是使用应用层的共享内存,比如基于分页的 DSM 系统,Linda 元组空间和 Orca 或 Globe 中的对象。DSM 在页面级模拟共享内存,这和 NUMA 计算机很相似,区别在于 DSM 的远程访问的开销要大一些。

最后,在最顶层是最松散耦合的网络。网格系统通过因特网将各种相关组织联结在一起,共享计算能力、数据和其他资源。