图书前言

我们认为对计算机科学和工程的学习必须反映这一领域的当前情况,介绍组成计算的基本原则。同时,学习计算各方面的读者都需要了解决定计算机系统的能力、性能、直至计算机系统成功与否的组织设计原则。

现代计算机技术要求每个专家既懂硬件又懂软件,软硬件在多个层次上的交互提供了理解计算基础的框架。无论你感兴趣的是计算机科学还是电子工程,其中计算机设计和组成的中心思想是一致的。本书重点讲述软硬件的关系以及目前计算机系统的基本概念。

通常,大多数的书都把汇编语言、组织结构和设计当作不相关的子集介绍。在我们看来,随着计算机技术的发展,这种差别逐渐失去了意义。为了更透彻理解这个领域的广泛性,我们需要理解这几个方面的相互依赖关系。

本书适合具有少量汇编语言或逻辑设计知识,想了解计算机组织的基本结构;以及有上述背景知识,想学习如何设计计算机,并且想了解计算机系统工作原理的读者。

第2版的变化

在第2版中,我们有6个主要目标:使书中的内容更接近实际应用;使本书更适合初学者阅读;增加了万维网(world wide web,WWW)的内容;改善质量;改进教学方法;更新了实用技术部分的内容,以反映自1994年第1版以来计算机产业的进展,这也是我们编写第2版的主要原因。

首先,为了使书中的例子更具体,与实际应用更贴切,每一章我们都将展示这些想法是如何在IBM和Motorola最新推出的微处理器中实现的,从而使读者可以知道我们讨论的技术是怎样在台式机上实现的。每一章都增加“实例”一节,将书中介绍的想法同你每天使用的机器联系在一起。

其次,我们希望本书能使读者对计算机组织结构的整体有更好的了解。每一章都列有本章所讨论的关键术语。另外,我们还用日常生活中的例子来比喻计算机中微妙的道理:

■用商用飞机来展示带宽和延迟等性能上的差别。

■用间谍的隐蔽行动来说明过程调用和嵌套。

■用铅锤来解释前向逻辑是如何工作的。

■用洗衣房来表明流水线的运行和阻塞。

■用图书馆的桌子来比喻存储系统层次结构。

■用学员数增多引起管理开销的增长来说明在大规模多处理器上获得高性能的难度。

我们特别增加了汇编语言编程的例子,每个例子都有详细的说明,以帮助初学者更好地理解第3和第4章的汇编语言程序。在有关流水线的第6章我们增加了概述部分,使读者不必了解流水线数据通路和控制的细节即能理解有关流水线设计的重要观点和想法。

第三个目标是除正文讲述之外提供万维网上的链接和说明。

该网站提供了最新的相关机器的一些例子,可以帮助了解书中观点的最新实现。例如,网站增加了一个新的在线补充(“Web Extension Ⅰ”),用来与RISC体系结构作比较。另外,它还包括指向有关本书特定引用的其他站点的链接;如何使用PCspim的说明; SPIM模拟器在DOS和Windows环境下的最新版本;到SPIM其他版本的链接;对书中插图的访问;演讲幻灯片;到讲师主页的链接;在线指导手册。该网站还包括了第1版的补充附录(“Web Extension Ⅱ”、“Web Extension Ⅲ”),希望能给读者提供有价值的参考。我们会定期更新这些主页以提供更新更好的链接。

第四,我们想通过修订版尽可能多地改进书中的不足。第1版使用β测试,以检验哪些方面良好,哪些方面还存在不足,我们取得了令人满意的改进结果。第2版同样使用了β测试。为了进一步减少书中的错误,我们延长了开发周期,更多的计算机专家参与了本书的制作过程。首先,Tod Amon校对了所有的习题,许多专家对习题给出了宝贵的建议。书中现有30%新的习题,还有30%改写过的习题,共有400道。我们相信这些习题已表述得更明确,可为更多的学生提供练习的机会。其次,Kent Wilken仔细阅读了测试版,提出了上百条建议。在我们修改了测试版之后,George Adams重新进行校对,再一次提出了上百条宝贵的建议。最后,我们检查了整个稿件,以找出编写过程中遗漏的错误。虽然本书还存在一定的错误,但我们确信第2版比第1版肯定是强得多了。

