推荐一本五星好书:深入理解计算机系统(修订版)

来源:互联网 发布:js input file 赋值 编辑:程序博客网 时间:2024/04/30 12:01

 深入理解计算机系统(修订版)        

【原书名】 Computer Systems A Programmer's Perspective
【原出版社】 Pearson 
【作者】 (美)Randal E.Bryant; David O'Hallaron 
【译者】 龚奕利 雷迎春 
【丛书名】 国外经典计算机科学教材系列 
【出版社】 中国电力出版社 
http://www.china-pub.com/computers/common/info.asp?id=18133
http://www.china-pub.com/computers/common/info.asp?id=18384 [英文版]

【参考资料】
Web网站:实验和作业,授课笔记和代码示例
csapp.cs.cmu.edu

Manuscript
http://csapp.cs.cmu.edu/public/manuscript.html

本书2003年版的勘误
http://csapp.cs.cmu.edu/public/errata.html

中文版勘误:
http://vega.ict.ac.cn/personal/lyc/CSAPP_errata.htm
leiyc@ict.ac.cn

本书相关资料
http://csapp.cs.cmu.edu/
有一些内容需要是经过认证的教师才可以
http://csapp.cs.cmu.edu/public/loginrequest.html

http://mprc.pku.edu.cn/~quning/ComputerSystems.pdf

第4章的SEQ,SEQ+,PIPE模拟器下载
在学生站点:http://csapp.cs.cmu.edu/public/students.html
具体的压缩包的链接为:
源代码:http://csapp.cs.cmu.edu/public/sim.tar
二进制文件:http://csapp.cs.cmu.edu/public/y86binaries/y86-linux.tar
使用说明:http://csapp.cs.cmu.edu/public/simguide.pdf

本书10个实验的资料和源代码下载(2003年后课程不提供实验源代码下载了)
15-213: Introduction to Computer Systems
http://www-2.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15213-f02/
15-349: Introduction to Processor Design
http://www-2.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15349-s02/


【评论】

“我坚信从程序员的角度来看计算机系统对教会学生们计算机的内部结构非常有帮助。” ——Kostas Daniilidis,宾夕法尼亚大学
“这本书讲述事物的方法与众不同,但是和我想要的课程进行方式类似。” ——John Greiner,Rice大学
“这是一项出色的工作,是这一领域教学方法的一次革命。” ——Michael Scott,罗切斯特大学

程序员的视角
本书适合那些想要写出更快、更可靠程序的程序员阅读。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好地理解程序的行为为什么是这

样的,以及效率低下是如何造成的。粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统及网络互联环境。而通过程序员的视角,读者可以深深地

体会到学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助。它还有助于为进一步学习计算机体系结构、操作系统

、编译器和网络互联打下基础。
本书的主要论题包括:数据表示、C程序的机器级表示、处理器结构、程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级I/O、

网络编程和并发编程。书中所覆盖的内容主要讲述这些方面是如何影响应用和系统程序员的。例如,在讲述数据表示时,本书提出了用来表示数字的表示方法是有

限的,它能够近似地表示整数和实数,但是这种表示方法是有限制的,程序员必须了解。在讲述高速缓存时,本书讨论了矩阵代码中的循环变量的顺序是如何影响

程序的性能的。在讨论网络互联时,本书描述了并发服务器如何有效地处理来自多个客户端的请求。
?本书被赞誉为价值超过等重量共金的无价资源宝库
?第一本将软件和硬件理论结合讲述的教程
?覆盖计算机导论、体系结构和处理器设计等多门课程

这本书的最大的特色在于它将体系结构,编译,OS结合起来讲,使人产生对系统的俯瞰的感觉,对于那些想深入理解计算机内部工作机理的人,这几乎是最佳的一

本书。

深入理解计算机》是一个桥梁,它帮我们找到一种途径使上层应用和底层的硬件实现保持一种联系。当你真的很理解《深入理解计算机系统》中的内容的时候,自

然也就想看更深的内容(也就是说,你该买pattern的书了)。

