XIX 赖于课程大纲的要求、个人喜好、学生的背景和能力。图中的课程从左往右越来越强调以 程序员的角度来看待系统。以下是简单的描述。 ·ORG:一门以非传统风格讲述传统主题的计算机组成原理课程。传统的主题包括逻辑设 计、处理器体系结构、汇编语言和存储器系统,然而这里更多地强调了对程序员的影 响。例如,要反过来考虑数据表示对C语言程序的数据类型和操作的影响。又例如,对 汇编代码的讲解是基于C语言编译器产生的机器代码,而不是手工编写的汇编代码。 ·ORG十:一门特别强调硬件对应用程序性能影响的ORG课程。和ORG课程相比, 学生要更多地学习代码优化和改进C语言程序的内存性能。 ·ICS:基本的ICS课程,旨在培养一类程序员,他们能够理解硬件、操作系统和编 译系统对应用程序的性能和正确性的影响。和ORG十课程的一个显著不同是,本 课程不涉及低层次的处理器体系结构。相反,程序员只同现代乱序处理器的高级模 型打交道。ICS课程非常适合安排到一个10周的小学期,如果期望步调更从容一 些,也可以延长到一个15周的学期。 ·ICS十:在基本的ICS课程基础上,额外论述一些系统编程的问题,比如系统级 I/O、网络编程和并发编程。这是卡内基-梅隆大学的一门一学期时长的课程,会讲 述本书中除了低级处理器体系结构以外的所有章。 ·SP:一门系统编程课程。和ICS+课程相似,但是剔除了浮点和性能优化的内容, 更加强调系统编程,包括进程控制、动态链接、系统级I/O、网络编程和并发编程。 指导教师可能会想从其他渠道对某些高级主题做些补充,比如守护进程(daemon)、 终端控制和Unix IPC(进程间通信)。 图2要表达的主要信息是本书给了学生和指导教师多种选择。如果你希望学生更多地 章号 主题 课程 ORG ORG+ ICS ICS+ SP 1 系统漫游 2 数据表示 ⊙d 3 机器语言 4 处理器体系结构 5 代码优化 6 存储器层次结构 ⊙(aj ◆ ◆ ⊙a) > 链接 ⊙c ⊙c) 8 异常控制流 9 虚拟内存 ⊙b, 10 系统级I/O 1 网络编程 并发编程 图2五类基于本书的课程 注:符号⊙表示覆盖部分章节,其中:()只有硬件:(b)无动态存储分配:(c)无动态链接:(d)无浮点数。 ICS+是卡内基-梅隆的15213课程
XX 了解低层次的处理器体系结构,那么通过ORG和ORG十课程可以达到目的。另一方面, 如果你想将当前的计算机组成原理课程转换成ICS或者ICS十课程,但是又对突然做这样 剧烈的变化感到担心,那么你可以逐步递增转向ICS课程。你可以从OGR课程开始,它 以一种非传统的方式教授传统的问题。一旦你对这些内容感到驾轻就熟了,就可以转到 ORG+,最终转到ICS。如果学生没有C语言的经验(比如他们只用Java编写过程序), 你可以花几周的时间在C语言上,然后再讲述ORG或者ICS课程的内容。 最后,我们认为ORG十和SP课程适合安排为两期(两个小学期或者两个学期)。或者 你可以考虑按照一期ICS和一期SP的方式来教授ICS+课程。 写给指导教师们:经过课堂验证的实验练习 ICS十课程在卡内基-梅隆大学得到了学生很高的评价。学生对这门课程的评价,中值 分数一般为5.0/5.0,平均分数一般为4.6/5.0。学生们说这门课非常有趣,令人兴奋, 主要就是因为相关的实验练习。这些实验练习可以从CS:APP的主页上获得。下面是本书 提供的一些实验的示例。 ·数据实验。这个实验要求学生实现简单的逻辑和算术运算函数,但是只能使用一个 非常有限的C语言子集。比如,只能用位级操作来计算一个数字的绝对值。这个实 验可帮助学生了解C语言数据类型的位级表示,以及数据操作的位级行为。 ·二进制炸弹实验。二进制炸弹是一个作为目标代码文件提供给学生的程序。运行 时,它提示用户输人6个不同的字符串。如果其中的任何一个不正确,炸弹就会 “爆炸”,打印出一条错误消息,并且在一个打分服务器上记录事件日志。学生必须 通过对程序反汇编和逆向工程来测定应该是哪6个串,从而解除各自炸弹的雷管。 该实验能教会学生理解汇编语言,并且强制他们学习怎样使用调试器。 ·缓冲区溢出实验。它要求学生通过利用一个缓冲区溢出漏洞,来修改一个二进制可 执行文件的运行时行为。这个实验可教会学生栈的原理,并让他们了解写那种易于 遭受缓冲区溢出攻击的代码的危险性。 ·体系结构实验。第4章的几个家庭作业能够组合成一个实验作业,在实验中,学生 修改处理器的HCL描述,增加新的指令,修改分支预测策略,或者增加、删除旁 路路径和寄存器端口。修改后的处理器能够被模拟,并通过运行自动化测试检测出 大多数可能的错误。这个实验使学生能够体验处理器设计中令人激动的部分,而不 需要掌握逻辑设计和硬件描述语言的完整知识。 ●性能实验。学生必须优化应用程序的核心函数(比如卷积积分或矩阵转置)的性能。这 个实验可非常清晰地表明高速缓存的特性,并带给学生低级程序优化的经验
XXI ●cache实验。这个实验类似于性能实验,学生编写一个通用高速缓存模拟器,并优 化小型矩阵转置核心函数,以最小化对模拟的高速缓存的不命中次数。我们使用 Valgrind为矩阵转置核心函数生成真实的地址访问记录。 ●shell实验。学生实现他们自己的带有作业控制的Unix shell程序,包括Ctrl+C和 Ctrl+Z按键,fg、bg和jobs命令。这是学生第一次接触并发,并且让他们对 Unix的进程控制、信号和信号处理有清晰的了解。 ●mal1oc实验。学生实现他们自己的malloc、free和realloc(可选)版本。这个 实验可让学生们清晰地理解数据的布局和组织,并且要求他们评估时间和空间效率 的各种权衡及折中。 ·代理实验。实现一个位于浏览器和万维网其他部分之间的并行Wb代理。这个实 验向学生们揭示了Web客户端和服务器这样的主题,并且把课程中的许多概念联 系起来,比如字节排序、文件I/O、进程控制、信号、信号处理、内存映射、套接 字和并发。学生很高兴能够看到他们的程序在真实的Web浏览器和Web服务器之 间起到的作用。 CS:APP的教师手册中有对实验的详细讨论,还有关于下载支持软件的说明。 第3版的致谢 很荣幸在此感谢那些帮助我们完成本书第3版的人们。 我们要感谢卡内基-梅隆大学的同事们,他们已经教授了ICS课程多年,并提供了富 有见解的反馈意见,给了我们极大的鼓励:Guy Blelloch、Roger Dannenberg、David Eck hardt、Franz Franchetti、Greg Ganger、Seth Goldstein、Khaled Harras、.Greg Kesden、 Bruce Maggs、Todd Mowry、Andreas Nowatzyk、Frank Pfenning、Markus Pueschel和 Anthony Rowe。David Winters在安装和配置参考Linux机器方面给予了我们很大的帮助 Jason Fritts(圣路易斯大学,St.Louis University)和Cindy Norris(阿帕拉契州立大 学,Appalachian State)对第2版提供了细致周密的评论。龚奕利(武汉大学,Wuhan Uni- versity)翻译了中文版,并为其维护勘误,同时还贡献了一些错误报告。Godmar Back(弗 吉尼亚理工大学,Virginia Tech)向我们介绍了异步信号安全以及与协议无关的网络编程, 帮助我们显著提升了本书质量。 非常感谢目光敏锐的读者们,他们报告了第2版中的错误:Rami Ammari、Paul An- agnostopoulos、Lucas Barenfanger、Godmar Back、Ji Bin、Sharbel Bousemaan、Richard Callahan、Seth Chaiken、Cheng Chen、Libo Chen、Tao Du、Pascal Garcia、Yili Gong
XXII Ronald Greenberg、Dorukhan Guloz、Dong Han、Dominik Helm、Ronald Jones、Musta- fa Kazdagli、Gordon Kindlmann、Sankar Krishnan、Kanak Kshetri、Junlin Lu、Qian gqiang Luo、Sebastian Luy、Lei Ma、Ashwin Nanjappa、Gregoire Paradis、Jonas Pfen- ninger、Karl Pichotta、David Ramsey、Kaustabh Roy、David Selvaraj、Sankar Shan mugam、Dominique Smulkowska、Dag Sorbo、Michael Spear、Yu Tanaka、Steven Tri- canowicz、Scott Wright、Waiki Wright、Han Xu、Zhengshan Yan、Firo Yang、Shuang Yang、John Ye、Taketo Yoshida、Yan Zhu和Michael Zink. 还要感谢对实验做出贡献的读者,他们是:Godmar Back(弗吉尼亚理工大学,Vir ginia Tech)、Taymon Beal(伍斯特理工学院,Worcester Polytechnic Institute)、Aran Clauson(西华盛顿大学,Western Washington University)、Cary Gray(威顿学院, Wheaton College)、Paul Haiduk(德州农机大学,West Texas A&M University)、Len Hamey(麦考瑞大学,Macquarie University)、Eddie Kohler(哈佛大学,Harvard)、Hugh Lauer(伍斯特理工学院,Worcester Polytechnic Institute)、Robert Marmorstein(朗沃德大 学,Longwood University).和James Riely(德保罗大学,DePaul University)。 再次感谢Windfall软件公司的Paul Anagnostopoulos在本书排版和先进的制作过程中 所做的精湛工作。非常感谢Paul和他的优秀团队:Richard Camp(文字编辑)、Jennifer McClain(校对)、Laurel Muller(美术制作)以及Ted Laux(索引制作)。Paul甚至找出了我 们对缩写BSS的起源描述中的一个错误,这个错误从第1版起一直没有被发现! 最后,我们要感谢Prentice Hall出版社的朋友们。Marcia Horton和我们的编辑Matt Goldstein一直坚定不移地给予我们支持和鼓励,非常感谢他们。 第2版的致谢 我们深深地感谢那些帮助我们写出CS:APP第2版的人们。 首先,我们要感谢在卡内基-梅隆大学教授ICS课程的同事们,感谢你们见解深刻的 反馈意见和鼓励:Guy Blelloch、Roger Dannenberg、David Eckhardt、Greg Ganger、 Seth Goldstein、Greg Kesden、Bruce Maggs、Todd Mowry、Andreas Nowatzyk、Frank Pfenning Markus Pueschel. 还要感谢报告第1版勘误的目光敏锐的读者们:Daniel Amelang、Rui Baptista、Quarup Barreirinhas、Michael Bombyk、Jorg Brauer、Jordan Brough、Yixin Cao、James Caroll、.Rui Car- valho、Hyoung-Kee Choi、Al Davis、Grant Davis.、Christian Dufour、Mao Fan、Tim Freeman、 Inge Frick、Max Gebhardt、Jeff Goldblat、Thomas Gross、Anita Gupta、John Hampton、Hiep
XXIII Hong、Greg Israelsen、Ronald Jones、Haudy Kazemi、Brian Kell、Constantine Kousoulis、Sacha Krakowiak、.Arun Krishnaswamy、Martin Kulas、Michael Li、Zeyang Li、.Ricky Liu、Mario Lo Conte、Dirk Maas、Devon Macey、.Carl Marcinik、Will Marrero、Simone Martins、Tao Men、 Mark Morrissey、Venkata Naidu、Bhas Nalabothula、Thomas Niemann、Eric Peskin、David Po、 Anne Rogers、John Ross、Michael Scott、.Seiki、Ray Shih、Darren Shultz、Erik Silkensen、Sury anto、Emil Tarazi、Nawanan Theera-Ampornpunt、.Joe Trdinich、Michael Trigoboff、James Troup、Martin Vopatek、Alan West、Betsy Wolff、Tim Wong、James Woodruff、Scott Wright、. Jackie Xiao、Guanpeng Xu、Qing Xu、Caren Yang、Yin Yongsheng、Wang Yuanxuan、Steven Zhang和Day Zhong。特别感谢Inge Frick,他发现了我们加锁复制(lock-and-copy)例子中一个极 不明显但很深刻的错误,还要特别感谢Ricky Liu,他的校对水平真的很高。 我们Intel实验室的同事Andrew Chien和Limor Fix在本书的写作过程中一直非常支 持。非常感谢Steve Schlosser提供了一些关于磁盘驱动器的总结描述,Casey Helfrich和 Michael Ryan安装并维护了新的Core i7机器。Michael Kozuch、Babu Pillai和Jason Campbell对存储器系统性能、多核系统和能量墙问题提出了很有价值的见解。Phil Gib bons和Shimin Chen跟我们分享了大量关于固态硬盘设计的专业知识。 我们还有机会邀请了Wen-Mei Hwu、Markus Pueschel和Jiri Simsa这样的高人给予 了一些针对具体问题的意见和高层次的建议。James Hoe帮助我们写了Y86处理器的 Verilog描述,还完成了所有将设计合成到可运行的硬件上的工作。 非常感谢审阅本书草稿的同事们:James Archibald(百翰杨大学,Brigham Young Univer- sity)、Richard Carver(乔治梅森大学,George Mason University)、Mirela Damian(维拉诺瓦大 学,Villanova University)、Peter Dinda(西北大学)、John Fiore(坦普尔大学,Temple Univer- sity)、Jason Fritts(圣路易斯大学,St.Louis University)、John Greiner(莱斯大学)、Brian Har- vey(加州大学伯克利分校)、Don Heller(宾夕法利亚州立大学)、Wei Chung Hsu(明尼苏达大 学)、Michelle Hugue(马里兰大学)、Jeremy Johnson(德雷克塞尔大学,Drexel University)、 Geoff Kuenning(哈维马德学院,Harvey Mudd College)、Ricky Liu、Sam Madden(麻省理工学 院)、Fred Martin(马萨诸塞大学洛厄尔分校,University of Massachusetts,Lowell)、Abraham Matta(波士顿大学)、Markus Pueschel(卡内基-梅隆大学)、Norman Ramsey(塔夫茨大学, Tufts University))、Glenn Reinmann(加州大学洛杉矶分校)、Michela Taufer(特拉华大学, University of Delaware)和Craig Zilles(伊利诺伊大学香槟分校)。 Windfall软件公司的Paul Anagnostopoulos出色地完成了本书的排版,并领导了制作 团队。非常感谢Paul和他超棒的团队:Rick Camp(文字编辑)、Joe Snowden(排版)