本书系统而全面地介绍了计算机系统的设计基础、指令集系统结构、流水线和指令级并行技术、层次化存储系统与存储设备、互连网络以及多处理器系统等重要内容。对计算机系统结构的论述主要以较流行的64 位MIPS结构为基础,通过量化分析的方法进行。本书内容丰富全面,既介绍了当今计算机系统结构的最新研究成果,也引述了大量有影响的计算机系统设计开发方面的实践经验。全书编排层次合理,叙述由浅入深。各章结尾还附有大量的习题和参考文献。
本书既可以作为高等院校计算机专业高年级学生和研究生学习“计算机系统结构”、“计算机原理”等课程的教科书或参考书,也可供与计算机相关的专业人士学习参考。
第1章 计算机设计基本原理
1.1 简介
1.2 计算方向的改变和计算机设计者的任务
1.3 技术发展趋势
1.4 成本、价格及其发展趋势
1.5 评价和报告计算机的性能
1.6 计算机设计的量化准则
1.7 综合:性能和性价比
1.8 其他视角:功耗和效率的衡量
1.9 谬误和易犯的错误
1.10 结论
1.11 历史回顾和参考文献
参考文献
习题
第2章 指令集原理与实例
2.1 指令集简介
2.2 指令集系统结构的分类
2.3 内存寻址
2.4 信号处理的寻址方式
2.5 操作数的大小与类型
2.6 媒体和信号处理中的操作数
2.7 指令集的操作
2.8 媒体和信号处理中的操作
2.9 控制流指令
2.10 指令集的编码
2.11 相关问题:编译器
2.12 综合:MIPS系统结构
2.13 其他视角:Trimedia TM32处理器
2.14 谬误和易犯的错误
2.15 结论
2.16 历史回顾和参考文献
参考文献
习题
第3章 指令级并行及其动态开发
3.1 指令级并行:概念及挑战
3.2 采用动态调度克服数据冲突
3.3 动态调度:算法及举例
3.4 采用动态硬件预测技术减少分支开销
3.5 高性能指令传送机制
3.6 采用多发射获得更高的指令级并行度
3.7 基于硬件的猜测技术
3.8 指令级并行性限制研究
3.9 实际处理器中的指令级并行性限制
3.10 综合:P6微结构
3.11 其他视角:线程级并行
3.12 相关问题:使用指令级并行的数据通路开发线程级并行
3.13 谬误和易犯的错误
3.14 结论
3.15 历史回顾和参考文献
参考文献
习题
第4章 用软件方法开发指令级并行
4.1 开发指令级并行的基本编译技术
4.2 静态分支预测
4.3 静态多发射:VLIW方法
4.4 支持指令级并行的高级编译器技术
4.5 编译时开发更多并行性的硬件支持
4.6 相关问题:硬件猜测与软件猜测的比较
4.7 综合:Intel的IA-64系统结构和安腾处理器
4.8 其他视角:嵌入式和移动市场的指令级并行
4.9 缪误和易犯的错误
4.10 结论
4.11 历史回顾和参考文献
参考文献
习题
第5章 存储器层次结构设计
5.1 简介
5.2 cache基本知识回顾
5.3 cache性能
5.4 降低cache缺失代价
5.5 降低cache缺失率
5.6 通过并行降低cache缺失代价或缺失率
5.7 减少命中时间
5.8 内存和提高内存性能的组织方式
5.9 存储器技术
5.10 虚拟存储器
5.11 虚拟存储器的保护和示例
5.12 相关问题:存储器层次设计
5.13 综合:Alpha 21264存储层次结构
5.14 其他视角:Sony Playstation 2的动画引擎
5.15 其他视角:Sun Fire 6800服务器
5.16 谬误和易犯的错误
5.17 结论
5.18 历史回顾和参考文献
参考文献
习题
第6章 多处理器和线程级并行
6.1 简介
6.2 应用领域的特征
6.3 对称式共享存储器系统结构
6.4 对称式共享存储器多处理器系统的性能
6.5 分布式共享存储器系统结构
6.6 分布式共享存储多处理器系统的性能
6.7 同步
6.8 存储器一致性模型介绍
6.9 多线程:在单个处理器中开发线程级并行
6.10 相关问题
6.11 综合:Sun的Wildfire原型
6.12 其他视角:商用服务器上的多线程
6.13 其他视角:嵌入式多处理器系统
6.14 谬误和易犯的错误
6.15 结论
6.16 历史回顾和参考文献
参考文献
习题
第7章 存储系统
7.1 简介
7.2 存储设备类型
7.3 总线—连接IO设备到CPU/存储器
7.4 可靠性、有效性和稳定性
7.5 RAID:廉价/独立磁盘冗余阵列
7.6 实际系统中的差错和故障
7.7 I/O 性能评测
7.8 Little 队列理论
7.9 存储性能和有效性基准测试程序
7.10 相关问题
7.11 I/O系统设计
7.12 综合:EMC Symmetrix和Celerra
7.13 其他视角:Sanyo VPC-SX500数码相机
7.14 谬误和易犯的错误
7.15 结论
7.16 历史回顾和参考文献
参考文献
练习
第8章 互连网络与集群
8.1 简介
8.2 简单网络
8.3 互连网络介质
8.4 连接多台计算机
8.5 网络拓扑结构
8.6 商用互连网络的几个实际问题
8.7 互连网络举例
8.8 网际互连
8.9 互连网络的几个相关问题
8.10 集群
8.11 集群设计
8.12 综合:Google集群介绍
8.13 其他视角:手机内部的相关技术
8.14 谬误和易犯的错误
8.15 结论
8.16 历史回顾和参考文献
参考文献
习题
附录A 流水线基础和中级概念
附录B 部分习题答案
美国斯坦福大学计算机系Hennessy教授和加州大学伯克利分校计算机系Patterson教授是现今计算机设计领域非常受人尊敬的学者和开拓者。John Hennessy 精通软硬件两个方面,是具有传奇色彩的MIPS编译器和几代MIPS硬件产品技术上的领导者。David Patterson 是RISC的最初提倡者之一。他首创了RISC一词,定义了RISC 的含义,是Sun 公司SPARC处理器的主要顾问。他提出了RAID(独立/廉价磁盘冗余阵列)的概念,推动了为海量数据服务器提供磁盘存储解决方案的工业革命,并且还提出了NOW(工作站网络)的概念。该书是他们对计算机组织、系统结构研究和实践的全面而系统的总结。目前,世界上很多大学的计算机系统结构课程采用这本教材。国内也有大学采用这本教材的英文版。
与同类著作相比,这本书具有结构清晰完整、系统性强、内容新颖、行文深入浅出和可读性强的特点。特别值得强调的是,这本书讲授计算机组织和系统结构的量化研究方法能够使读者深入、扎实地掌握基本概念和理论,同时培养一种科学、规范而且有效的学习和科研方法乃至思想。这也是本书能在世界范围内备受推崇以及我们把它翻译成中文并极力在国内推广的主要原因。这是一本能使读者在较短时间内全面了解、熟悉和掌握当代计算机系统结构发展主流技术和最新成就的优秀教材和专业参考书。其中译本的问世必将为我国计算机科学技术教育和研究工作带来新的思路和灵感。
感谢电子工业出版社对出版中译本(第三版)的支持,感谢清华大学计算机系许多同学在翻译和校对过程中所付出的辛勤努力。由于时间仓促、译者水平有限,文中定有不当或欠妥之处,还望读者批评指正。
Bill Joy, Sun微系统公司的首席科学家兼首席执行官。
非常幸运,二十多年前我能在加州大学伯克利分校的David Patterson教授指导下学习计算机系统结构。我非常欣赏他的课程,那时正是RISC架构发展的初期。在离开伯克利后帮助创建Sun微系统公司的过程中,我有很多想法来自于他的课程教学,以及这本非常重要的书。
今天,一个好消息是,这本书的内容覆盖了许多当代非常重要的知识。未来的好消息是,仍然有无数激动人心的、富有挑战性的工作等着我们去完成。而本书无疑是一个很好的开始。
我参加过的最成功的项目都是由简单的想法开始,并采用从经验中总结来的简单数学模型来完成的。计算机技术正在迅速地发展,各种新的应用不断出现,这促使我们需要新的简单模型来理解未来可能出现的新事物,理解新的应用如何在各种不同的方面影响我们的系统。第1章介绍的定量方法是理解这些问题的重要工具。我们尤其希望在不远的将来,各种或大或小的系统都会更加强调用最小的能耗达到应用的要求。这方面还有许多工作需要去做。
在我的职业生涯中,我接触过许多不同的指令集。我开始编程的时候用的是PDP-8计算机,它的指令集非常简单,我的一个朋友甚至通过打孔纸带的数据就能理解程序。我用PDP-11的汇编器写了许多程序,包括一个VAX上的Pascal语言解释程序(本书第一版中的一个例子)。VAX的成功使得UNIX系统在早期的互联网中得到了广泛的传播。
PDP-11和VAX是非常传统的复杂指令集(CISC)结构,其相对简洁的指令集使得它几乎无法使用流水线。在多年的公开访谈中,我都把VAX 11/780的性能作为基准,它的速度广为人知,因为在很长一段时间内,该系统结构的快速实现一直没有出现。微处理器的x86以及680x0等复杂指令集出现后,VAX的性能就显得很落伍了。微处理器的价格优势使得它们渐渐取得了统治地位。这个时候,精简指令集系统结构(RISC)出现了。这种结构最早由IBM的John Cocke提出,Patterson和Hennessy为它正式命名并大力提倡,并由POWER PC, MIPS和SPARC等微处理器实现。这些实现证明采用简单的寄存器指令集能够获得高性能的流水线。一般来说,采用RISC的程序代码比较长,由此需要更高的取指令(fetch)带宽,第1章中的技术和Carver Mead的经典论断所揭示的未来CMOS技术的发展趋势告诉我们,这点代价是值得的。对当前所存在问题的思考和对未来计算的展望,使得我们更倾向于RISC系统结构,这将成为本书关注的中心。
第2章(以及相关的附录)介绍了当代以及历史上有影响的指令集结构。虽然经历了近二十年的努力,RISC结构还远不能成为系统结构的终结者。前后有十几年的时间里我参与了SPARC结构的设计及其几个版本的实现,现在我正在参与另外两种不同结构处理器的设计,它们是:picoJava,它实现了大部分的JAVA虚拟机指令,这是一种简洁的字节码高级指令;MAJC,一种简单的多线程超长指令字(VLIW,Very long instruction word)处理器,主要用于Java程序和多媒体应用。这两种结构针对不同的新市场应用,即低能耗的嵌入式设备领域和能够在一定的能耗和成本下采用并行计算获得高性能的领域。这两者现在都还没有取得广泛的商业成功。但我认为未来会有许多不同的工业标准结构(ISA)受到青睐。对历史的深入了解可以让我们深受启发,通过对过去成功设计的研究,可以发现它们是如何在几个关键因素,例如程序大小、执行速度和能耗等方面取得平衡的。这些经验将为我们今天的设计提供帮助。
第3章和第4章讲述了指令级并行(ILP),这种能力可以使计算机在同一时刻执行多条指令。在过去的二十几年中,RISC技术和超长指令字技术大大促进了这一领域的发展。但是,在Intel Itanium的结构设计中,RISC技术,特别是VLIW技术需要很高的能耗。当我们试图获得更高的指令级并行度的时候,我们遇到了设计中的难题:如果需要同时执行N条语句,那么晶体管数量和能耗的需求将以N2的态势迅速增长。另一种方法是采用简单的流水线,比较现实的指令级并行度,并混合使用其他的并行方法,例如每处理器多线程和每芯片多处理器技术。对于未来的高性能系统设计,最大的挑战就是要明白并行执行是完全可能的,但在实际中融合其他并行度低但是能耗也低也更简单的技术才是明智的做法。
在研究所的时候,我经常开玩笑地说高速缓存是计算机科学中惟一重要的思想。事实上,高速缓存技术确实极大地影响了计算机系统的设计。第5章介绍了经典的高速缓存设计和主存储器层次结构以及虚拟内存技术。现在,类似于Java的高级编程语言开始采用垃圾回收和内存越界检查技术来支持更可靠的软件设计,这样可以避免内存共享错误和缓冲区溢出等大程序中常见的错误。只有类似于Java的高级语言才支持自动存储管理,只有这样才能实现真正的软件组件。但是在现在的存储器层次结构上,要实现垃圾回收功能是非常困难的。设计这样的系统或者设计这样的语言是研究的热点,虽然我们取得了很大成功,但仍然有很长的路要走。
Java语言能够很好地支持线程级并行。这是实现简单、高效的高性能系统的关键,这种方法避免了前面所说的N2问题,但也带来了新的挑战。第6章将对这一领域进行基本的介绍。传统的做法是每一个处理器放在一块单独的芯片上,由于存储器层次结构的问题以及同步操作本身的高昂代价,在不同处理器之间保持同步非常困难。Java语言试图解决这个问题。我们的尝试是在Java语言规范(我是作者之一)中给出用Java实现内存模型的一个描述。我们清醒地看到,这个描述存在技术上的问题(可修正),我们需要对存储器层次结构进行仔细思考,以便使我们设计的语言能够更好地运行在新的系统平台上。我们把Java规范看做是未来将要完成的许多工作的第一步。
和第7章描述的一样,存储系统由原来连接在单个计算机的一个组成部分,变成了一种独立的网络资源。这让人想起了计算机图形技术的发展史,随着图形处理重要性的增加,原来由主机处理的功能被单独分割出来,成为了独立的图形处理芯片。在接下来的几年中,一切将会发生巨大的改变,大量的并行主处理器将拥有比主板之外的图形处理单元更好的性能。与此类似,存储技术将会有突破性的进展,例如分子电子学和纳米技术将会大大降低存储设备的价格并缩短访问时间。这将鼓励人们把数据备份在不同的计算节点上,而不是通过网络共享。存储技术将发生和图形技术类似的变化。
同样,存储系统也将会有非常严格的健壮性要求,不仅仅是针对硬件错误,还要考虑软件错误以及人为操作失误。这将是近几年一个非常有挑战性的课题。
第8章提供了计算机互连和网络的一个基本介绍。这方面我的模型来自于Sun公司另外一位创始人Andy Bechtolsheim,他经常说:“以太网不败!”。更为合适的表述是:给出网络互连的要求,不管以太网有什么缺点,总会有一款经过某些修改的以太网协议版本在市场上获得胜利。原因何在?很明显,以太网协议具有简单和使用广泛的特点,然而更加有说服力的原因是,采用以太网协议我们能够立即开始工作,而不需要争论对最终结果无关紧要的细节。这个经验能够适用于本书中有关计算机系统结构的一切领域。
多年以前,Dave Patterson曾经说过,对于一个新的项目,你只能获得有限的“亮点”(cleverness beans)。即你只能在设计中有限的几个方面采用很“聪明”的做法,如果想在方方面面都采用 “聪明”的做法,那么你的设计很可能达不到最终的目标,甚至无法工作或者无法完成。在二十多年的设计中我学到的一个教训就是:在设计的过程中,你必须要选择最重要的部分并且将重点放在那里。真正的智慧是知道应该放弃什么,知道什么是无法企及的是具有这种能力的关键。
同样,你必须要仔细选择你的猜想。很多年以前我参加了在夏威夷举行的一个会议,在会上,富有传奇色彩的计算机设计师Maurice Wilkes为我们做了一次演讲。他说,在他的记忆中,好的研究总是包含一些猜想,这些猜想也许在当时看来是不切实际的,但是在未来有可能实现。如果这些猜想实现了,那么你将发现你做了非常伟大的研究。例如,Xerox PARC的研究小组给出了一个猜想:人人都使用带有图形界面的个人电脑,通过互连网络连接其他人的机器,并采用便宜的Xerography技术进行打印。现在看来,他们的预言是多么的准确,他们的工作是多么的重要啊!
在我们的时代,在计算机系统结构领域中,我想将会有许多猜想变为现实。有一些甚至不会有争议,例如摩尔定律将在近十年内继续有效,也许十年之后大规模芯片设计的复杂程度将会达到它的物理极限。更毋庸置疑的是,分子技术有可能极大地降低存储和逻辑元件的价格,光学互连技术将极大地增加网络的带宽并减少传输的错误率,软件仍然会因为编写困难而不可靠,安全问题将继续成为人们关心的重点。
本书详细介绍了计算机系统结构发展的趋势。下一代的计算机设计者能够利用本书中的知识精华甄别优劣,减少缺陷,从而设计出各种样式和大小的系统。
计算机系统结构设计正变得越来越多样化,也越来越有趣。让我们立即启程探索,或者再次征服这个领域吧,而本书将是最好的起点。芯片中见!