第五个目标是扩充书中内容的深度,解决第1版读者提出的难题。我们扩充了第3章介绍过程的内容,用大量的例子来说明过程的内部结构。第4章用更多的篇幅介绍先行进位机制和进位保存加法器。第5章,增加了几个寄存器以简化对多周期数据通路的说明。第6章加入了“流水线概述”一节,删去了大量介绍流水线细节的例子,从而大大减少了篇幅。我们对流水线的图表也做了大量的改动,使其更易理解和保持一致性。我们重新组织了第7章,首先集中介绍高速缓冲存储器,然后介绍虚拟存储器和转换缓冲,最后介绍它们的共同之处。在讲述虚存时,我们把重点放在它的硬件保护功能而不仅仅是层次存储的一部分。第8章集中于大量的定量描述及定向设计。第9章完全重写,以反映1994年以来并行处理工业的飞速发展。

最后,从第1版至今,计算机已能以1 teraFLOPS(每秒1012次浮点数操作)的速度或每微秒百万浮点运算的速度运行程序,计算机首次战胜了人取得国际象棋的胜利,整个世界越来越欣喜于万维网的产生。这些事件发生的原因在于,计算机设计者们在过去的10年里将计算机的性能提高了100倍,并把多个机器连在一起以获得更高的性能。我们将介绍一些使这些奇迹得以实现的新的思想,例如第6章的分支预测和乱序执行,第7章的多层次和非阻塞的高速缓存,第8章的交换网络和新型总线技术,第9章的非均匀存储器访问、共享存储多处理器和机群。

补充和网上扩展

本书附有网上补充、扩展和资源的目录,包括一份完整的电子版的补充资料和与本书有关的大量材料和资源。这些都可以在出版商的网站(www.mkp.com/cod2e.htm)上获得。在补充材料包中有在线教师手册。除了答案,教师手册中的内容均可在网上获得。教师可直接同出版商联系获取答案。

教师还可以与出版商联系索取印刷好的教师手册,手册的内容包括章节目标、讲授线索、关键点以及习题答案等。

本书和《计算机系统结构: 一种定量的方法》的比较

许多读者可能熟悉《计算机系统结构: 一种定量的方法》(Computer Architecture: A Quantitative Approach)一书,我们编写该书的目的是以工程为基础,以定量的性能/价格比来描述计算机系统结构的原理。我们使用实例和度量相结合的办法,在商用系统基础上,介绍实际的设计经验。我们的目标是要说明计算机的系统结构可以通过科学原理,而非描述的方法来讲解。

本书的大多数读者并不都是想成为计算机系统结构专家,然而,软件设计者对系统中硬件技术的理解程度决定了未来软件系统的性能。因此,编译器的设计者、操作系统的设计者、数据库的设计者和其他软件设计人员都需要理解本书讲述的基本原理。同样地,硬件设计者也应该认识到他们的工作对软件应用产生的影响。

因此,本书并不是计算机系统结构的一个子集。我们以新的方式讲解每个话题,故对两本书相同的话题重新进行了编写,同时,本书加入了许多新的话题。为了进一步保证本书的独立性,我们交换了不同部分的作者。第一本书中Hennessy编写的内容在本书中由Patterson来编写。同样,第一本书中Patterson编写的内容这次由Hennessy来编写。我们的几个校对人员建议把本书命名为“Computer Organization: A Conceptual Approach”以强调与其他书的区别。我们希望读者可以从每部分获取新的见解,以及对现代计算机中运用的原理和抽象概念更有效的了解。

我们很高兴地看到“Computer Organization and Design”以及“Computer Architecture”第2版,在重写的过程中大多数介绍性材料被删除,从而大大减少了这两本书第1版的重复内容。

通过发展过程来学习

许多作者往往喜欢给出某一硬件概念的最新版本,然后花大量时间解释这些深奥的概念的原理工作。我们没有从基本原理讲起,而是着重介绍每个技术思想的最初版本,以及它是怎样工作的、如何形成的。我们认为先摆出基本概念有助于更好地理解今天的计算机为什么是现在这个样子,以及在技术改进中是如何演变的。

为了便于讲解,我们以MIPS(百万条指令每秒)处理器为基础。MIPS提供了简单易懂的指令集,并可由一种简单、直接的方式实现,使得读者能够掌握整个机器的组织结构,以及了解指令是如何实现的。在本书中,我们先给出概念,再详细说明,从技术的简单版本讲起,过渡到复杂的实现。每章都有以这种方式讲解的例子。第3章从一个简单指令类型开始,讲解MIPS汇编语言;第4章,对现代计算机运算中运用的概念和算法的讲解是从一个熟知的分级学校算法开始;第5和第6章,先讲MIPS子集的最简单实现,再介绍流水线;第7章介绍了层次存储的概念,先讲最简单的高速缓存,然后扩展其深度和复杂度,直到虚存和TLB。

