深入理解计算机系统(修订版)(09年度畅销榜TOP50)(08年度畅销榜TOP50)
基本信息
- 作者: (美)Randal E.Bryant David O'Hallaron [作译者介绍]
- 译者: 龚奕利 雷迎春
- 丛书名: 国外经典计算机科学教材系列
- 出版社:中国电力出版社
- ISBN:7508321758
- 上架时间:2004-10-30
- 出版日期:2004 年10月
- 开本:16开
- 页码:873
- 版次:1-2
- 所属分类:
计算机 > 计算机组织与体系结构 > 综合
教材 > 征订教材 > 高等理工
教材 > 教材汇编分册 > 高等理工
本版教材征订号:0044098049-8
编辑推荐
·AMAZON五星图书,最伟大计算机科学教材之一;
·卡耐基梅隆大学计算机学院院长,IEEE和ACM双院士倾力推出;
·超过80所美国和世界一流大学计算机专业选用本书为教材。
本书被赞誉为价值超过等重量黄金的无价资源宝库;第一本将软件和硬件理论结合讲述的教程;覆盖计算机导论、体系结构和处理器设计等多门课程;经过大量学生使用,效果优秀,并获教师和学生一致推崇;完善的教学网站,为教师和学生提供在线支持。所有想写出更快、更可靠程序的开发人员必读之书!
所有想写出更快、更可靠程序的开发人员必读之书!
★AMAZON五星图书,最伟大计算机科学教材之一
★卡耐基梅隆大学计算机学院院长,IEEE和ACM双院士倾力推出
★超过80所美国和世界一流大学计算机专业选用本书为教材
看看指导教师们是如何评价这本书的:
“我坚信从程序员的角度来看计算机系统对教会学生计算机的内部结构非常有帮助。”——Kostas Daniilidis,宾夕法尼亚大学
“这本书讲述事物的方法与众不同,但是和我想要的课程进行方式类似。”——John Greiner,Rice大学
“这是一项出色的工作,是这一领域教学方法的一次革命。”——Michael Scott,罗切斯特大学
作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE双院士(Fellow),其研究成果多次获得ACM和IEEE颁发的大奖。
本书提供了大量的例子和练习及部分答案。尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。
推荐阅读
内容简介回到顶部↑
书籍
计算机书籍
[b]所有想写出更快、更可靠程序的开发人员必读之书![/b]
★amazon五星图书,最伟大计算机科学教材之一
★卡耐基梅隆大学计算机学院院长,ieee和acm双院士倾力推出
★超过80所美国和世界一流大学计算机专业选用本书为教材
[b]看看指导教师们是如何评价这本书的:[/b]
“我坚信从程序员的角度来看计算机系统对教会学生计算机的内部结构非常有帮助。”——kostas daniilidis,宾夕法尼亚大学
“这本书讲述事物的方法与众不同,但是和我想要的课程进行方式类似。”——john greiner,rice大学
“这是一项出色的工作,是这一领域教学方法的一次革命。”——michael scott,罗切斯特大学
作者[b]randal e. bryant[/b]是卡耐基梅隆大学的计算机科学系主任,acm和ieee双院士(fellow),其研究成果多次获得acm和ieee颁发的大奖。
本书提供了大量的例子和练习及部分答案。尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。
本书适合那些想要写出更快、更可靠程序的程序员阅读。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好地理解程序的行为为什么是这样的,以及效率低下是如何造成的。粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统及网络互联环境。而通过程序员的视角,读者可以深深地体会到学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助。它还有助于为进一步学习计算机体系结构、操作系统、编译器和网络互联打下基础。
本书的主要论题包括:数据表示、c程序的机器级表示、处理器结构、程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级i/o、网络编程和并发编程。书中所覆盖的内容主要讲述这些方面是如何影响应用和系统程序员的。例如,在讲述数据表示时,本书提出了用来表示数字的表示方法是有限的,它能够近似地表示整数和实数,但是这种表示方法是有限制的,程序员必须了解。在讲述高速缓存时,本书讨论了矩阵代码中的循环变量的顺序是如何影响程序的性能的。在讨论网络互联时,本书描述了并发服务器如何有效地处理来自多个客户端的请求。
本书基于intel兼容(ia32)机器,在unix或者相关的操作系统(例如linux)上执行c程序。虽然书中包括了一些帮助读者将java转化成c的提示,但还是要求读者对c或者c++有一定的了解。
·本书被赞誉为价值超过等重量共金的无价资源宝库
·第一本将软件和硬件理论结合讲述的教程
·覆盖计算机导论、体系结构和处理器设计等多门课程
·经过大量学生使用,效果优秀,并获教师和学生一致推崇
·完善的教学网站,为教师和学生提供在线支持
计算机书籍
[b]所有想写出更快、更可靠程序的开发人员必读之书![/b]
★amazon五星图书,最伟大计算机科学教材之一
★卡耐基梅隆大学计算机学院院长,ieee和acm双院士倾力推出
★超过80所美国和世界一流大学计算机专业选用本书为教材
[b]看看指导教师们是如何评价这本书的:[/b]
“我坚信从程序员的角度来看计算机系统对教会学生计算机的内部结构非常有帮助。”——kostas daniilidis,宾夕法尼亚大学
“这本书讲述事物的方法与众不同,但是和我想要的课程进行方式类似。”——john greiner,rice大学
“这是一项出色的工作,是这一领域教学方法的一次革命。”——michael scott,罗切斯特大学
作者[b]randal e. bryant[/b]是卡耐基梅隆大学的计算机科学系主任,acm和ieee双院士(fellow),其研究成果多次获得acm和ieee颁发的大奖。
本书提供了大量的例子和练习及部分答案。尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。
本书适合那些想要写出更快、更可靠程序的程序员阅读。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好地理解程序的行为为什么是这样的,以及效率低下是如何造成的。粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统及网络互联环境。而通过程序员的视角,读者可以深深地体会到学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助。它还有助于为进一步学习计算机体系结构、操作系统、编译器和网络互联打下基础。
本书的主要论题包括:数据表示、c程序的机器级表示、处理器结构、程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级i/o、网络编程和并发编程。书中所覆盖的内容主要讲述这些方面是如何影响应用和系统程序员的。例如,在讲述数据表示时,本书提出了用来表示数字的表示方法是有限的,它能够近似地表示整数和实数,但是这种表示方法是有限制的,程序员必须了解。在讲述高速缓存时,本书讨论了矩阵代码中的循环变量的顺序是如何影响程序的性能的。在讨论网络互联时,本书描述了并发服务器如何有效地处理来自多个客户端的请求。
本书基于intel兼容(ia32)机器,在unix或者相关的操作系统(例如linux)上执行c程序。虽然书中包括了一些帮助读者将java转化成c的提示,但还是要求读者对c或者c++有一定的了解。
·本书被赞誉为价值超过等重量共金的无价资源宝库
·第一本将软件和硬件理论结合讲述的教程
·覆盖计算机导论、体系结构和处理器设计等多门课程
·经过大量学生使用,效果优秀,并获教师和学生一致推崇
·完善的教学网站,为教师和学生提供在线支持
作译者回到顶部↑
本书提供作译者介绍
Randal E. Bryant 1973年获得密歇根大学(University of Michigan)学士学位,随即就读麻省理工学院(Massachusetts Institute of Technology)的研究生院,并在1981年获计算机博士学位。他在加州理工学院(California Institute of Technology)做了三年助教,从1984年至今一直是卡内基梅隆大学(Carnegie Mellon)的教师。他现在是计算机科学的主任级教授和计算机科学系的系主任。他同时还受邀于电子和计算机工程系。
他从事本科和研究生计算机系统方面课程的教学超过20年。在讲授计算.. << 查看详细
他从事本科和研究生计算机系统方面课程的教学超过20年。在讲授计算.. << 查看详细
目录回到顶部↑
出版说明
关于第二次印刷的几点说明
译 序
关于术语的翻译
在第二次印刷中一些重要术语的修订
前 言
关于作者
第1章 计算机系统漫游
1.1 信息就是位十上下文
1.2 程序被其他程序翻译成不同的格式
1.3 了解编译系统如何工作是大有益处的
1.4 处理器读并解释储存在存储器中的指令
1.5 高速缓存
1.6 形成层次结构的存储设备
1.7 操作系统管理硬件
1.8 利用网络系统和其他系统通信
1.9 下一步
1.10 小结
第1部分 程序结构和执行
第2章 信息的表示和处理
关于第二次印刷的几点说明
译 序
关于术语的翻译
在第二次印刷中一些重要术语的修订
前 言
关于作者
第1章 计算机系统漫游
1.1 信息就是位十上下文
1.2 程序被其他程序翻译成不同的格式
1.3 了解编译系统如何工作是大有益处的
1.4 处理器读并解释储存在存储器中的指令
1.5 高速缓存
1.6 形成层次结构的存储设备
1.7 操作系统管理硬件
1.8 利用网络系统和其他系统通信
1.9 下一步
1.10 小结
第1部分 程序结构和执行
第2章 信息的表示和处理
译者序回到顶部↑
作为一个程序员,我们经常被一些奇怪的程序问题所困扰。例如最近,我的一位朋友从经典的数据结构书上抄了一段关于计算有向图的函数实现代码,这个函数实现在gcc环境下的编译一点问题都没有,但只要一实际运行,就会报段错误。我看了这段代码后,立刻就意识到问题出现在哪里了——他在函数实现里分配了一个16MB的局部变量导致栈溢出。类似这样的问题,还会有许多。不过在这些问题中,让程序员有麻烦的已经不是编程语言本身的问题,而是需要程序员更好地理解计算机系统,知道程序如何在计算机上被执行。理解计算机系统,不是简单地从书市上购买一些介绍计算机系统的书,读一读而已。迄今为止,我对市面上这类书的了解是:对于大多数程序员而言它们都过于专业化,且从书的内容和语言组织上都偏重于原理的介绍,一般程序员很难有时间和精力去消化和吸收书中的内容,更无从用这些计算机系统的知识来帮助自己解决程序问题。
事实上,高级语言编程和计算机系统被编程环境如gcc划分成两张皮,尽管程序员能用高级语言驱动计算机完成指定的计算任务,可是却不一定能很清楚地知道计算机是如何解释和执行程序代码的。
我本人是一个计算机专业科班出身的人,学生期间学习到许多关于计算机系统的知识。可在实际研究工作中,过去所学的计算机系统知识变得遥远和模糊。1999年初,出于研究兴趣的目的,我设计了一个高性能网络服务器结构,并编写了它的实现。在此期间,使我明白一个高性能服务器程序与计算机系统之间的唇齿相依的关系。过去,促使我建立高级语言和计算机系统的联系来主要自于研究的压力,其采用的方法是遍寻国外关于系统编程的邮件列表,并结合以往所学的计算机系统知识。这种方法固然能帮助我解决实际所碰到的问题,但却需要花费大量的时间且没有条理。2003年元月,编辑部让我帮助他们从一批刚出版的外文书中挑一些可以在国内推广的书,我一眼就看中了这本由Bryant和O'Hallaron所著的《Computer Systems:A Programmer's Perspective》,它就是我过去想要的书,我相信也是每一个想了解计算机系统的程序员想要的书。我迫不及待地从编辑手中抢下此书的翻译工作,这个临时添加的任务改变了我和另一位译者2003年的生活。2003年8月底,终于完成此书的翻译工作,并起中文名为《深入理解计算机系统》。
《深入理解计算机系统》的最大优点是为程序员描述计算机系统的实现细节,帮助其在大脑中构造一个层次型的计算机系统,从最底层的数据在内存中的表示(如大多数程序员一直陌生或疑惑的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户态应用。贯串本书的一条主线是使程序员在设计程序时,能充分意识到计算机系统的重要性,建立起被所写程序可能被执行的数据或指令流图,明白当程序被执行时,到底发生了什么事。从而能设计出一个高效、可移植、健壮的程序,并能够更快地对程序排错、调整程序性能等。
本书是通过程序员的视角来介绍计算机系统,即首先把高级语言转换成计算机所能理解的一种中间格式(如汇编语言),然后描述计算机如何解释和执行这些中间格式的程序,是系统的哪一部分影响程序的执行效率。所以,在讲述计算机系统知识的同时,也顺便给出了关于c语言和汇编语言(有可能是编译系统产生的)的编程和阅读技巧,以及基本的系统编程技巧和工具,同时,还给出一些方法帮助程序员基于对计算机系统的理解宋度量和改善程序的性能、及其它棘手问题。
本书的主要内容是关于计算机体系结构(高级硬件设计)与编译器和操作系统的交互,包括:数据表示;汇编语言和汇编级计算机体系结构;处理器设计;程序的性能度量和优化;程序的加载器、链接器和编译器;包括I/O和设备的存储器层次结构;虚拟存储器;外部存储管理;中断、信号和进程控制。对这些不同领域知识的介绍使我们能在编写系统程序时,基于系统性能的考虑,采取一个更好的折中方案。
本书强调对计算机系统的概念的理解,但并不意味着不动手。如果按照本书的安排做每一章后面的习题,将有助于理解和加深正文所述的概念和知识,并且有时候,可以从实际动手中学习到新的知识。如果不动手,空洞地去看文字,是很难理解文字背后的意义的。我个人的经验是,有许多系统设计和概念,看似简单或不理解,可一旦自己动手做同样的试验,才更明白当初的设计者为什么要如此设计。计算机系统就像自然界的生态环境,对每一个部件的设计都要求它能融洽地和系统内其他部件和平相处,我们不能站在一个微观的视角去看待系统部件的设计是否最优,而应该从宏观来观察和思考。
为方便理解本书的内容,本书的读者假定具备C语言编程的能力。由于原书是卡内基梅隆大学(CMU)的教材,且被其他一些著名的大学也选用为教材,因此,本书的读者不仅仅是那些因为工作和兴趣而关注本书的人,还包括一些在校的大学生,作为他们的教材或辅助性资料。个人认为,在校学生越早接触本书的内容,将越有利于他们学习计算机的相关课程,培养对计算机系统的研究兴趣。
总而言之,《深入理解计算机系统》一书是一个桥梁,它帮助程序员衔接了计算机系统的各个领域的知识,为程序员构造了一个概念性框架。对于各个领域(如计算机系统结构、处理器、操作系统、编译器、网络、并发编程)的知识进一步获取,还需要参考相关书籍。
参加翻译的还有龚奕利、易金华和陈永兴等,在此也特别表示感谢。
由于此书的内容量大,加上翻译时间并不很宽裕,尽管我们十分努力,但还是难以避免出现错误,以及存在许多不尽人意的地方,欢迎广大读者批评指正,以便改进。
雷迎春
2004.2.15
于北京中关村(中科院)青年公寓
事实上,高级语言编程和计算机系统被编程环境如gcc划分成两张皮,尽管程序员能用高级语言驱动计算机完成指定的计算任务,可是却不一定能很清楚地知道计算机是如何解释和执行程序代码的。
我本人是一个计算机专业科班出身的人,学生期间学习到许多关于计算机系统的知识。可在实际研究工作中,过去所学的计算机系统知识变得遥远和模糊。1999年初,出于研究兴趣的目的,我设计了一个高性能网络服务器结构,并编写了它的实现。在此期间,使我明白一个高性能服务器程序与计算机系统之间的唇齿相依的关系。过去,促使我建立高级语言和计算机系统的联系来主要自于研究的压力,其采用的方法是遍寻国外关于系统编程的邮件列表,并结合以往所学的计算机系统知识。这种方法固然能帮助我解决实际所碰到的问题,但却需要花费大量的时间且没有条理。2003年元月,编辑部让我帮助他们从一批刚出版的外文书中挑一些可以在国内推广的书,我一眼就看中了这本由Bryant和O'Hallaron所著的《Computer Systems:A Programmer's Perspective》,它就是我过去想要的书,我相信也是每一个想了解计算机系统的程序员想要的书。我迫不及待地从编辑手中抢下此书的翻译工作,这个临时添加的任务改变了我和另一位译者2003年的生活。2003年8月底,终于完成此书的翻译工作,并起中文名为《深入理解计算机系统》。
《深入理解计算机系统》的最大优点是为程序员描述计算机系统的实现细节,帮助其在大脑中构造一个层次型的计算机系统,从最底层的数据在内存中的表示(如大多数程序员一直陌生或疑惑的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户态应用。贯串本书的一条主线是使程序员在设计程序时,能充分意识到计算机系统的重要性,建立起被所写程序可能被执行的数据或指令流图,明白当程序被执行时,到底发生了什么事。从而能设计出一个高效、可移植、健壮的程序,并能够更快地对程序排错、调整程序性能等。
本书是通过程序员的视角来介绍计算机系统,即首先把高级语言转换成计算机所能理解的一种中间格式(如汇编语言),然后描述计算机如何解释和执行这些中间格式的程序,是系统的哪一部分影响程序的执行效率。所以,在讲述计算机系统知识的同时,也顺便给出了关于c语言和汇编语言(有可能是编译系统产生的)的编程和阅读技巧,以及基本的系统编程技巧和工具,同时,还给出一些方法帮助程序员基于对计算机系统的理解宋度量和改善程序的性能、及其它棘手问题。
本书的主要内容是关于计算机体系结构(高级硬件设计)与编译器和操作系统的交互,包括:数据表示;汇编语言和汇编级计算机体系结构;处理器设计;程序的性能度量和优化;程序的加载器、链接器和编译器;包括I/O和设备的存储器层次结构;虚拟存储器;外部存储管理;中断、信号和进程控制。对这些不同领域知识的介绍使我们能在编写系统程序时,基于系统性能的考虑,采取一个更好的折中方案。
本书强调对计算机系统的概念的理解,但并不意味着不动手。如果按照本书的安排做每一章后面的习题,将有助于理解和加深正文所述的概念和知识,并且有时候,可以从实际动手中学习到新的知识。如果不动手,空洞地去看文字,是很难理解文字背后的意义的。我个人的经验是,有许多系统设计和概念,看似简单或不理解,可一旦自己动手做同样的试验,才更明白当初的设计者为什么要如此设计。计算机系统就像自然界的生态环境,对每一个部件的设计都要求它能融洽地和系统内其他部件和平相处,我们不能站在一个微观的视角去看待系统部件的设计是否最优,而应该从宏观来观察和思考。
为方便理解本书的内容,本书的读者假定具备C语言编程的能力。由于原书是卡内基梅隆大学(CMU)的教材,且被其他一些著名的大学也选用为教材,因此,本书的读者不仅仅是那些因为工作和兴趣而关注本书的人,还包括一些在校的大学生,作为他们的教材或辅助性资料。个人认为,在校学生越早接触本书的内容,将越有利于他们学习计算机的相关课程,培养对计算机系统的研究兴趣。
总而言之,《深入理解计算机系统》一书是一个桥梁,它帮助程序员衔接了计算机系统的各个领域的知识,为程序员构造了一个概念性框架。对于各个领域(如计算机系统结构、处理器、操作系统、编译器、网络、并发编程)的知识进一步获取,还需要参考相关书籍。
参加翻译的还有龚奕利、易金华和陈永兴等,在此也特别表示感谢。
由于此书的内容量大,加上翻译时间并不很宽裕,尽管我们十分努力,但还是难以避免出现错误,以及存在许多不尽人意的地方,欢迎广大读者批评指正,以便改进。
雷迎春
2004.2.15
于北京中关村(中科院)青年公寓
前言回到顶部↑
《深入理解计算机系统》(Computer Systems:A Programmer's Perspective,CS:APP)这本书的主要读者是那些想通过学习计算机系统的内在运作而提高自身技能的程序员。
我们的目的是解释所有计算机系统的本质概念,并向你展示这些概念是如何实际地影响应用程序的正确性、性能和实用性的。与其他主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。
如果你学习和研究这本书里的概念,你将步入稀缺的“权威程序员”的行列,将知道事情是如何运作的,也知道在出现故障时如何进行修复。同时,你也将做好学习其他具体系统主题的准备,比如编译器、计算机体系结构、操作系统、嵌入式系统和网络互联。
读者所应具备的背景知识
本书中的范例是基于英特尔兼容的处理器(英特尔称之为“IA32”,即俗称的“x86”)、在Unix或类Unix(比如Linux)操作系统上运行的C语言程序。(为了简化我们的描述,我们将用Unix统称Solaris和Linux这样的系统。)文中包括了大量已在Linux系统上编译和运行过的程序范例。我们假设你能访问一台这样的机器,并且能够登录,然后做一些诸如修改目录之类的简单操作。
如果你的计算机运行的是Microsoft Windows系统,你有两种选择。第一,获取一个Linux的拷贝(参见www.linux.org或者www.redhat.com),然后以“双重启动”模式安装它,这样你的机器就能运行任一个操作系统了。另一种选择就是,通过安装Cygwin工具(www.Cygwin.com),你就能在Windows下得到一个类似Unix的shell以及一个非常类似于Linux提供的环境。不过,Cygwin并不能提供所有的Linux功能。
我们还假设你对C和C++有一定的了解。如果你以前只有Java经验,那么这种转换将需要你自己付出更多的努力,不过我们也将帮助你。Java和C有相似的语法和控制语句。
但是,有一些C语言的内容,特别是指针、显式的动态存储器分配和格式化I/O,Java中都是没有的。所幸的是,C是一个较小的语言,并且在Brain Kernighan和Dennis Ritchie经典的“K&R”文字中得到了清晰优美的描述[40]。无论你的编程背景如何,K&R都应是你个人图书收藏的一部分。
这本书的前几章揭示了C语言程序和它们相应的机器语言程序之间的交互作用。机器语言示例都是用运行在Intel IA32处理器上的GNUGCC编译器生成的,我们不需要你以前有任何硬件、机器语言或是汇编语言编程的经验。
怎样阅读此书
从程序员的角度来学习计算机系统如何工作将非常有趣,主要是因为这个过程可以非常主动。无论何时你学到一些新的东西,都可以马上试验并且直接看到运行结果。事实上,我们相信学习系统的惟一方法就是做(do)系统,即在真正的系统上解决具体的问题,或是编写和运行程序。
这种主题观念贯穿全书。当引入一个新概念时,紧随其后的将是一个或多个练习题,你应该马上做一做来检验你的理解。练习题的解答在每章的末尾。当你阅读时,尝试自己来解答每个问题,然后再查阅答案,看看自己是否正确。每一章后面都有一组不同难度的家庭作业题。你的指导老师在教师手册中有这些问题的答案。对每个家庭作业题,我们标注了我们认为的难度级别:
◆只需要几分钟。几乎或完全不需要编程。
◆◆可能需要将近20分钟。通常包括编写和测试一些代码,许多都取自我们在考试中的题目。
◆◆◆需要很大的努力,也许是1—2个小时。一般包括编写和测试大量的代码。
◆◆◆◆一个实验作业,需要将近10个小时。
文中每段代码示例都是C程序,经过版本为2.95.3的GCC编译并在内核版本为2.2.16的Linux系统上测试后直接生成的,没有任何人为的改动。所有源程序代码均可从本书的主页(csapp.cs.cmu.edu)上获取。在文中,源程序的文件名列在两条水平线的右边,水平线之间是格式化代码。比如,图P.1中的程序能在code/intro目录下的hello.c文件中找到。我们鼓励你,当遇到这些示例程序时,在你的系统上试试运行它们。
最后,有些部分(用“。”标注的)包含了一些你可能会觉得有趣但可以略过而不影响阅读连贯性的东西。
本书的起源
本书起源于1998年秋季我们在卡内基梅隆(CMU)大学开设的一门编号为15-213的介绍性课程:计算机系统导论(Introduction to Computer System,ICS)[7]。从那以后,每学期都开设了ICS这门课程,每期有150名左右的学生,大多数是计算机科学和计算机工程专业二年级的学生。后来,这门课程还成为了卡内基梅隆大学计算机科学系以及电子和计算机工程系中大多数高级系统课程的先行必修课。
我们的目的是解释所有计算机系统的本质概念,并向你展示这些概念是如何实际地影响应用程序的正确性、性能和实用性的。与其他主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。
如果你学习和研究这本书里的概念,你将步入稀缺的“权威程序员”的行列,将知道事情是如何运作的,也知道在出现故障时如何进行修复。同时,你也将做好学习其他具体系统主题的准备,比如编译器、计算机体系结构、操作系统、嵌入式系统和网络互联。
读者所应具备的背景知识
本书中的范例是基于英特尔兼容的处理器(英特尔称之为“IA32”,即俗称的“x86”)、在Unix或类Unix(比如Linux)操作系统上运行的C语言程序。(为了简化我们的描述,我们将用Unix统称Solaris和Linux这样的系统。)文中包括了大量已在Linux系统上编译和运行过的程序范例。我们假设你能访问一台这样的机器,并且能够登录,然后做一些诸如修改目录之类的简单操作。
如果你的计算机运行的是Microsoft Windows系统,你有两种选择。第一,获取一个Linux的拷贝(参见www.linux.org或者www.redhat.com),然后以“双重启动”模式安装它,这样你的机器就能运行任一个操作系统了。另一种选择就是,通过安装Cygwin工具(www.Cygwin.com),你就能在Windows下得到一个类似Unix的shell以及一个非常类似于Linux提供的环境。不过,Cygwin并不能提供所有的Linux功能。
我们还假设你对C和C++有一定的了解。如果你以前只有Java经验,那么这种转换将需要你自己付出更多的努力,不过我们也将帮助你。Java和C有相似的语法和控制语句。
但是,有一些C语言的内容,特别是指针、显式的动态存储器分配和格式化I/O,Java中都是没有的。所幸的是,C是一个较小的语言,并且在Brain Kernighan和Dennis Ritchie经典的“K&R”文字中得到了清晰优美的描述[40]。无论你的编程背景如何,K&R都应是你个人图书收藏的一部分。
这本书的前几章揭示了C语言程序和它们相应的机器语言程序之间的交互作用。机器语言示例都是用运行在Intel IA32处理器上的GNUGCC编译器生成的,我们不需要你以前有任何硬件、机器语言或是汇编语言编程的经验。
怎样阅读此书
从程序员的角度来学习计算机系统如何工作将非常有趣,主要是因为这个过程可以非常主动。无论何时你学到一些新的东西,都可以马上试验并且直接看到运行结果。事实上,我们相信学习系统的惟一方法就是做(do)系统,即在真正的系统上解决具体的问题,或是编写和运行程序。
这种主题观念贯穿全书。当引入一个新概念时,紧随其后的将是一个或多个练习题,你应该马上做一做来检验你的理解。练习题的解答在每章的末尾。当你阅读时,尝试自己来解答每个问题,然后再查阅答案,看看自己是否正确。每一章后面都有一组不同难度的家庭作业题。你的指导老师在教师手册中有这些问题的答案。对每个家庭作业题,我们标注了我们认为的难度级别:
◆只需要几分钟。几乎或完全不需要编程。
◆◆可能需要将近20分钟。通常包括编写和测试一些代码,许多都取自我们在考试中的题目。
◆◆◆需要很大的努力,也许是1—2个小时。一般包括编写和测试大量的代码。
◆◆◆◆一个实验作业,需要将近10个小时。
文中每段代码示例都是C程序,经过版本为2.95.3的GCC编译并在内核版本为2.2.16的Linux系统上测试后直接生成的,没有任何人为的改动。所有源程序代码均可从本书的主页(csapp.cs.cmu.edu)上获取。在文中,源程序的文件名列在两条水平线的右边,水平线之间是格式化代码。比如,图P.1中的程序能在code/intro目录下的hello.c文件中找到。我们鼓励你,当遇到这些示例程序时,在你的系统上试试运行它们。
最后,有些部分(用“。”标注的)包含了一些你可能会觉得有趣但可以略过而不影响阅读连贯性的东西。
本书的起源
本书起源于1998年秋季我们在卡内基梅隆(CMU)大学开设的一门编号为15-213的介绍性课程:计算机系统导论(Introduction to Computer System,ICS)[7]。从那以后,每学期都开设了ICS这门课程,每期有150名左右的学生,大多数是计算机科学和计算机工程专业二年级的学生。后来,这门课程还成为了卡内基梅隆大学计算机科学系以及电子和计算机工程系中大多数高级系统课程的先行必修课。








点击看大图








加载中...