Randal E. Bryant,是计算机届的一位老前辈,他主写的《深入理解计算机系统》是他深厚的计算机技术沉淀后的精华,概念浅显易懂。希望在40岁以前还能碰

到这样一本能让我心动的书。呵呵,40岁以后,自己就要开始学习沉淀了。我个人觉得,书的作用可以帮你迅速熟悉一个领域,帮你去了解这个领域的概念。如果

你能通过一本书,去区分混淆的概念,就非常好。要想深入下去,Paper和Maillist是必不可少的。我是很喜欢读Maillist,那些作者都是一线工作的战士,他

们讨论的问题是书和Paper上没有涉及到的,有时候是会颠覆我们的固有看法。98年、99年和00年,我就是通过读maillist熟悉Linux kernel的。呵呵,现在

市面上有大量的关于Linux kernel的书,但书上大都告诉你的是“它就是这样设计的”,而不会去讨论“它为什么这样设计”。你发现这个现象了吗?所以,即使我

们看完一本Linux Kernel的书,也只是知道一些东西,而很少获得它存在的理由,和别的一些实现选择。
我想说的是在mailinglist中可以找到许多书本中没有的threads,这些threads可能不是很严谨,但确实能告诉我们他们为什么这样设计,他们做了那些考虑,

我觉得这很重要。

尤其是第4章和5章的知识,不可能让初学者弄懂  这本书难度系数很高,并不是向书上说的只要会点C就可以了的
”深入理解“  应该还是恰如其分的。  比如 降到程序链接那块, 很多书里面都讲的不深或干脆不讲。 强烈推荐。

------------------------
(个人观点,仅供参考)
一、总体:
  1.1 本书特色在于很多内容从硬件角度说明,但不适合初学者;
  1.2 硬件方面的内容并不详细,最好结合微机原理一起理解;
  1.3 偏软的内容深度显然不足,抄的内容更多,如第3章、第8章、第11-13章,可能这方面比较固定,作者心得也不多,有用内容很少,建议不用看,非看的话

就去看专门介绍的书;
  1.4 整书想把硬件原理、编译原理、操作系统、流行软件编程都揉到一起,大而不太精,而且基础性章节讲得不清,如第3章的Linux汇编语言和第7章的链接;
  1.5 感觉受益的章节,第5章 优化程序性能、第6章 存储器层次结构、第9章 测量程序执行时间;

二、分章
 第3章 程序的机器级表示
   基础章节,讲Linux的汇编语言,讲得不清楚,不如看专门的介绍书籍;
 
 第4章 处理器体系结构
  (没看)

 第5章 优化程序性能
   从硬件角度上阐述优化的原理,有例子,很不错,建议细看;

 第6章 存储器层次结构
   存储原理和利用其特性的优化方法, 优化方法说到底就是局部性问题,用了不少内容简述,建议看;

 第7章 链接
   当然没有编译原理书介绍得清楚,不如结合起来看;

 第8章 异常控制流
   介绍UNIX的异常机制,全软,算是转述的内容,也即抄的内容;

 第9章 测量程序执行时间
   介绍本书推荐的方法,基于得到的测量数据进行的k次统计拟合得到的时间测量方程式,最后找到稳定的方程式参数值,然后再使用这些值来测量执行时间(个

人的总结和理解)

 第10章 虚拟存储器
   操作系统原理,不如看Windows操作系统原理的书,算是搬过来的内容;

 第11~~13章 系统级I/O,网络编程,并发编程
   纯软件的内容,建议不用看,基本全抄,要看去看专门的书。


三、结束
  因此,本书没有那么神,尽管角度新颖但不能保证它的所有内容都是作者的全部心得。

如果你有微机原理、操作系统、编译原理、软件编程等基础,这本书真正

值得看的不过小几章。而如果你没有上述的理论基础,可以看这本书,但最好不要看,因为不系统,还是去看系统介绍的书好。
------------------------


我仍然认为它对于想学好计算机(不管是偏软还是偏硬,当然更偏软一些)的人来说是一个非常大的帮助。它对信息在计算机中的表示,C语言的实现等都有深刻而