这种以发展过程为讲解的方法在第5和第6章有明显的体现,这两章介绍了处理器完整的数据通路和控制过程。学习是一个看的过程,因此我们给出了许多图,其中含有详细内容,以及计算机中的事件执行顺序。

学习本书

我们的目标是通过硬件和软件的关系来说明基本原理,通过各个章节的特点来达到了这个目标。硬件/软件接口用来突出这些关系。上面提过每章都有“实例”一节,把概念和应用在桌面计算机中的机制联系起来。我们希望通过本书能为读者继续学习硬件和软件的内容提供良好的基础。

我们用C语言来说明高级语言与机器语言的关系,以及描述硬件算法。C语言广泛应用于讲授编译器和操作系统的课程,许多计算机专家都使用C语言。它的一些特征使其适合描述硬件算法。对于更熟悉Pascal语言的读者,在站点wwwmkp.com/cod2e.htm的“Web Extension Ⅱ”中提供了C语言的简单介绍,足以使程序员读懂书中的C代码。

我们设法使本书中的进度适合不同程度的读者。对于初学者并不重要但高级读者可能对它感兴趣的内容,我们放在正文的后面,作为附加部分。适当的时候在习题中介绍一些深入的概念,并在“提高题”中进行讨论。另外,我们发现学生们对逻辑设计背景知识的了解差别很大,因此,附录B为缺乏这方面知识的读者提供了必要的背景知识。另外还有一些更复杂的内容,以便为具有一定基础的读者阅读。在课程中这些材料可当作辅助讲稿,或者作为课程的一部分介绍,采用哪种方式要根据学生的基础和课程的教学目标而定。

我们还发现读者对计算机领域的历史很感兴趣,“历史回顾”一节附有许多重要机器的图片和它们背后鲜为人知的故事。我们希望关于这些趣闻的回顾和图片能为读者提供新的思路。

课程要点

教师面临的一个难题是如何平衡汇编语言编程和计算机组成这两部分内容。我们写这本书是为了使读者更多地了解计算机组成和设计,同时书中还完整地介绍了汇编语言。与传统的以CISC(复杂指令集计算技术)为基础讲述汇编语言的课程相比,我们使用RISC(精简指令集计算技术)结构,这样学生可以在更短的时间内了解指令集的基础知识和汇编语言编程。许多教师发现,与使用真实机器的本地模式相比,使用模拟器可以在更短的时间内为学生提供汇编语言编程经验,对于学生来讲学习也更容易一些。

SPIM是由James R.Larus开发的MIPS处理器的模拟器。网站www.mkp.com/cod2e.htm有指向SPIM和XSPIM的链接,它们是由Larus开发的运行于UNIX的版本,以及由David Carley从UNIX版本改写的运行于PCspim(DOS)和PCspim(Windows)的版本。尽管与UNIX版本不同,但DOS和Windows版本提供了相同的基本功能。PCspim(Windows)可以在Windows 3.1、Windows 95和Windows NT下运行。我们认为这会使学生有更多的机会接触计算机的组成(见附录A)。最后,以高级语言为基础逐步学习汇编语言比直接学习汇编语言要容易得多。第3章和附录A可以根据读者的基础组合或分开使用。第3章提供了当代汇编语言编程的基础知识,附录A详细介绍了如何使用汇编语言编程,使读者对汇编语言编程有更完整的了解。最后,我们希望这种方式能给大多数读者提供对汇编语言更有效的讲解,同时,如果教师想更多地讲解关于汇编语言编程的知识,我们也希望本书有足够广泛的内容来提供详细的教学和实验内容。

作为扩展学生关于计算机组成方面的重要原理的课程,第4到第9章解释了关键性的原理: 第4章讲述了整数和浮点数的机器表示以及算术算法的工作原理;第5到第6章分层次地讲解了控制和流水线技术的原理;第7章介绍了存储器层次结构的原理,把高速缓存和虚拟存储器的思想统一起来;第8章描述了I/O系统的组织和控制,解释了硬件和操作系统的协作关系;最后,第9章以例子来说明多处理器的关键原理。

