上两章我们介绍了计算机的主要组成部分——数据,阐述了计算机是如何存储和运算各种类型数据的。本章我们将简要介绍计算机的另一个组成部分——计算机硬件,可以说,这个部分是计算机中最基础,也是最重要的部分,因为无论是数据能以何种方式存储和运算,还是计算机软件能实现哪些功能、发挥哪些效用,都取决于计算机硬件。
在第一章中,我们提到:当今的计算机体系结构几乎都基于冯·诺依曼模型。冯·诺依曼模型指出计算机硬件由算术逻辑单元(ALU)、控制单元、存储器、输入/输出单元五大部分构成。事实上,今天我们熟知的 中央处理单元(Central Processing Unit,CPU)包括了算术逻辑单元、控制单元和部分存储器,其中部分存储器指的是寄存器和高速缓冲存储器。除了寄存器和高速缓冲存储器外,存储器还包括我们通常称之为内存的主存。输入/输出单元则包括键盘、鼠标、操作杆、显示器、打印机等非存储设备以及硬盘、光盘等存储设备。这些独立的部分需要相互连接才能构成一个完整的计算机硬件系统,用于连接中央处理单元和存储器的是总线,用于连接输入/输出单元与中央处理单元和存储器的是输入/输出接口。因此,我们说:计算机硬件系统由中央处理单元、存储器、输入/输出单元、总线和输入/输出接口构成。
4.1 中央处理单元
中央处理单元是计算机硬件系统的核心,主要用于数据的运算。一般而言,中央处理单元由算术逻辑单元、控制单元、寄存器这三大部分构成。后面在讲到存储器时我们还将看到:除了以上三大部分,现今计算机的中央处理单元还包括高速缓冲存储器。图 4-1 向我们展示了中央处理单元的基本构造。
图 4-1 中央处理单元(CPU)
算术逻辑单元用于对数据进行逻辑、移位和算术运算,关于这三种运算的具体含义详见博文《计算机科学导论(3):数据运算》。
控制单元用来控制算术逻辑单元、存储器和输入/输出单元,控制是通过从控制单元到其他子系统的信号实现的。
寄存器是用来存放临时数据的高速存储器,分为数据寄存器、指令寄存器(IR)和程序计数器(PR)。数据寄存器用来存储输入数据和运算结果,指令寄存器用来存储从内存中取出的指令,程序计数器用来保存当前执行的指令,当前指令执行完后计数器自动加 1,指向下一条指令的内存地址。
CPU 利用重复的机器周期来执行程序中的指令,简单来说,一个机器周期包括取指令、译码和执行三个步骤。在取指令阶段,控制单元依据程序计数器中保存的下一条指令地址,将下一条将要执行的指令复制到指令寄存器(IR)中。复制完成后,程序计数器(PR)自动加 1 指向内存中的下一条指令。在译码阶段,控制单元将存储在指令寄存器(IR)中的指令翻译为可执行的二进制代码。在执行阶段,控制单元依据可执行代码发送任务命令到 CPU 的某个部件,例如让算术逻辑单元执行加法运算并保存结果到寄存器中。图 4-2 向我们展示了机器周期的步骤。
图 4-2 机器周期的步骤
在早期的计算机中,机器周期的三个阶段需要串行完成,现代计算机则使用流水线技术来提高吞吐量(计算机在单位时间内所能完成的指令总数)。图 4-3 是流水线的示意图。然而,流水线并不像这样简单,如当它遇到转移指令时就会出现一些问题,此时在管道中的指令应该被丢弃。但是,新的 CPU 设计已经克服了流水线技术的大部分缺点,有些新的 CPU 设计甚至能同时进行多个取指令周期。
图 4-3 流水线
4.2 存储器
本章中我们所讲的存储器是计算机中内部用来存储数据的器件,它不包括我们通常提到的硬盘、光盘等外部存储设备,在本章中,这些外部存储设备将在输入/输出单元下讲述。事实上,笔者觉得在这里,将存储器改为内部存储器,或许要更准确一些。但在本章中,笔者仍将与 Behrouz Forouzan 先生所著的 《计算机科学导论》 保持一致,采用 “存储器” 一词指代内部存储器件,在此特别强调一下,望读者明晰。
计算机需要许多的存储器,尤其是又快又便宜的存储器,然而遗憾的是:速度与价钱水火不相容,速度越快价格也越高。解决的办法是:用少量高速存储器来存储需要快速访问的数据(如:寄存器),用适量的中速存储器来存储需要经常访问的数据(如:高速缓冲存储器),用大量低速存储器存储不经常访问的数据(如:主存)。图 4-4 向我们展示了存储器的层次结构。
高速缓冲存储器简称缓存,其英文名为 cache. cache 一词来源于 1967 年的一篇电子工程期刊论文。其作者将法语词 “cache” 赋予 “safekeeping storage” 的涵义,用于电脑工程领域。
当 CPU 要存取主存(main memory,我们通常说的内存)中的字(字是 CPU 一次存取的位组,其长度称为字长,现在大部分 CPU 的字长已达到 64 位)时,它会首先检查缓存,如果缓存中存在就从缓存中存取,如果不存在,就从主存中复制一份从需要读取的字开始的数据块到缓存,而后从缓存中复制该字。提供 “缓存” 的目的就是为了让数据存取的速度适应 CPU 的处理速度。
CPU 的缓存曾经是用在超级计算机上的一种高级技术,不过现今电脑上使用的的 Intel 或 AMD 微处理器都在芯片内部集成了大小不等的数据缓存和指令缓存,通称为 L1 缓存(L1 Cache 即 Level 1 On-die Cache,第一级片上高速缓冲存储器);而比 L1 更大容量的 L2 缓存曾经被放在 CPU 外部(主板或者 CPU 接口卡上),但是现在已经成为 CPU 内部的标准组件;更昂贵的 CPU 会配备比 L2 缓存还要大的 L3 缓存。
如今缓存的概念已被扩充,不仅在 CPU 和主内存之间有 Cache,而且在内存和硬盘之间也有 Cache(磁盘缓存),乃至在硬盘与网络之间也有某种意义上的 Cache——Internet 临时文件夹或网络内容缓存等。凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为 Cache。
图 4-4 存储器的层次结构
主存与缓存均是随机存取存储器(Random-access Memory, RAM),用户可对其进行读写操作,但当系统断电后,存储器中的所有信息就不复存在了。主存使用动态 RAM 技术(DRAM),它使用电容器充放电状态的不同表示 1 和 0,充电时为 1,放电时为 0。但由于电容器会随着时间的流逝而漏掉一部分电,因此内存单元需要周期性地刷新,速度较慢,价格也相应较低。缓存使用静态 RAM 技术(SRAM),它使用传统的触发器门电路保存数据,这些门保持 0 或 1 的状态,通电时数据始终存在,无需刷新,因而速度较快,价格也相应较高。至于其中原理以及究竟什么是触发器门电路,笔者还不得而知。
与随机存取存储器对应的还有一种被称作只读存储器(Read-only Memory, ROM)的存储器件,顾名思义,用户只能对其进行读操作。它的一个重要特性是:数据不会随着电源的切断而丢失,因此 ROM 通常被用来存储那些在开机时需要运行的程序。另外还有可编程只读存储器(PROM)、可擦除可编程只读存储器(EPROM)以及电可擦除可编程只读存储器(EEPROM)等只读存储器,但这些只读器并不是只读的,一些甚至可以多次重写,它们之所以继续沿用只读存储器的名称可能是因为它们继承了 ROM 断电后不会丢失数据的特性。
用户借助一些特殊的设备可在 PROM 上进行一次写操作,此后便不可重写。EPROM 可借助一种可以发出紫外光的特殊仪器作多次重写。EEPROM 则可借用电子脉冲作多次重写而无需从计算机上拆下来,它与高速 RAM 技术一起,成为了 21 世纪以来最常用且发展最快的两种存储技术。
EEPROM 的优秀性能,使得它不仅被广泛应用于需要经常擦除的 BIOS 芯片(BIOS 是基本输入输出系统的英文简称)以及闪存(闪存是一种特殊的、以宏块抹写的 EEPROM,我们常见的存储卡、U 盘均属于闪存设备)芯片上,而且使得它开始占领作为外部主要存储设备硬盘的市场(固态硬盘是一种主要以闪存作为永久性存储器的计算机存储设备,它具有低功耗、无噪音、抗震动、低热量的特点,其读写速度远高于传统机械硬盘,当然它也存在价格高、数据恢复困难以及随着写入次数增加读写速度减慢等缺点)。
在本节的最后,我们来讲一下地址这个概念。存储器是存储单元的集合,每一个存储单元都有唯一的标识,这个标识就是地址。在存储器中存取每个字都需要相应的标识符,尽管在高级编程语言中程序员使用命名的方式区分字或一组字的集合,但在硬件层次上,每个字都是通过地址来标识的。所有的存储器中表示的独立的地址单元的总数称为地址空间。例如,一个 64 KB( 2 16 = 65535 2^{16} = 65535 216=65535 Bytes)、字长为 1 字节 (1 Bytes = 8 bits) 的内存的地址空间的范围为 0~65535,它需要 16 位的位模式来确定地址。通常如果一个计算机有 N 个字节的存储空间,每个字的字节长为 M,则内存地址空间的范围为 0~N/M,需要 log 2 ( N / M ) \log_2 {\left(N/M \right)} log2(N/M) 位的位模式来确定地址。
4.3 输入/输出单元
输入/输出单元包括非存储性输入设备键盘、鼠标、操作杆、扫描仪等,非存储性输出设备监视器、打印机等,存储性输入/输出设备磁盘、光盘、U 盘等。这里我们主要介绍磁盘和光盘。
磁盘即我们现在常说的机械硬盘(Hard Disc Drive, HDD),它使用磁介质存储数据。磁盘由一张一张的磁片叠加而成,呈圆环形的磁片被划分成若干个小圆环形磁道,每个磁道又分成若干个扇区,磁道间通过磁道内部间隔隔开,扇区间则通过扇区内部间隔隔开。图 4-5 向我们展示了磁盘的结构。
图 4-5 磁盘的结构
数据的读写是通过盘上每一个磁片的读/写磁头读写磁介质表面实现的,磁片有磁性的地方表示 1,无磁性的地方则表示 0。磁盘是一种典型的随机存储设备,在随机存储设备中,数据的存取不需要存取放置在其前的所有其他数据。磁盘的性能取决于角速度(磁盘旋转速度)、寻道时间(读/写磁头寻找数据所在磁道的时间)和传送时间(数据从磁盘移到 CPU 或内存的时间)。下面是计算机硬盘发展的简要历史(摘自维基百科):
1956 年,IBM 的 IBM 305 RAMAC 是现代硬盘的雏形,它相当于两个冰箱的体积,不过其存储容量只有 5MB。
1973 年,IBM 3340 问世,它拥有 “温彻斯特” 这个绰号,来源于它的两个 30MB 存储单元,恰好是当时出名的 “温彻斯特来福枪” 的口径和填弹量。至此,硬盘的基本架构被确立。
1980 年,两位前 IBM 员工创立的公司开发出 5.25 英寸规格的 5MB 硬盘 ST506,这是首款面向台式机的产品,而该公司正是希捷科技公司(Seagate)。
1980 年代末,IBM 推出磁阻(Magneto Resistive, MR)技术令磁头灵敏度大大提升,使盘片的存储密度较之前的 20Mbpsi(bit/每平方英寸)提高数十倍,该技术为硬盘容量的巨大提升奠定了基础。1991年,IBM 应用该技术推出首款 3.5 英寸的 1GB 硬盘。
1970 年到 1991 年,硬盘碟片的存储密度以每年 25%~30% 的速度增长;从 1991 年开始增长到 60%~80%;至今,速度提升到 100% 甚至是 200%。从 1997 年开始的惊人速度提升得益于 IBM 的巨磁阻(Giant Magneto Resistive, GMR)技术,它使磁头灵敏度进一步提升,进而提高了存储密度。
1993 年,康诺(Conner Peripherals)推出 CP30344 硬盘,容量 340 MB。
1995 年,为了配合 Intel 的 LX 芯片组,昆腾与 Intel 携手发布 UDMA 33 接口—— EIDE 标准,将原来接口数据传输率从 16.6MB/s 提升到了 33MB/s. 同年,希捷开发出液态轴承(FDB,Fluid Dynamic Bearing)电动机。所谓的 FDB 就是指将陀螺仪上的技术引进到硬盘生产中,用厚度相当于头发直径十分之一的油膜取代金属轴承,减轻硬盘噪音与发热量。
1996 年,希捷收购康诺(Conner Peripherals)。
1998 年 2 月,UDMA 66 规格面世。
2000 年 10 月,迈拓(Maxtor)收购昆腾。
2003 年 1 月,日立宣布完成 20.5 亿美元的收购 IBM 硬盘事业部项目,并成立日立环球存储科技公司(Hitachi Global Storage Technologies, Hitachi GST)。
2005 年,日立环储和希捷都宣布了将开始大量采用磁盘垂直写入技术(perpendicular recording),该原理是将平行于盘片的磁场方向改变为垂直(90度),更充分地利用的存储空间。
2005 年 12 月 21 日,希捷宣布收购迈拓(Maxtor)。
2007 年 1 月,日立环球存储科技宣布将会发售全球首只 1 Terabyte 的硬盘,比原先的预定时间迟了一年多。硬盘的售价为 399 美元,平均每美分可以购得 27.5MB 硬盘空间。
2011 年 3 月,西部数据以 43 亿美元的价格,收购日立环球存储科技。
2011 年 4 月,希捷宣布与三星强化策略伙伴关系,传统的硬盘逐渐地被态硬盘所取代。
2011 年 12 月,希捷宣布收购了三星旗下的硬盘业务。
光盘使用光介质存储数据,包括只读光盘(CD-ROM)、可刻录光盘(CD-R)、可重写光盘(CD-RW)、数字多功能光盘(DVD)以及最新的蓝光光盘(BD)。我们首先介绍只读光盘(CD-ROM),CD-ROM 的制造如图 4-6 所示,分为以下三个步骤:
图 4-6 CD-ROM 的制造
- 制造主盘:使用高能红外激光在塑料涂层上刻写位模式,激光束使得塑料涂层上形成一系列的坑和纹间表面用以代表 0 和 1
- 制造模盘:依据主盘,做成相应模盘,在模盘中,坑由凸起代替
- 制造 CD-ROM:将溶解的聚碳酸酯树脂注入模盘,由此形成像主盘一样的坑,在其上添加一层铝制反射层,然后在反射层上添加一层保护漆和标签
CD-ROM 依靠低能激光束读取数据,激光束在经过纹间表面时会被铝质反射层反射,在经过坑时会被坑的边缘和铝质反射层反射两次,由于坑的深度为激光束波长的 1/4,这两次反射经叠加后会减弱,因此激光束在经过纹间表面和坑时会得到强弱不同的信号反射,这样 CD-ROM 就能读取光盘上的数据了。CD-R 仅在 CD-ROM 上增加了一项功能:可以写入一次数据,其制造技术与 CD-ROM 基本相同,不同之处在于无需使用主盘和模盘、反射层材料为金、反射层和聚碳酸酯间加入了染料。CD-R 的刻录通过高能激光束在染料层上的烧制实现,被激光照射的区域成为模拟的坑,没有被照射的区域成为模拟的纹间表面。CD-R 数据的读取通过低能激光束实现,激光束在模拟的纹间表面上反射,在模拟的坑上不反射。图 4-7 展示了 CD-R 的制造技术。
图 4-7 CD-R 的制造
CD-RW 在 CD-R 的基础上又进一步实现了多次写入数据的功能,它的制造技术与 CD-R 基本相同,不同之处在于使用了银、锢、锑、碲的合金替代了染料,这种材料具有晶体态和无定型态两种稳定状态。CD-RW 的刻录通过高能激光束在合金层创建模拟的坑(由晶体态变为无定型态)实现,CD-RW 的擦写通过中等能量激光束将模拟的坑变为模拟的纹间表面(由无定型态变为晶体态)实现,CD-RW 数据的读取与 CD-R 一致。另外,CD-RW、CD-R 与 CD-ROM 的容量(650 Mb)和数据传输速率(从 150 KB/s 到 6 MB/s 不等)是一致的。图 4-8 展示了 CD-RW 的制造技术。
图 4-8 CD-RW 的制造
DVD 使用与 CD-ROM 类似的技术,其优化主要体现在以下几点:
- 坑的直径由 0.8 μm 缩小为 0.4 μm
- 磁道间的间距缩小
- 使用红激光束替代了红外激光束
- 使用 1-2 个存储层且可以是单面或双面的
DVD 采用 MPEG 压缩数据,一个单面、单层的 DVD 的容量为 4.7 GB,可存储 133 分钟高品质视频,而双面、双层的 DVD 容量可达到 17 GB。进入 21 世纪,蓝光光盘(BD)问世,蓝光光盘采用波长更小的蓝色激光束替代红色激光束,其单层容量达到 25 GB,双层容量达到 50 GB,三层容量达到 100GB,四层容量达到 128GB。
在本节最后,我们大致讲一下 CPU 读写输入/输出设备数据时的两种不同寻址方式:I/O 独立寻址和 I/O 存储器映射寻址,以及用命令将数据从输入/输出设备传输到 CPU 和内存时,为协调输入/输出设备与 CPU 在运行速度上的差异而采取的三种不同方式:程序控制输入/输出、中断控制输入/输出和直接存储器存取(DMA)控制输入/输出。在这一部分涉及到的总线以及控制器(接口)的概念将会在 4.4 节中作详细阐述。
在 I/O 独立寻址中,用来读/写输入/输出设备的指令与用来读/写内存的指令完全不同,因为指令的不同,输入/输出设备的地址可以和内存地址重复而不致混淆,图 4-9 是 I/O 独立寻址的一个示例。
图 4-9 I/O 独立寻址
在 I/O 存储器映射寻址中,用来读/写输入/输出设备的指令与用来读/写内存的指令是相同的,因为指令的相同,输入/输出设备将会占用一部分内存地址,图 4-10 是 I/O 存储器映射寻址的一个示例。
图 4-10 I/O 存储器映射寻址
在程序控制输入/输出中,当 CPU 遇到一条输入/输出指令时,它会停下当前的工作而查询输入/输出设备的状态,如果设备做好了数据传输准备,那么数据将会被传送到 CPU,否则 CPU 将继续查询输入/输出设备的状态直到设备做好了数据传输的准备。图 4-11 向我们展示了程序控制输入/输出的流程。
图 4-11 程序控制输入/输出
在中断控制输入/输出中,当 CPU 遇到一条输入/输出指令时,它在告知输入/输出设备后便会继续做其他工作,当输入/输出设备做好了数据传输准备时,它会通知 CPU 中断当前工作并将数据传送到 CPU. 图 4-12 向我们展示了中断控制输入/输出的流程。
图 4-12 中断控制输入/输出
在直接存取器存取(DMA)控制输入/输出中,则采用 DMA 控制器来承担 CPU 的一些功能。DMA 控制器中有寄存器,可在内存传输前后保存数据块。当 CPU 遇到一条输入/输出指令时,它首先发送信息(传输类型、内存单元起始地址、传输字节数等)给 DMA,之后 CPU 就去做其他工作了。当输入/输出设备做好了数据传输准备后,DMA 控制器通知 CPU 移交总线使用权以便在 DMA 和内存间完成数据传输。图 4-13 向我们展示了展示了 DMA 控制输入/输出的流程。
图 4-13 DMA 控制输入/输出
4.4 总线与输入/输出接口
如图 4-14 所示,CPU 与存储器通过总线 (bus)相连,总线有三组线路:数据总线、地址总线和控制总线。数据总线的数量取决于计算机的字长,地址总线的数量取决于内存容量,控制总线的数量则取决于控制命令的多少。若计算机字长为 64 位,则数据总线数量为 64 根;若内存容量为 2 n 2^n 2n 个字,则地址总线数量为 n n n 根;若计算机控制命令有 2 m 2^m 2m 条,则控制总线数量为 m m m 根。
图 4-14 使用三种总线连接 CPU 和存储器
输入/输出设备通过输入/输出接口与连接 CPU 和内存的总线相连,输入/输出接口(或称输入/输出控制器)的主要作用是消除机电、磁性或光学性质的输入/输出设备与纯电子性质的 CPU 和内存在本质上的差异。如今常用的输入/输出接口有用于硬盘、光盘等设备的串行高技术配置 (Serial Advanced Technology Attachment, SATA)、串行小型计算机系统接口 (Serial Attached Small Computer System Interface, Serial Attached SCSI, SAS),用于鼠标、键盘、U 盘、打印机等设备的通用串行总线 (Universal Serial Bus, USB),用于数字投影机等显示设备的数字视频接口 (Digital Visual Interface, DVI) ,用于液晶显示器等显示设备的视频图形阵列端子 (Video Graphics Array connector, VGA connector) 等,以及用于电视机、数字音响等设备的高清多媒体接口(High Definition Multimedia Interface, HDMI)等。而曾广泛应用于硬盘、光盘等设备的小型计算机系统接口 (SCSI, 或称并行 SCSI)、IEEE 1394(或称火线接口)、(并行)高技术配置(ATA, 或称 PATA)以及曾广泛应用于键盘、鼠标等设备的个人系统/2 (Personal System/2, PS/2) 接口则已经或正在退出历史的舞台。限于篇幅,如此多的接口显然无法在这里一一介绍,这里我们仅简要介绍一下与我们日常生活形影不离的 USB 接口,对其他接口感兴趣的读者可以自行搜索了解。当然关于其他接口以及 USB 接口更为详尽的内容,笔者也会在学习完计算机组成原理后,于相关专题文章里加以阐述,不过这应该会是挺长时间之后的事情了。闲话不多说了,下面进入正题!
图 4-15 向我们展示了 USB 接口及其与输入/输出设备、CPU、内存的连接方式。USB 2.0 允许多达 127 个设备组成树状拓扑结构连接到一个 USB 接口上,其中接口(控制器, 根集线器)作为树的根,集线器作为中间节点,设备作为末端节点。根集线器能感知树中其他集线器,而其他集线器仅有传送数据的功能。输入/输出设备可以在不需要关闭计算机的情况下方便地连接到树中或从树中移除,这一特性在计算机科学中被称为热交换/热插拔(hot swapping/plugging)。USB 使用 4 根线的电缆,其中 2 根线从总线取得电压,用来为像键盘和鼠标这样的低压设备提供电压,其他 2 根线用来传送数据、地址和控制信号,为了减小噪声这 2 根线是纠缠在一起的。
图 4-15 通用串行总线(USB)
USB 2.0 提供三种传输速率:1.5 Mbps(用于低速设备如键盘和鼠标)、12 Mbps(用于中速设备如打印机)和 480 Mbps(用于高速设备如大容量存储设备)。2008 年 11 月,USB-IF 发布 USB 3.0,其传输速率较 USB 2.0 提高 10 倍,由 480 Mbps 大幅提升到 5 Gbps。 USB 3.0 插座通常是蓝色的,并向下兼容 USB 2.0。2013 年 7 月 31 日,USB-IF 发布 USB 3.1,其传输速率提升至 10 Gbps,同时也向下兼容 USB 2.0/1.0,但如果要得到 10Gbps 的传输速率,主机和目标端必须同时具备对应的芯片。2017 年 10 月 22 日,USB-IF 又发布 USB 3.2,它在现有的 USB Type-C 数据线上实现了双通道,从而实现了传输速率的进一步翻倍,同时自 USB 3.2 开始,Type-C 将成为唯一推荐的接口方案。
USB 开发者论坛(USB Implementers Forum, USB-IF)于 1995 年由一些 USB 开发公司发起成立,它是一个旨在推广、支持与维护通用串行总线(USB)的非营利组织,其著名会员有:苹果、微软、英特尔、惠普、日本电气(NEC)等
日本电气(日本電気, NEC, 恩益禧)是日本一家跨国信息技术公司,也是作为日本三大经济集团之一的住友集团的成员(另两家是三菱集团和三井集团),其总部位于东京都港区。NEC 为商业企业、通信服务企业以及政府提供信息技术(IT)和网络产品。它的经营范围主要分成三个部分:IT 解决方案、网络解决方案和电子设备。IT 解决方案主要是向商业企业、政府和个人用户提供软件、硬件和相关服务。网络解决方案主要是设计和提供宽带系统、移动和无线通信网络系统、移动电话、广播和其他系统。NEC 涉足的电子设备包括半导体、显示器以及其他的电子器件,也包括面向国际市场的 Versa 系列笔记本电脑和面向日本国内市场的 LaVie 系列笔记本电脑。此外,NEC 发明的地球模拟器曾是 2002 年到 2004 年的那个时间段里世界上运算速度最快的超级计算机。
4.5 计算机的体系结构
虽然我们说当今计算机的体系结构都基于冯·诺依曼模型,但其具体实现细节仍是多种多样的。要对这一部分做详细讲述是不现实的,不仅因为篇幅有限,而且因为笔者对此实在还知之甚少。这里我们主要介绍三个概念:复杂指令集计算机、精简指令集计算机以及并行处理。
复杂指令集计算机(Complex Instruction Set Computer, CISC)的设计策略是使用大量的指令,包括复杂指令。由于每一项简单或复杂的任务都有一条对应的指令,在这种体系结构下程序设计相对容易。然而指令集的复杂性使得 CPU 和控制单元的电路非常复杂。为此,CISC 体系结构的设计者提出了减少这种复杂性的解决方案:CPU 不再直接执行复杂的机器语言指令,而只执行被称为微操作 (micro-operation, micro-ops, μops) 的简单操作。那些复杂指令对应的一系列简单指令被保存在一种被称为微内存的特殊内存中,使用微操作的程序设计被称为微程序设计。从奔腾 Pro (Pentium Pro) 开始,Intel CPU 便开始使用 micro-ops,每一个 x86 CISC 指令在取址译码后,将会被翻译成一个或多个 RISC 指令,在流水线的后半部分,可以利用 RISC CPU 的一些技术来提高指令的执行效率。 RISC 是精简指令集计算机(Reduce Instruction Set Computer)的英文简称,顾名思义,它的设计策略是使用少量的指令完成最少的简单操作,复杂指令用简单指令子集模拟。因此,在 RISC 体系结构下进行程序设计相对困难和费时。很难说,今天我们哪一台计算机的体系结构是绝对的 CISC 或者是绝对的 RISC,世界不是非黑即白的,正如我们上面提到的 Intel Pentium Pro CPU,作为曾经 CISC 坚定支持者的行业老大 Intel 从上世纪 90 年代开始就在利用 RISC 技术来减少 CISC 技术带来的负面影响,业界人士曾经戏称 Intel Pentium Pro 为披着 CISC 外衣的 RISC。
拥有多个控制单元、多个算术逻辑单元或多个内存单元的计算机被称为能进行并行处理的计算机,像流水线技术一样,并行处理也能提高计算机在单位时间内完成的指令总数即计算机的吞吐量。并行处理涉及多种不同的技术:SIMD、MISD 以及 MIMD。SIMD 即单指令流,多数据流,它是指单个指令流的单个指令作用于多个数据项上,图 4-16 向我们展示了 SIMD 组织的构造。
图 4-16 SIMD 组织
MISD 即多指令流,单数据流,它是指多个指令流的多个指令作用于单个数据项上,图 4-17 向我们展示了 MISD 组织的构造。
图 4-17 MISD 组织
MIMD 即多指令流、多数据流,它是指多个指令流的多个指令作用于多个数据项上,图 4-18 向我们展示了 MIMD 组织的构造。许多人认为只有 MIMD 才是真正意义上的并行处理的体系结构。
图 4-18 MIMD 组织
4.6 简单计算机
在这一节中,我们将通过自定义的一台简单计算机来讲述计算机是如何执行一次加法运算的,相信通过这一节的学习,我们可以对上述讲到的计算机硬件以及由其搭建起的计算机体系结构有一个更为深入的理解,同时也可以知道用高级编程语言编写的哪怕简单的程序其在计算机内部的执行过程也并不简单:一次加法运算在高级编程语言中不过是一行代码的事情,然而在计算机内部要实现这样一次加法却要经历很多步骤。
我们自定义的这台简单计算机如图 4-19 所示,由 CPU、存储器和输入/输出设备构成,其中 CPU 拥有一个算术逻辑单元(ALU)、一个控制单元、16 个 16 位数据寄存器、1 个 8 位程序计数器(PC)和一个 16 位指令寄存器(IR);存储器有 256 个 16 位存储单元,前 64 个存储单元用来存储程序、 后 192 个单元用来存储数据;输入/输出设备由键盘和监视器(显示器)构成,其寻址方式为 I/O 存储器映射寻址,键盘地址为 0xFE(254),监视器地址为 0xFF(255).
图 4-19 自定义简单计算机
这台简单计算机的指令由 16 位位模式构成,包括 4 位操作码和 12 位操作数,操作码用来指明在操作数上执行的具体操作,因此该台计算机最多可拥有 16 条不同指令,这里我们将仅定义 14 条指令。图 4-20 展示了指令的基本格式和这 14 条指令涉及的 7 种不同指令类型,表 4-21 则列出了这 14 条指令的操作码和操作数以及其对应的具体操作。值得注意的是:寄存器地址用单个十六进制数表示,而内存单元用两个十六进制数表示,所以表中 LOAD 指令和 STORE 指令实际是占满 4 个十六进制数的。
图 4-20 指令格式和指令类型
图 4-21 简单计算机的指令集
在定义好这样一台简单计算机后,接下来,我们就来看一下在这台简单计算机中执行一次加法运算:0x00A1 + 0x00FE = 0x019F (即 161 + 254 = 415) 需要经历怎样的步骤,编写怎样的机器语言程序。要在这台简单计算机上实现这样一次加法运算需要经历如下步骤:
-
将用户键入数据传输到内存
-
用户从键盘键入数据 0x00A1,LOAD 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x01,指令寄存器译码执行指令 0x1FFE,将地址为 0xFE 的键盘键入的数据 0x00A1 传输到数据寄存器 R15
-
STORE 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x02,指令寄存器译码执行指令 0x240F,将数据寄存器 R15 中的数据 0x00A1 传输到地址为 0x40 的内存单元
-
用户从键盘键入数据 0x00FE,LOAD 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x03,指令寄存器译码执行指令 0x1FFF,将地址为 0xFF 的键盘键入的数据 0x00FE 传输到数据寄存器 R15
-
STORE 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x04,指令寄存器译码执行指令 0x241F,将数据寄存器 R15 中的数据 0x00FE 传输到地址为 0x41 的内存单元* 数据运算
-
LOAD 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x05,指令寄存器译码执行指令 0x1040,将内存单元 0x40 的数据 0x00A1 传输到数据寄存器 R0
-
LOAD 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x06,指令寄存器译码执行指令 0x1141,将内存单元 0x41 的数据 0x00FE 传输到数据寄存器 R1
-
ADDI 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x07,指令寄存器译码执行指令 0x3201,将数据寄存器 R0 和 R1 中的结果相加并将结果保存在数据寄存器 R2 中
-
STORE 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x08,指令寄存器译码执行指令 0x2422,将数据寄存器 R2 中的结果 0x019F 传输到地址为 0x42 的内存单元* 将运算结果返回给用户
-
LOAD 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x09,指令寄存器译码执行指令 0x1F42,将内存单元 0x42 的数据 0x019F 传输到数据寄存器 R15
-
STORE 指令传入指令寄存器,程序计数器指向下一条指令的内存地址 0x10,指令寄存器译码执行指令 0x2FFF,将数据寄存器 R15 中的数据 0x019F 传输到地址为 0xFF 的监视器* 停机
可以看到,要在这台简单计算机上完成这样一个简单的加法计算就需要多达 11 个步骤。虽然现今大多数计算机可以实现输入/输出设备与内存间的直接数据传输,但即便如此,要实现一个简单的加法计算仍需要 8 步操作,需要 8 条机器指令。如果哪一天,我们在学习高级编程语言时,感到不厌其烦,我们就想象一下在没有高级编程语言前,人们编程的难度和繁琐程度将多少倍于现在吧,也许我们这样想想,就该释怀了!
本章的内容到这里就要和大家说再见了,下一章,我们将一起走进神奇的计算机网络世界,去看一看这个给今天人类社会,给我们每个人的衣食住行带来深刻变革的计算机技术的庐山真面目,感受那些曾经站在时代之巅的人类精英们,感受他们的恢弘愿景、壮志豪情和非凡智慧如何在今天开花结果光耀大地!