明了的讲述。可以说,它会给你学习计算机方面知识有一种茅塞顿开的感觉。国内同比浙江大学出版社出的一本计算机组成和设计(潘雪增)也是不错的(缺陷是

里面的错误较多,我认为可能是出版印刷问题),不过它是用的MIPS指令,而这本书用的是INTEL芯片兼容的IA32。

硬件讲的不太透,比较适合软件程序员

这本书正好补充了某些盲区,每个致力于计算机科学的人都应该好好的阅读一下本书。

因为我近来正在研究IA32的汇编优化,随便浏览了一下,发现这本书的视点相当的特别,他不是一般的理论书籍那样泛泛而谈,书站在实用的角度介绍了很多有用的东

西,讲得比较的细节和深入,涉及的一些内容对于提升对系统认知的深入把握绝对好,算是少见的对于高级读者也适用的实践型理论读物.名字"深入理解"的英文

Programmer's Perspective才真的体现出他的价值.

简直就是把普通人引向稀有物种的一本书啊!
本书英文版久负盛名,被众多专业人士称为“最伟大的计算机教材”之一,著名的美国卡内基梅隆大学计算机科学系一直将本书作为教材使用,程序员眼中的透彻讲

述计算机系统的扛鼎之作。作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE双院士(Fellow),其研究成果多次获得ACM和IEEE颁发

的大奖。本书共分十三章,分别介绍了信息的表示和处理、程序的机器级表示、处理器体系结构、存储器层次结构、静态和动态链接、虚拟存储器、系统级I/O、

网络编程和并发编程等精彩内容。其目的是解释计算机系统的所有本质概念,并向读者展示这些概念是如何实际地影响应用程序的正确性、性能和实用性。与其他

主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。本书为软件和硬件之间搭起了一个桥梁,它给出了一种帮助读者

分别从硬件和软件的角度去理解一个程序及其行为的途径,这也填补了国内计算机系统教学中的一个空白。本书的最大优点是帮助读者理解概念,让读者很清楚地

在脑海中构造一个层次型的计算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到

动态加载库,到最后的用户应用。---http://blog.csdn.net/chinaboson/

对于已经学过微机原理(或其他类似课程)和一门高级语言的朋友,本书是彻底理解硬件与高级语言之间关系的一个桥梁。该书深入浅出地涉及到了从硬件到软件

的所有层面,让你从一个俯瞰的角度全面观察计算机的具体“思维”和操作过程。
该书不仅仅诠释了硬件与高级语言的一般直观关系,它几乎涉及到计算机领域的所有方面。包括计算机体系结构、数据的表示、操作系统的运作过程、编译的原理

和基本过程等方面。它在数据在内存中的存储方式和表示方式对于程序的低层调试(debugging)具有突出的贡献。
在看过这本书后,你就好比把计算机纵横剖开来在看他的运行过程,而其中的二进制就好像是看得见的流动的实体一般,无比生动,让人印象深刻!若你想凭着自

己的聪明才智慢慢摸索,那么你可能需要多年时间的知识积累才能获得书中所描述的知识!
总的来说,这本计算机基础著作是一本上乘之作!

如果没学过微机原理,这本书也包括了计算机基本硬件的描述,其中包括CPU的结构、中断机制等。应该也是可以看懂的

绝对是一本好书!从软件编程的角度来分析计算机的硬件结构和特点,对于编写程序的是不可多得的一本好书。避免了枯燥的理论分析和电路细节,也提出了许多

有趣的算法,如不用第三变量来对两个变量交换。又如 int 变量的unsigned int 变量之间的比较(运算),自动转换带来的 负数 大于 正数问题,非常有趣

(LeiYingChun)
建议多做动手做试验,不要拘泥于书本上的知识点。计算机是一门工程学科,Do it是它的精髓。对基本概念的理解,再多、再详细的文字描述都没有一次亲手的

试验来得深刻。站在计算机系统的角度来看,这本书是一个Portal,也是一个桥梁。
计算机一门工程,动手和实验是非常重要的。仅仅去看书,并不能使你充分理解概念。以《编译原理》这门课为例,一般而言,教材会偏重理论一些,没有太多的