对于希望更多地了解计算机设计的读者,可以阅读第4~8章,以及附录B和C的内容。例如,第4章讲述了许多计算机设计者用来提高加法和乘法速度的技术;第5和第6章以第4章的运算元件和附录B中详细介绍的普通数据通路元件(例如寄存器堆和存储器)为基础讲述了MIPS子集的完整实现过程;第5章以一个非常简单的实现开始,在其上建立了一个完整的数据通路和控制单元。进一步修改这个实现,使每个指令可占用不同的时钟周期数,从而提高了系统的速度。对这个多周期系统的控制可使用第5章中的两个不同的方法来实现;附录C介绍了控制部分如何由结构化逻辑块实现;第6章在第5章的单时钟周期系统基础上介绍流水线机器的设计,包括流水线冲突处理和中断控制的工作原理。对计算机设计感兴趣的学生不仅可以了解同一指令集的三种设计方法,还会看到几种设计的优缺点比较。

章节组织及概况

以下内容是本书的核心,其他章节用来介绍和扩展这个核心。

许多学生说他们很愿意学习关于硬件的速度和容量的持续快速发展,以及一些计算机发展的历史。第1章主要讲述这部分内容,并介绍了软件和硬件在未来几十年的发展前景。第1章还简要介绍了其他章的主要内容。

第2章表明时间是计算机性能的最可靠的度量方式,并将硬件、软件设计者经常使用的度量同时间相比较。这部分内容是第5~7章将要介绍的内容的基础,它提供了度量这些技术的基本框架。

第3章讲述了编程语言的知识,从这种语言得出汇编语言,并列出了汇编语言设计者遵循的几条重要规则。我们选择了MIPS的指令集为例,这样学生可以看到由MIPS编译器产生的代码。出于教学上的需要,我们把延迟分支和负载留到第6章讲。幸运的是汇编解释器可以处理延迟和负载,这样程序员可以不必考虑这些复杂的问题。读者还可以在本章看到一个不同的指令集设计——Intel 80x86指令集。

尽管在学习计算机运算时,哪些内容是必要的,哪些内容可以跳过还没有定论,我们还是依据我们对这个问题的结论来写第4章。我们先介绍本章中所有的重要概念,在习题中提供更深的题目的一些背景知识。这样,教师可以深入讲解一些内容,并留些习题给学生做;也可以跳过这些材料。

第5和第6章详细介绍了一个处理器实现的例子。大多数读者希望通过实际的例子来学习。一个完整的例子能使读者了解关于流水线/非流水线型处理器的各个部分协调工作的一些基本原理。为了便于教师灵活掌握讲授硬件控制实现部分的内容,我们把上述内容放在附录C中详细阐述。

第2~6章提供了关于编译器的重要背景知识,第7和第8章为进一步了解操作系统和数据库提供了必需的基础。第7章描述了存储器层次结构原理,重点放在高速缓存和虚存的相通性上。第7章强调了操作系统的重要地位及其与存储系统的交互作用。

有关操作系统、数据库、图像处理、网络的话题都需要了解I/O系统和影响这个系统的设备的主要技术特征。第8章介绍了I/O系统的组织,从总线结构到处理器和I/O设备的通信,以及操作系统的管理作用。我们更注重硬件/软件之间的接口,因此,引入了其他一些重要的概念。这些概念不仅应用于计算机组成上,还是其他领域的基础。例如,应用于非同步I/O设备的握手协议,在每种分布式系统都有应用。

对于一些读者而言,本书可能是他们了解计算机系统的惟一途径,因此,我们介绍了多处理器的内容。我们没有介绍传统的并行机器的特征,而是描述了可能决定未来几十年并行处理器设计的底层原理。这部分包括一个小的运行例子,以说明同一程序用于不同的并行结构的不同版本。如前所述,我们在本书的主页www.mkp.com/cod2e.htm上链接了许多多处理器的实际应用实例。

因为本书要为有不同兴趣的读者提供一个介绍,因此我们尽量以灵活的方式来介绍。使用附录来讲述有关汇编语言和逻辑设计的内容就是这一灵活性的主要体现方式之一,有一定基础的读者可跳过这部分内容。附录使得本书可适用于具有不同逻辑设计和软件背景知识的电子工程或计算机专业的学生。

学习汇编语言编程的最好办法就是编程序。本书提供的模拟器可用于很多情况。为此,我们邀请Jim Larus(SPIM模拟器的发明者)帮助我们编写附录A。附录A描述了SPIM模拟器并深入介绍了MIPS汇编语言,另外,还讲述了汇编程序和链接程序。就是这两个程序将汇编语言翻译成可执行的机器语言。

有关逻辑设计的附录只是作为计算机组成的补充材料,而不是对逻辑设计的全面介绍。许多电子工程专业的学生在学习计算机组成课程时已具备了逻辑设计或数字电路的基础,而许多大学计算机系的学生并不具备相关的基础。附录B的前几节提供了必需的背景知识。我们在正文中讲述了诸如存储器的组织结构、处理器的有限状态机的控制等内容,这些对于理解计算机组成结构是至关重要的。

