深入理解计算机系统(原书第2版)(Amazon五星图书,被誉为“价值超过等重量黄金的无价资源宝库”)
基本信息
- 作者: (美)Randal E.Bryant David O'Hallaron [作译者介绍]
- 译者: 龚奕利 雷迎春
- 丛书名: 计算机科学丛书
- 出版社:机械工业出版社
- ISBN:9787111321330
- 上架时间:2010-11-3
- 出版日期:2010 年11月
- 开本:16开
- 页码:702
- 版次:2-1
- 所属分类:
计算机 > 计算机组织与体系结构 > 综合
编辑推荐
被誉为“价值超过等重量黄金的无价资源宝库”
Amazon五星图书,最伟大的计算机科学教材之一
卡耐基梅隆大学计算机学院院长、IEEE、ACM和美国工程院院士倾力奉献
超过120所美国和世界一流大学计算机专业选用本书为教材
第2版相对第1版改动在30%左右,具体改动详见前言。
点击此处查看勘误
推荐阅读
内容简介回到顶部↑
作译者回到顶部↑
本书提供作译者介绍
Randal E. Bryant 1973年于密歇根大学(University of Michigan)获得学士学位,随即就读于麻省理工学院(Massachusetts Institute of Technology)的研究生院,并在1981年获计算机博士学位。他在加州理工学院(California Institute of Technology)做了三年助教,从1984年至今一直是卡内基梅隆大学(Carnegie Mellon)的教师。他现在是计算机科学的大学教授(university professor)和计算机科学学院的院长。他同时还受邀于电子和计算机工程系。
.. << 查看详细
.. << 查看详细
目录回到顶部↑
第1章 计算机系统漫游
第一部分 程序结构和执行
第2章 信息的表示和处理
第3章 程序的机器级表示
第4章 处理器体系结构
第5章 优化程序性能
第6章 存储器层次结构
第二部分 在系统上运行程序
第7章 链接
第8章 异常控制流
第9章 虚拟存储器
第三部分 程序间的交互和通信
第10章 系统级i/o
第11章 网络编程
第12章 并发编程
附录a 错误处理
参考文献
第一部分 程序结构和执行
第2章 信息的表示和处理
第3章 程序的机器级表示
第4章 处理器体系结构
第5章 优化程序性能
第6章 存储器层次结构
第二部分 在系统上运行程序
第7章 链接
第8章 异常控制流
第9章 虚拟存储器
第三部分 程序间的交互和通信
第10章 系统级i/o
第11章 网络编程
第12章 并发编程
附录a 错误处理
参考文献
译者序回到顶部↑
本书通过程序员的视角来介绍计算机系统,首先把高级语言转换成计算机所能理解的一种中间格式(如汇编语言),然后描述计算机如何解释和执行这些中间格式的程序,系统的哪一部分影响程序的执行效率。在讲述计算机系统知识的同时,也给出了关于C语言和汇编语言的编程、阅读技巧以及基本的系统编程工具,还给出一些方法帮助程序员基于对计算机系统的理解来改善程序的性能等问题。本书强调对计算机系统概念的理解,但并不意味着不动手。如果按照本书的安排做每一章后面的习题,将有助于加深对正文所述概念和知识的理解,更可以从实际动手中学习到新的知识。
本书的主要内容是关于计算机体系结构与编译器和操作系统的交互,包括:数据表示,汇编语言和汇编级计算机体系结构,处理器设计,程序的性能度量和优化,程序的加载器、链接器和编译器,I/O和设备的存储器层次结构,虚拟存储器,外部存储管理,中断、信号和进程控制。
本书的最大优点是为程序员描述计算机系统的实现细节,帮助其在大脑中构造一个层次型的计算机系统,从最底层的数据在内存中的表示(如大多数程序员一直陌生或疑惑的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户态应用。贯串本书的一条主线是使程序员在设计程序时,能充分意识到计算机系统的重要性,建立起所写程序可能被执行的数据或指令流图,明白执行程序时到底发生了什么事,从而能设计出高效、可移植、健壮的程序,并能够更快地对程序排错、改进程序性能等。
原书是卡内基-梅隆大学(CMU)的教材,现在很多国内外著名的大学也选用其作为教材或辅助性资料,因此,本书的读者不仅仅是那些因为工作和兴趣而关注本书的人,还包括一些在校的大学生。我们认为,在校学生越早接触本书的内容,将越有利于他们学习计算机的相关课程,培养对计算机系统的研究兴趣。
总的来说,本书是一座桥梁,它帮助程序员衔接了计算机系统各个领域的知识,为程序员构造了一个概念性框架。要想获取更多关于计算机系统结构、操作系统、编译器、网络、并发编程方面的知识,还需要进一步阅读相关书籍。
本书第2版距第1版出版已有7年时间了。由于计算机技术的飞速发展,第2版相对于第1版做了大量的修改。首先,针对硬件技术和编译器技术的变化,第2版对系统的介绍,特别是实际使用部分,做了增加和修改。例如,既保持了原有的针对32位系统的说明,又增加了对64位系统的描述。其次,第2版增加了很多关于由算术运算溢出以及缓冲区溢出造成安全漏洞的内容。第三,更详细地讲述了处理器对异常的发现和处理,这是计算机系统中的一个重点和难点。第四,对存储器的描述改为了基于Intel Core i7处理器的存储器层次结构,还增加了固态硬盘的内容。第五,强调了并发性,并发性既体现在处理器的实现中,也体现在应用程序编程中。
这次我们不仅对第2版较第1版有改动之处做了仔细的翻译,而且对第1版的译稿做了重新审视和校正,更加精益求精。比如,在保证原意正确的情况下,对一些句式做了变动,尽量减少被动语态的使用等,以符合中国人的阅读习惯。再如,根据我们这几年教授“计算机体系结构”课程的经验,改变了某些术语的翻译,使之更接近于中文教科书中的术语使用。
本书中有些术语的翻译还是让我们难以抉择。在此,我们预先做一些解释和说明。operator这个词,如果根据上下文,它表示的是一个运算,我们就翻译成运算符;如果它对应于一个操作,我们就翻译成操作符。local variable,可以翻译成局部变量,也可以翻译成本地变量。考虑到还有local data、local buffer等词,我们选择统一将local翻译成“局部的”。chunk这个词是一片或者一块的意思,常常用来表示一块连续的内存区域。它在第6章、第7章和第9章中出现较多,为了使之区别于block(块),我们选择将其翻译成“片”。
本书主要由龚奕利和雷迎春负责翻译完成。此外,刘晓文、李晓玲、邱文卓和张育也参与了翻译和校对工作。在此,还要感谢王文杰,他经常和我们一起讨论翻译中遇到的问题。
由于本书内容较多,翻译时间紧迫,尽管我们尽量做到认真仔细,但还是难以避免出现错误和不尽如人意的地方。在此欢迎广大读者批评指正,我们也会把勘误表及时在网上更新,便于大家阅读。
龚奕利雷迎春
2010年9月于珞珈山
本书的主要内容是关于计算机体系结构与编译器和操作系统的交互,包括:数据表示,汇编语言和汇编级计算机体系结构,处理器设计,程序的性能度量和优化,程序的加载器、链接器和编译器,I/O和设备的存储器层次结构,虚拟存储器,外部存储管理,中断、信号和进程控制。
本书的最大优点是为程序员描述计算机系统的实现细节,帮助其在大脑中构造一个层次型的计算机系统,从最底层的数据在内存中的表示(如大多数程序员一直陌生或疑惑的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户态应用。贯串本书的一条主线是使程序员在设计程序时,能充分意识到计算机系统的重要性,建立起所写程序可能被执行的数据或指令流图,明白执行程序时到底发生了什么事,从而能设计出高效、可移植、健壮的程序,并能够更快地对程序排错、改进程序性能等。
原书是卡内基-梅隆大学(CMU)的教材,现在很多国内外著名的大学也选用其作为教材或辅助性资料,因此,本书的读者不仅仅是那些因为工作和兴趣而关注本书的人,还包括一些在校的大学生。我们认为,在校学生越早接触本书的内容,将越有利于他们学习计算机的相关课程,培养对计算机系统的研究兴趣。
总的来说,本书是一座桥梁,它帮助程序员衔接了计算机系统各个领域的知识,为程序员构造了一个概念性框架。要想获取更多关于计算机系统结构、操作系统、编译器、网络、并发编程方面的知识,还需要进一步阅读相关书籍。
本书第2版距第1版出版已有7年时间了。由于计算机技术的飞速发展,第2版相对于第1版做了大量的修改。首先,针对硬件技术和编译器技术的变化,第2版对系统的介绍,特别是实际使用部分,做了增加和修改。例如,既保持了原有的针对32位系统的说明,又增加了对64位系统的描述。其次,第2版增加了很多关于由算术运算溢出以及缓冲区溢出造成安全漏洞的内容。第三,更详细地讲述了处理器对异常的发现和处理,这是计算机系统中的一个重点和难点。第四,对存储器的描述改为了基于Intel Core i7处理器的存储器层次结构,还增加了固态硬盘的内容。第五,强调了并发性,并发性既体现在处理器的实现中,也体现在应用程序编程中。
这次我们不仅对第2版较第1版有改动之处做了仔细的翻译,而且对第1版的译稿做了重新审视和校正,更加精益求精。比如,在保证原意正确的情况下,对一些句式做了变动,尽量减少被动语态的使用等,以符合中国人的阅读习惯。再如,根据我们这几年教授“计算机体系结构”课程的经验,改变了某些术语的翻译,使之更接近于中文教科书中的术语使用。
本书中有些术语的翻译还是让我们难以抉择。在此,我们预先做一些解释和说明。operator这个词,如果根据上下文,它表示的是一个运算,我们就翻译成运算符;如果它对应于一个操作,我们就翻译成操作符。local variable,可以翻译成局部变量,也可以翻译成本地变量。考虑到还有local data、local buffer等词,我们选择统一将local翻译成“局部的”。chunk这个词是一片或者一块的意思,常常用来表示一块连续的内存区域。它在第6章、第7章和第9章中出现较多,为了使之区别于block(块),我们选择将其翻译成“片”。
本书主要由龚奕利和雷迎春负责翻译完成。此外,刘晓文、李晓玲、邱文卓和张育也参与了翻译和校对工作。在此,还要感谢王文杰,他经常和我们一起讨论翻译中遇到的问题。
由于本书内容较多,翻译时间紧迫,尽管我们尽量做到认真仔细,但还是难以避免出现错误和不尽如人意的地方。在此欢迎广大读者批评指正,我们也会把勘误表及时在网上更新,便于大家阅读。
龚奕利雷迎春
2010年9月于珞珈山
前言回到顶部↑
《深入理解计算机系统》(Computer Systems: A Programmer’s Perspective,CS: APP)这本书的主要读者是计算机科学家、计算机工程师,以及那些想通过学习计算机系统的内在运作而能够写出更好程序的人。
我们的目的是解释所有计算机系统的本质概念,并向你展示这些概念是如何实实在在地影响应用程序的正确性、性能和实用性的。其他的系统书都是从建造者的角度来写的,讲述如何实现硬件或是系统软件,包括操作系统、编译器和网络接口。而本书是从程序员的角度来写的,讲述应用程序员如何能够利用系统知识来写出更好的程序。当然,学习一个计算机系统应该做些什么是学习如何构建一个计算机系统的很好的出发点,所以,对于希望继续学习系统软硬件实现的人来说,本书也是一本很有价值的介绍性读物。
如果你研究和领会了这本书里的概念,你将开始你的成为极少数的“牛人”之路,这些“牛人”知道事情是如何运作的,也知道当事情出现故障时如何修复他。我们的目标是以一种你会立刻发现很有用的方式来呈现这些基本概念。同时,你也要做好更深入探究的准备,研究像编译器、计算机体系结构、操作系统、嵌入式系统和网络互联这样的题目。
读者所应具备的背景知识
本书中的机器代码表示是基于英特尔及其竞争者支持的两种相关联的格式,俗称 “x86”。对于很多系统来说,IA32机器代码已经成为一种事实上的标准。x86-64是IA32的一种扩展,它允许程序操作更多的数据,引用更广范围的内存地址。由于x86-64系统可以运行IA32的代码,因而在可预见的未来,这两种格式的机器代码都会得到广泛的应用。我们考虑的是这些机器如何在Unix或类Unix(比如Linux)操作系统上运行C语言程序。(为了简化表述,我们用术语Unix来统称所有继承自Unix的系统,包括Solaris、MacOS和Linux在内。)文中包含有大量已在Linux系统上编译和运行过的程序范例。我们假设你能访问一台这样的机器,并且能够登录,能够做一些诸如切换目录之类的简单操作。
如果你的计算机运行的是Microsoft Windows系统,你有两种选择。第一种选择是,获取一个Linux的拷贝(参见www.ubuntu.com),然后安装Linux作为“双重启动”的一个选项,这样你的机器就能运行其中任意一个操作系统了。另一种选择就是,通过安装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”文字中得到了清晰优美的描述[58]。无论你的编程背景如何,都应该考虑将K&R作为你个人系统书籍收藏的一部分。
这本书的前几章揭示了C语言程序和它们相对应的机器语言程序之间的交互作用。机器语言示例都是用运行在IA32和x86-64处理器上的GNU GCC编译器生成的。我们不需要你以前有任何硬件、机器语言或是汇编语言编程的经验。
C语言初学者?关于C编程语言的建议
为了帮助C语言编程背景薄弱(或全无背景)的读者,我们在书中加入了这样一些专门的注释来突出C中一些特别重要的特性。我们假设你熟悉C++或Java。
如何阅读此书
从程序员的角度来学习计算机系统是如何工作的会非常有趣,主要是因为你可以主动地来做这件事情。无论何时你学到一些新的东西,都可以马上试验并且直接看到运行结果。事实上,我们相信学习系统的惟一方法就是做(do)系统,即在真正的系统上解决具体的问题,或是编写和运行程序。
这个主题观念贯穿全书。当引入一个新概念时,将会有一个或多个练习题紧随其后,你应该马上做一做来检验你的理解。这些练习题的解答在每章的末尾。当你阅读时,尝试自己来解答每个问题,然后再查阅答案,看看自己是否正确。每一章后面都有一组难度不同的家庭作业题。你的指导老师在教师手册中有这些问题的答案。对每个家庭作业题,我们标注了我们认为的难度级别:
只需要几分钟。几乎或完全不需要编程。
可能需要将近20分钟。通常包括编写和测试一些代码,许多都源自我们在考试中出的题目。
需要很大的努力,也许是1~2个小时。一般包括编写和测试大量的代码。
一个实验作业,需要将近10个小时。
文中每段代码示例都是经过GCC编译并在Linux系统上测试后直接生成的,没有任何人为的改动。当然,你的系统上GCC的版本可能不同,或者根本就是另外一种编译器,那么你的编译器可能生成不一样的机器代码,但是整体行为表现应该是一样的。所有的源程序代码都可以从CS:APP的主页(csapp.cs.cmu.edu)上获取。在本文中,源程序的文件名列在两条水平线的右边,水平线之间是格式化的代码。比如,图1中的程序能在code/intro目录下的hello.c文件中找到。我们鼓励你,当遇到这些示例程序时,在你的系统上试试运行它们。
图1 一个典型的代码示例
为了避免使本书体积过大,内容过多,我们创建了许多网络旁注(Web asides),包括一些对本书主要内容的补充资料。本书中用CHAP:TOP这样形式的标记来引用这些旁注,这里CHAP是该章主题的一个缩写编码,而TOP是涉及的话题的缩写代码。例如,网络旁注DATA:BOOL包含有对第二章中数据表示里面有关布尔代数的内容的补充资料;而网络旁注ARCH:VLOG包含的是用Verilog硬件描述语言来做处理器设计的资料,是对第四章中处理器设计部分的补充。所有的网络旁注都可以从CS:APP的主页上获取。
我们的目的是解释所有计算机系统的本质概念,并向你展示这些概念是如何实实在在地影响应用程序的正确性、性能和实用性的。其他的系统书都是从建造者的角度来写的,讲述如何实现硬件或是系统软件,包括操作系统、编译器和网络接口。而本书是从程序员的角度来写的,讲述应用程序员如何能够利用系统知识来写出更好的程序。当然,学习一个计算机系统应该做些什么是学习如何构建一个计算机系统的很好的出发点,所以,对于希望继续学习系统软硬件实现的人来说,本书也是一本很有价值的介绍性读物。
如果你研究和领会了这本书里的概念,你将开始你的成为极少数的“牛人”之路,这些“牛人”知道事情是如何运作的,也知道当事情出现故障时如何修复他。我们的目标是以一种你会立刻发现很有用的方式来呈现这些基本概念。同时,你也要做好更深入探究的准备,研究像编译器、计算机体系结构、操作系统、嵌入式系统和网络互联这样的题目。
读者所应具备的背景知识
本书中的机器代码表示是基于英特尔及其竞争者支持的两种相关联的格式,俗称 “x86”。对于很多系统来说,IA32机器代码已经成为一种事实上的标准。x86-64是IA32的一种扩展,它允许程序操作更多的数据,引用更广范围的内存地址。由于x86-64系统可以运行IA32的代码,因而在可预见的未来,这两种格式的机器代码都会得到广泛的应用。我们考虑的是这些机器如何在Unix或类Unix(比如Linux)操作系统上运行C语言程序。(为了简化表述,我们用术语Unix来统称所有继承自Unix的系统,包括Solaris、MacOS和Linux在内。)文中包含有大量已在Linux系统上编译和运行过的程序范例。我们假设你能访问一台这样的机器,并且能够登录,能够做一些诸如切换目录之类的简单操作。
如果你的计算机运行的是Microsoft Windows系统,你有两种选择。第一种选择是,获取一个Linux的拷贝(参见www.ubuntu.com),然后安装Linux作为“双重启动”的一个选项,这样你的机器就能运行其中任意一个操作系统了。另一种选择就是,通过安装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”文字中得到了清晰优美的描述[58]。无论你的编程背景如何,都应该考虑将K&R作为你个人系统书籍收藏的一部分。
这本书的前几章揭示了C语言程序和它们相对应的机器语言程序之间的交互作用。机器语言示例都是用运行在IA32和x86-64处理器上的GNU GCC编译器生成的。我们不需要你以前有任何硬件、机器语言或是汇编语言编程的经验。
C语言初学者?关于C编程语言的建议
为了帮助C语言编程背景薄弱(或全无背景)的读者,我们在书中加入了这样一些专门的注释来突出C中一些特别重要的特性。我们假设你熟悉C++或Java。
如何阅读此书
从程序员的角度来学习计算机系统是如何工作的会非常有趣,主要是因为你可以主动地来做这件事情。无论何时你学到一些新的东西,都可以马上试验并且直接看到运行结果。事实上,我们相信学习系统的惟一方法就是做(do)系统,即在真正的系统上解决具体的问题,或是编写和运行程序。
这个主题观念贯穿全书。当引入一个新概念时,将会有一个或多个练习题紧随其后,你应该马上做一做来检验你的理解。这些练习题的解答在每章的末尾。当你阅读时,尝试自己来解答每个问题,然后再查阅答案,看看自己是否正确。每一章后面都有一组难度不同的家庭作业题。你的指导老师在教师手册中有这些问题的答案。对每个家庭作业题,我们标注了我们认为的难度级别:
只需要几分钟。几乎或完全不需要编程。
可能需要将近20分钟。通常包括编写和测试一些代码,许多都源自我们在考试中出的题目。
需要很大的努力,也许是1~2个小时。一般包括编写和测试大量的代码。
一个实验作业,需要将近10个小时。
文中每段代码示例都是经过GCC编译并在Linux系统上测试后直接生成的,没有任何人为的改动。当然,你的系统上GCC的版本可能不同,或者根本就是另外一种编译器,那么你的编译器可能生成不一样的机器代码,但是整体行为表现应该是一样的。所有的源程序代码都可以从CS:APP的主页(csapp.cs.cmu.edu)上获取。在本文中,源程序的文件名列在两条水平线的右边,水平线之间是格式化的代码。比如,图1中的程序能在code/intro目录下的hello.c文件中找到。我们鼓励你,当遇到这些示例程序时,在你的系统上试试运行它们。
图1 一个典型的代码示例
为了避免使本书体积过大,内容过多,我们创建了许多网络旁注(Web asides),包括一些对本书主要内容的补充资料。本书中用CHAP:TOP这样形式的标记来引用这些旁注,这里CHAP是该章主题的一个缩写编码,而TOP是涉及的话题的缩写代码。例如,网络旁注DATA:BOOL包含有对第二章中数据表示里面有关布尔代数的内容的补充资料;而网络旁注ARCH:VLOG包含的是用Verilog硬件描述语言来做处理器设计的资料,是对第四章中处理器设计部分的补充。所有的网络旁注都可以从CS:APP的主页上获取。
媒体评论回到顶部↑
“2005年,我开始采用Bryant和O’Hallaron的这本书作为本科生计算机系统课程的教材。现今,这本书仍然是我的计算机系统课程教科书的首选。”
——Mirela Damian,维拉诺瓦大学
“本书表述清晰、恰到好处——举重若轻地呈现了那些非常复杂的内容。”
——Ibrahim Matta,波士顿大学
“这是一本学习计算机硬件和软件如何‘真正’协同工作的好书,还教会你为什么了解这些知识会使你成为一个更有价值的程序员。本书还帮你为学习像操作系统和编译器这样的高级课程做好准备。在本书中,我最喜欢的章节是关于缓存的,当我第一次发现缓存有多重要时,真是难以置信!”
——Vishal Shah,Ask.com总架构师
——Mirela Damian,维拉诺瓦大学
“本书表述清晰、恰到好处——举重若轻地呈现了那些非常复杂的内容。”
——Ibrahim Matta,波士顿大学
“这是一本学习计算机硬件和软件如何‘真正’协同工作的好书,还教会你为什么了解这些知识会使你成为一个更有价值的程序员。本书还帮你为学习像操作系统和编译器这样的高级课程做好准备。在本书中,我最喜欢的章节是关于缓存的,当我第一次发现缓存有多重要时,真是难以置信!”
——Vishal Shah,Ask.com总架构师
【插图】








点击看大图








加载中...