实验内容。所以,建议初学者还应该准备一本动手实验的书,如《编译实现》。作为学生,不可能有太多的时间去编写程序,所以,我觉得能快速地读程序和修改

程序会更实际一些。现在,开源世界的源码,有非常多,一定会有合适的源码对应各位的需求。
在某个时候,读懂别人的程序要比自己埋头写程序,可能能学习到更多的(在一定的时间之内)。不过,什么样的情况才叫读懂呢?我以为你能构造出数据结构在

内存的layout(数据结构在内存中的分布)和各个数据变量被改变的条件和改变后的值,才叫初步读懂了。读完以后,能写一篇心得,客观地说明程序的优劣点,

以及用自己的理解去猜测代码的作者为什么要那样设计,出于何种的目的?我觉得就是完全读懂了。
可以把读程序看作读书,各种程序读多了,自然自己的能力也就上去了。不过,读到一定的程度,就要开始用心设计和写程序了。不过,那个时候,应该是很轻松

的。
本质上,计算机是一门工程,充满了折中(trade-off),是一门选择折中的艺术。任何一个选择都是在一个严格的范围之内的相对最优的,我们千万不要忽视前

提和目标,这两个因素严格地限制了选择的余地。
我本人是《JCST》的审稿人,主要是审一些计算机系统领域的研究论文。《JCST》是我国计算机领域的顶级刊物,唯一被SCI检索。打算投到《JCST》的论文,我

想都是一些不错的论文。但是,迄今为止,我手上通过的文章,勉强只有一篇。我感觉,那些被我被拒绝的论文作者都没好好做过实现,一些看起来很漂亮的理论

,它是无法在特定的环境下实现的,而且,论文的相关试验也做地很不彻底,无法从各个方面去支持作者的论点(我所知道的信息是,一篇好的论文,试验工作都

是以月为单位的。美国人就是这样干的,一篇IEEE的文章要改100多个version,持续三年多)。就我过去的经验而言,想做系统方面的研究,得首先知道系统为

什么是那样的,我们做的任何改进都必须非常礼貌、谦逊地融入到大的系统。我经常对我身边的人说,系统设计要平和,不要激进,太过激进,会影响到其他部分

的正常运行。如果想知道如何礼貌,你就必须了解系统的style,也就是系统为什么是那样的。
我的导师,李国杰曾经对我说过,中国人论文中的公式很漂亮,但是缺乏必要的前提。经常是作者自己为了公式推导的需要,自己去假定前提条件,而没有严格的

试验或理论依据去做必要的保证。这样的文章是没有用的。
回到本书,我觉得我阅读本书的读者,应该多做试验。通过试验来加深一些概念的理解,和确定它的边界条件。比如,第8章的“异常控制流”里的信号处理器

(signal handler)的设计。这个概念看起来很简单,任何一本讲Unix编程的人都会说到。可是有多少人会真正去想Signal Handler的存在是因为什么呢?写一

个Signal Handler有什么限制呢?为什么有不同的Signal响应机制呢?这些都是很有趣的话题。
当我第一眼看到目录和样章的时候,我就知道这是一本可以帮助国内的计算机研究者和爱好者认识计算机系统的一个窗口。相比于美国人,国人对计算机系统的研

究是很少的。计算机系统需要很长时间的积累和深厚的底蕴,它不象你研究某个算法或解决某个具体问题(我在这里举的例子可能不合适),几个月就能有一个结

果。计算机系统的研究需要花费大量的时间来写代码,可能需要一群人花费数年的时间来搭一个平台。有了这个平台,才可能在其上做相应的研究,或者说研究目

的的倾向性很强。
其实,每一个搞计算机的人都想知道下层的事。要不然,自己就感觉很虚,也无法保证自己写的代码的稳定性。所以,了解计算机系统对于程序员是有必要的。也

许,这种潜移默化的影响会改变程序员看待计算机系统的态度,也许他就加入到轰轰烈烈、又枯燥耗时的系统研究中。研究计算机系统的人多了,中国的计算机系

统的研究水平就会上去,也就会有中国自己的操作系统,等等。