内容的取舍

如果你没有有关的背景知识,想一页一页地阅读本书,建议采取以下顺序:第1章、第2章、网上扩展Ⅲ(如果需要)、第3章、第4章、附录A、网上扩展Ⅱ(如有兴趣)、附录B、第5章、附录C、第6~9章。显然,大多数读者会有选择地阅读。我们试图使读者能够灵活地选择阅读内容,而不必过多地阅读已掌握的内容。每一章都是一个完整的单元,也可以相互参考相关的内容或图示。本书已成功地用于为许多有不同目的和不同背景知识的学生开设的课程。

结论

如果读者读了下面的致谢部分,将会看到我们尽了最大努力修改书中的错误。一本书的印刷次数越多,我们就有更多的机会来修改错误。如果你发现任何错误,请发电子邮件到mkp@mkpcom与我们联系。

最后,与上本书一样,作者的排名不分先后。有时,你会看到Hennessy和Patterson,有时你又会看到Patterson和Hennessy。甚至在著作目录中你也会看到两种不同的列法。这再次反映本书是两个人合作的结晶:我们共同探讨主要内容和表述方法,然后各自编写一半的内容,再为对方的写作稿做校对。页数再次说明我们编写了几乎同样多的内容。因此,我们共同承担任何批评。

感谢为第2版做贡献的人们

我们再次表达对Jim Larus的感激,感谢他为本书提供的关于汇编语言编程的专业见解。我们欢迎读者使用他们在威斯康辛大学所开发和维护的模拟器PCspim。在DOS和Windows下运行的模拟器是由David Carley开发的。

得克萨斯西南大学的Tod Amon是习题编者,编写和编辑了许多新的练习题。他还采用了以下诸人提供的习题:Doug Clark,普林斯顿大学;Richard Fateman,加州大学伯克利分校;Max Hailperin,古斯塔夫斯阿道夫斯学院;Robert Kline,西彻斯特大学;Gandhi Puvvada,南加州大学; Hamzeh Roumani,约克大学;Mike Smith,哈佛大学;Gregory Weber,印第安那大学。

以下诸位为习题做了解答:

   George Adams,普渡大学;以及下列学生: Pritpal Ahuja,普林斯顿大学;Alan Alpert,西南得克萨斯州立大学;Charles Farleigh,斯坦福大学;Bob Heath,肯塔基大学;Scott Karlin,普林斯顿大学;Bill Poucher,斯坦福大学;Xiang Yu,普林斯顿大学。

   Marc Zimmerman,Kent Wilken加州大学戴维斯分校的学生,做出了习题的答案以帮助Tod Amon衡量练习题表达的明确性。基于这些人的努力,我们有了一个更加明确和丰富的习题集。

β测试是在1996年的秋天以班为测试单位,在以下老师和大学中进行的: Mike Clancy,加州大学伯克利分校; Doug Clark,普林斯顿大学;David Culler,加州大学伯克利分校;Max Hailperin,古斯塔夫斯阿道夫斯大学;Richard Hughey,加州大学圣克鲁斯分校;Mary Jane Irwin,宾西法尼亚州立大学;Truman Joe,斯坦福大学;Robert Kline,西彻斯特大学;Everald Mills和Kosuke Imamura,西雅图大学;Gandhi Puvvada,南加州大学;Mike Smith,哈佛大学; Steve Taylor, 乌斯特工艺大学;Bob Wood,佛罗里达州立大学。我们向上述教师和他们的学生表示衷心的感谢。

我们特别感谢加州大学戴维斯分校的Kent Wilken和普渡大学的George Adams 的认真校对。由于他们的努力使这一版更加的简洁明了。

我们要感谢摩根卡夫曼家族同意再次出版本书,这次是在Denise Penrose 的有力领导下完成的。她用极富创造力的办法来平衡我们的工作量,并用出色的主意来实现第2版的目标,使我们及时完成了计划。Julie Pabst负责整个出版过程,从β测试版到最终的第2版。Jane Elliott分析了β测试,再次进行了错误调试,为许多其他任务起草了计划。Jennifer Mann调查了第1版的读者意见以求改进,并找到了β测试者。我们还要感谢许多帮助完成本书的自由职业者,特别是我们的排版人员Nancy Logan。

我们以上提及的所有人以及许多其他参加β测试和调查的人的贡献使这个第2版成为我们所编著的最好的一本书。感谢大家!