



本节将回顾自动计算设备发展历史上的一些经典机器,并重点介绍每种机器所体现的主要技术进步。由于巴贝奇(Babbage)的分析机中包含了许多天才式的突破,因此也在此进行介绍。之所以讨论其他系统,是因为它们体现了重大的技术进步,并在其生命周期中完成了重要的实际工作。
从1834年直到1871年去世,查尔斯·巴贝奇(Charles Babbage)一直致力于分析机的设计实现。虽然分析机最后没有真正实现,但它似乎是一种既可行又完整的计算机体系结构。分析机旨在提供一种通用的可编程计算设备,它完全是机械式的,大部分部件由黄铜制造,使用蒸汽机来驱动传动轴工作。
分析机借鉴了提花织机的穿孔卡片、音乐盒中的旋转圆筒,以及他早期设计的差分机技术(在他的有生之年并没有完全实现,与计算机相比,差分机更像是一种专门的计算器,而非计算机),否则,分析机就完全是巴贝奇的原创。
与大多数现代计算机采用二进制数不同,分析机采用十进制数,这是机械技术与数字电子技术最大的不同之处。制造具有10个位置的机械轮很简单,因此巴贝奇选择了人类易于理解的以10为基数的计数格式,这在技术上并不比使用其他数字作为基数更具挑战性。另一方面,简单的数字电路不能像机械轮那样容易地保持10种不同的状态。
在分析机中,所有数字都是40位十进制数。使用如此多的数位可能是为了减少数值溢出的问题。然而,分析机不支持浮点数计算。
分析机中,每个数字存储在包含40个轮子的垂直轴上,每个轮子能够停在与数字0~9相对应的10个位置。第41个数字轮子上包含一个符号:该轮子上的任意偶数代表一个正号,任意奇数代表一个负号。分析机的轴在某种程度上类似于现代处理器中使用的寄存器,不同之处在于轴的读取是破坏性的,读取后该轴的值设置为0。如果需要在读取一个轴之后仍保留该轴的值,则必须使用另一个轴来存储该值的副本。通过与每个数字轮啮合一个齿轮,然后旋转轮子读出数值,可以实现数字从一个轴传送到另一个轴,或者在计算中使用。用作系统内存的轴统称为存储(store)。
两个数字相加的过程有点类似于小学加法。假设存储在一个轴上的加数,要与另一个轴上的被加数(也称为累加器)相加。机器通过一串齿轮将每个加数的数字轮连接到相应的被加数的数字轮。然后,驱动累加器按照加数的数字沿递增的方向进行旋转,同时加数递减旋转到零。如果累加器的数字从9回绕到0,则累加器的下一个数位将递增1。该进位操作可能需要在多个数位间传播(考虑将1加到999999)。在过程结束时,加数轴将保持在数值0,被加数轴将保持两个数字的和。从一个数字到下一个数字的进位传播是加法过程中最复杂的机械部分。
分析机中的操作由“音乐盒状的旋转桶”在称为“磨机”(mill)的结构中进行顺序处理,该结构类似于现代CPU中的控制单元。
每条分析机指令都编码在圆桶的垂直位置上,特定位置螺柱的存在与否表示要么与驱动机机械的某一部分接合,要么该部分的状态保持不变。根据巴贝奇的设想,包含进位传播在内,两个40位数字的相加大约需要3秒。
巴贝奇为分析机提出了几个至今仍有意义的重要概念。他的设计支持一定程度的并行处理,包括同时执行乘法运算和加法运算,从而加速了一系列数值计算,这些数值将以数字表格的形式输出。加法运算等数学运算支持一种流水线形式,在该流水线中,对不同数值的顺序运算在时间上重叠。
巴贝奇很清楚机械设备的复杂性,如摩擦、齿轮齿隙和随着时间的推移出现的磨损。为了防止由这些效应引起的错误,计算引擎在跨轴的数据传输过程中采用了一种叫作“锁”的机制。锁强制使数字轮进入有效位置,并防止累积误差使轮子漂移到不正确的值。锁的使用类似于现代处理器中能够对潜在的弱输入信号进行放大的数字逻辑门。
分析机使用穿孔卡进行编程,支持分支操作和嵌套循环。分析机最复杂的程序是由Ada Lovelace开发的计算伯努利数(数论中的一个重要数列)的程序。用于进行该计算的分析机代码被认为是第一个公开的具有相当复杂性的计算机程序。
巴贝奇制造了分析机样机的一部分的试验模型,该模型现在收藏在伦敦的科学博物馆。
第一台可编程的通用电子计算机, 电子数字积分计算机 (Electronic Numerical Integrator and Computer,ENIAC)于1945年完成设计。该系统耗电150kW,占地约170m 2 ,重达27t。
ENIAC基于真空管、二极管和继电器等元件设计,其中包含17000多个用作开关的真空管。与分析机类似,它使用十位环形计数器(见第2章)实现了十位十进制数表示。它从IBM穿孔读卡机接收输入数据,并将计算后的输出数据发送到穿孔机。
ENIAC体系结构能够执行复杂的处理步骤序列,包括循环、分支和子程序。该系统有20个10位数累加器,类似于现代计算机中的寄存器。但是,除了累加器之外,它最初没有任何存储空间。如果在之后的计算中需要使用计算的中间结果,则必须将它们写入穿孔卡片,并在需要时读回。ENIAC每秒可以执行大约385次乘法运算。
ENIAC程序由插板布线和基于开关的功能表组成。对系统进行编程是一个艰巨的过程,通常需要优秀的女程序员团队花费几周时间才能完成。由于真空管经常发生故障,因此可靠性也是一个问题,需要在日常维护的基础上进行故障排除,以便对发生故障的真空管进行隔离和更换。
ENIAC于1948年进行了改进,增加了通过穿孔卡片取代插板来对系统进行编程的能力。这一改进极大地提高了程序开发的速度。作为此次升级的顾问,约翰·冯·诺伊曼(John von Neumann)提出了一种通用的计算机体系结构,其中包含存放程序指令和数据的单一存储器空间、由算术逻辑单元和寄存器构成的处理单元、具有指令寄存器和程序计数器的控制单元。这种结构称为冯·诺伊曼体系结构,许多现代处理器都采用这种结构。第3章将详细讨论这种体系结构。
ENIAC的早期应用包括研制氢弹以及计算远程火炮射程表等。
在ENIAC问世之后的几年里,有几项突破性技术使得计算机体系结构进步显著:
● 约翰·巴丁(John Bardeen)、沃尔特·布拉顿(Walter Brattain)和威廉·肖克利(William Shockley)于1947年发明了晶体管,和当时流行的真空管技术相比,晶体管速度更快、体积更小、功耗更低,另外,生产工艺充分改进后,晶体管的可靠性比易发生故障的真空管高得多。
● 1958年,在得州仪器公司(Texas Instruments)的杰克基尔比(Jack Kilby)的带领下,集成电路产业开始将大量原先分立的元件集成到一块硅片上。
● 1971年,英特尔开始生产第一款商用微处理器——Intel 4004。4004主要用于电子计算器,专门处理4位二进制编码的十进制数字。
虽然Intel 4004起初并不起眼,但微处理器技术在接下来的十年里迅速发展,单芯片上集成的电路元件越来越多,因此,单芯片微处理器的能力也得到了很大的提升。
1. 8088微处理器
IBM于1981年发布了IBM PC。最初的PC配备了时钟频率为4.77MHz的Intel8088微处理器。该处理器具有16KB的随机存储器(Random Access Memory,RAM),并可扩展到256KB。该PC包含一个或两个软盘驱动器,还提供彩色显示器。版本较新的PC支持更大容量的内存,但由于部分地址空间已预留给视频内存和只读存储器(Read-Only Memory,ROM),因此该体系结构最多可支持640KB的RAM。
8088包含14个16位寄存器。其中4个是通用寄存器(AX、BX、CX和DX)。另外4个是将地址空间扩展到20位的段寄存器(CS、DS、SS和ES)。段寻址的功能是将16位段寄存器的内容左移4位后,与指令中的16位偏移量相加,从而生成1MB以内的物理内存地址。
其余的6个寄存器分别是 栈指针(SP) 、 基指针(BP) 、 源索引(S I ) 、 目标索引(DI) 、 指令指针(IP) 和 状态标志(FLAGS) 。现代x86处理器采用与此寄存器集非常类似的体系结构(第10章将详细介绍x86体系结构)。8088和x86之间最明显的区别是x86中将寄存器宽度扩展到了32位,并增加了一对段寄存器(FS和GS),这两个寄存器目前主要用作多线程操作系统中的数据指针。
8088的外部数据总线宽度为8位,这意味着读取或写入16位数据需要两个总线周期。与采用16位外部总线的早期8086处理器相比,这是性能较低的一个重要原因。然而,使用8位总线使得PC的生产成本更低,并提供了与较低成本的8位外围设备的兼容性。这是一种优先考虑成本的设计方法,有助于降低PC的价格,获得更多潜在客户。
由于程序存储器和数据存储器共享相同的地址空间,因此8088通过单一总线访问存储器。换句话说,8088实现了冯·诺伊曼体系结构。8088指令集包括数据移动、算术运算、逻辑运算、字符串操作、控制转移(有条件跳转和无条件跳转、子程序的调用和返回)、输入/输出(I/O)等指令。该处理器中每条指令平均执行时间大约是15个时钟周期,故其执行速度约为0.3MIPS(Million Instructions Per Second,每秒执行的指令数,以百万条为单位)。
8088支持9种不同的存储器寻址模式,如此多的寻址模式可有效地实现一次访问单个数据或遍历数据序列。
在8088体系结构中,段寄存器提供了一种巧妙的方法,能够在不增加大多数内存访问指令长度的情况下扩展可寻址内存的范围。每个段寄存器允许访问从物理内存地址为16字节整数倍处开始的64KB内存块。也就是说,16位段寄存器表示低4位为0的20位基地址,指令可以使用16位偏移量来访问由段寄存器定义的64KB段内的任何位置。
CS寄存器用来指明代码段在内存中的位置,并用于获取指令、执行跳转、进行子程序调用与返回。DS寄存器定义了数据段位置,一般用于涉及内存数据访问的指令。SS寄存器设置了栈段位置,用于在子程序中分配本地内存和存储子程序的返回地址。
在每个代码段、数据段和栈段中,小于64KB的程序可以完全忽略段寄存器,因为这些段寄存器只需要在程序启动时设置一次(编译器会自动设置),并且在执行过程中保持不变。实现起来非常简单!
当程序的数据大小超过64KB时,情况就变得比较复杂了。基于8088体系结构的编译器区分对内存的近程访问和远程访问。近程指针表示相对于当前段寄存器中基址的16位偏移量。远程指针包含32位寻址信息:16位段寄存器值和16位偏移量。远程指针显然需要16位额外的数据内存以及额外的处理时间。
使用远程指令进行一次内存访问涉及以下步骤:
1)将当前段寄存器内容保存到临时存储位置。
2)将新的段值加载到段寄存器中。
3)使用相对于段基址的偏移量来访问数据(根据需要进行读取或写入)。
4)恢复原始的段寄存器值。
使用远程指针时,可以声明最大64KB的数据对象(例如,字符数组)。如果需要更大的结构,就必须设法将其拆分成不超过64KB的块,并对这些块进行管理。由于需要管理段寄存器,因此那些需要访问超过64KB数据的程序容易发生代码大小膨胀和执行速度减慢的问题。
IBM PC主板上还有一个插座,可用于安装Intel 8087浮点协处理器。8087的设计者发明了32位和64位浮点数的数据格式和处理规则,该数据格式和处理规则于1985年作为IEEE754浮点标准,至今仍在广泛使用。8087每秒可以执行大约50000次浮点操作。我们将在第9章中详细介绍浮点处理。
2. 80286和80386微处理器
IBM PC的第二代PC(名为PC AT)于1984年发布。AT代表先进技术(Advanced Technology),主要指的是在原先PC的基础上,使用了英特尔80286处理器,带来了几项重大的改进。
与8088一样,80286也是一个16位处理器,保持与8088的向后兼容性:8088代码可以原封不动地在80286上运行。80286具有16位数据总线和支持16兆字节地址空间的24位地址线。相比于8088的8位总线,16位的外部数据总线提高了数据访问性能。在许多应用中,指令执行率(每个时钟周期执行的指令数)大约是8088的两倍,这意味着在相同的时钟频率下,80286的速度将是8088的两倍。起初,PC AT处理器的时钟频率为6MHz,后来版本的时钟频率为8MHz。80286在6MHz频率下实现了约0.9MIPS的指令执行率。
80286实现了受保护的虚拟地址模式,旨在支持多用户操作系统和多任务处理。在保护模式下,处理器强化内存保护,以确保一个用户的程序不会干扰操作系统或其他用户的程序。由于多用户、多任务环境中需要足够的内存空间来保存上下文,在当时的条件下,其成本的增加令人望而却步,因此这一突破性技术进步在提出后的多年内几乎没有得到使用。
x86处理器系列的下一代是1985年推出的80386。80386是32位处理器,在保护模式下支持32位线性内存模型。线性内存模型允许程序员在不需要管理段寄存器的情况下直接寻址高达4GB的存储空间。康柏公司(Compaq)在1986年推出了一款名为DeskPro的个人计算机,该计算机基于80386,且与IBM PC兼容。DeskPro附带了针对80386体系结构的Microsoft Windows操作系统。
80386在很大程度上保持了与80286和8088处理器的向后兼容性。在80386中实现的设计仍然是当前标准的x86体系结构。有关该体系结构的更多信息将在第10章中介绍。
第一版80386的频率是33MHz,其性能达到了11.4MIPS。基于x86体系结构的现代处理器具有更高的时钟频率,使用了诸如高速缓存等提升性能的技术,且在硬件层面采用更高效的指令执行方式,因此运行速度比最初的版本快几百倍。
2007年,史蒂夫·乔布斯(Steve Jobs)将iPhone引入了全新的世界。iPhone建立在之前苹果计算机的革命性进步之上,包括1984年的Macintosh计算机和2001年的iPod音乐播放器。iPhone集iPod、手机和联网计算机的功能于一身。
iPhone废除了当时智能手机上常见的硬件键盘,取而代之的是能够显示屏幕键盘或其他类型的用户接口的触摸屏。触摸屏由用户手指驱动,并支持照片缩放等多指手势操作。
iPhone运行的是OS X操作系统,与当时旗舰Macintosh计算机使用的操作系统相同。在苹果公司开始允许第三方开发应用程序后,这一决策立即使iPhone支持为Mac开发的大量应用程序,并使软件开发人员能够迅速推出为iPhone量身定制的新应用程序。
iPhone 1的屏幕为3.5in(1in=2.54cm),分辨率为320×480像素。它的厚度为0.46英寸(比其他智能手机更薄),内置200万像素摄像头,重量为4.8oz(1oz = 28.3495g)。其中的距离传感器用于检测手机与用户耳朵间的距离,并在通话过程中关闭屏幕和触摸屏的感知功能。iPhone有一个环境光传感器用来自动设置屏幕亮度,还有一个加速计用来检测屏幕是纵向还是横向。
iPhone 1包含128MB内存,以及4GB、8GB或16GB的闪存,并支持全球移动通信系统(Global System for Mobile communications,GSM)蜂窝通信、Wi-Fi(802.11b/g)和蓝牙。
与IBM PC丰富的公开信息相比,苹果在公布iPhone结构细节方面非常保守。苹果没有公布第一代iPhone的处理器或其他内部组件的信息,只是简单地称其为封闭系统。
尽管缺乏来自苹果的官方信息,但其他各方已经满怀热情地拆解了各种型号的iPhone,并试图确定手机的组件及其互连方式。软件侦探们设计了各种测试,试图确定iPhone中使用的处理器型号和其他数字设备的实现方式。但是逆向工程的成果并不确保其正确性,因此本节对iPhone体系结构的描述持保留态度。
iPhone 1处理器是三星制造的32位ARM11,运行频率为412MHz。ARM11是上一代ARM处理器的改进版本,包括8级指令流水线,并支持提高音频和视频性能的单指令多数据(SIMD)技术。ARM处理器体系结构将在第10章进一步讨论。
iPhone 1由3.7V锂离子聚合物电池供电。电池不可更换,苹果公司估计,电池在经历400次充放电后,容量将损失约20%。苹果公司标称一次充电后的待机时间长达250小时,通话时间长达8小时。
iPhone问世6个月后, Time 杂志将iPhone评为2007年的“年度发明”。2017年, Time 杂志评选出了有史以来最具影响力的50件小工具,iPhone位居榜首。
下节将探讨随着时间的推移,计算机技术进步与基于硅工艺的集成电路潜在的物理极限之间的相互作用。