国内的书很多都只讲“是这样设计的”而不讲“为什么这样设计”,所以容易给人输灌填鸭的感觉,学起来也枯燥无味。我想这一方面是因为现代科技起源于西方,很

多历史国内学者或出书的人不熟悉,另一方面可能是因为作者本身也没有思考过“为什么这样设计”的问题。
在书中讲一些典故既能增强书本身的可读性和趣味性,还能加深印象,使人对各种理论的出现原因和背景更加清楚,知道人们之所以提出这种理论是为了解决哪种

问题。典型的象莎茨的《Operating System Concepts》、北大物理系所用的高数教材等。

如果我的研究方向是计算机体系结构,那我肯定会抱本英文的《计算机体系结构:量化研究方法》来慢慢啃。但是,假设我是一名程序员(尽管实际上我不是),

我的工作是编写好的代码;那么我对计算机的理解并不需要深入到可以设计CPU,那么大可以弄本《计算机组织与设计:软件/硬件接口》或者这本《深入理解计算

机系统》(甚至《结构化计算机组成》)来读。这两本书足以有助于我写出更好的程序,而且花不了多少时间。

个人认为这本书适合做一本穿针引线的入门读物。我是把它当成一本连接学过的各自单独的课程的书来读的,所以只要翻译的过得去,我觉得就足够了,呵呵。精

读的话就去读操作系统概念,计算机组成和设计,K&R,apue等等的原版。

本书内容非常的深入和详细,信息量很大,表达清楚明了。作者有很好的写作技巧,很多概念的讲述方法都值得称道。书中的插图感觉也是经过精心设计的,对帮

助理解非常有好处。这本书每章的内容都非常好,如果要进一步划分的话,我个人认为,写得最精彩的是第四章,作者带着我们一步一步地设计了一个简单的流水

线化的处理器,我实在想不出有比这更好的讲授方法了。第六章和第十章的内容也非常精彩。卡内基梅隆大学是计算机名校,从他们的这本教材就可见一斑了。最

后一点体会是,美国的大学用的是这么好的教材,而且这只是人家二年级本科生14周课程的教材呀。我们的高校呢?......

我读大学那会儿,我所看过的将计算机系统的教科书和参考书,都是从System implement的角度来讲,或者说,上来,就试图让你知道一个计算机系统是如何实

现的,实话,学得挺累的,而事实上,我们当中的,绝大多数,可能更需要从一个程序员的角度来看计算机系统,或者说,这本书的主线基本上是定在“知其所以然

”上的。封面上的那副图就是书中的一个例子,比较性能,从而讲cache体系:
void copyij(int src[2048][2048], int dst[2048][2048])
{
  int i,j;
  for (i = 0; i 〈 2048; i++)
    for (j = 0; j 〈 2048; j++)
      dst[i][j] = src[i][j];
}

void copyji(int src[2048][2048], int dst[2048][2048])
{
  int i,j;
  for (j = 0; j 〈 2048; j++)
    for (i = 0; i 〈 2048; i++)
      dst[i][j] = src[i][j];
}
计算机系统是很复杂的,牵涉到许多领域,就是一个小的生态环境,我们在外面看到的现象只是冰山一角。过去,我们学习到的知识是孤立的,形成一个一个的孤

岛,而且我们还是雾里看花,并不能完全理解所学的知识点。
这本书的作用在于帮我们串联了各个领域的知识,把无序的变成有序的。

本书的作者都是各个领域的牛人,看他们发表的文章就看的出来。
Randy Bryant
http://www-2.cs.cmu.edu/~bryant/
在eda设计,符号模拟以及形式验证都作出突出贡献。
就这本书而言,启的是承上启下的作用,应该是在学习编译,操作系统
(当然这几门课程不是想国内一样糊弄大家的课程!)
体系结构等课程之前学习。

 

其实如果对intel的手册比较熟的话,可以发现很多东东都很眼熟。
但是没有几个人能完完整整的熟悉intel-architecture optimize manual.
另外例如编译,链接都来自linux,gcc,elf等。
处理器体系来自patterson的量化,但是浅多了。
综合来说这是这个领域不可多得的好书之一。
语言组织也是让人很容易读懂。