2006-12-25 12:50:46
来自: yasker
深入理解计算机系统(修订版)的评论



上个星期终于把csapp看完了。
我买的是中文版的,因为除了貌似评价不错以外,由于涉及到些自己不了解的底层东西,怕是看英文会云里雾里。现在看来,大概不能算是个优点,但是的确能够加快我的看书速度,否则一星期还真不大可能把这书搞定。
对csapp慕名已久,主要在于据说这本书尽量的做到相对实用,不去讲那些和实际编程没多大关系的计算机原理(毕竟是著名计算机院校里面最偏软件的 cmu的作品),重点非常得当,像我这种没有本科科班出生又不想去死读些不知道以后有没有用的东西的人来说,最是适合了。感兴趣的东西就可以再加深,不感兴趣的就算了,正好。
在csapp的序言里有个课程列表,其中推荐了几种教学课程,对应使用不同的章节。我参考选用的是ICS+的规划。ICS+的cmu课号为15-213,据说正好和cmu的邮编相同,然后就有了这句“15-213: The Class That Gives CMU Its Zip!”。以这句为关键词,能够找到ICS+的slide。
ICS+的课程基本上涵盖了全书,除了第4章“处理器体系结构”以外。我自己除了跳过这个的确不太感兴趣的章节(太偏硬件)以外,还有第9章“测量程序执行时间”是略略翻过,其他的都是认真读完写完习题的。
书的确是难得的书。我第一次试图读这本书是几个月以前,当时第2章“信息的表示和处理”没看完就放下了,觉得讲了一大堆数字表达方式很没意思……这次稍微坚持了一下,没想到就一口气读下来了……
重点推荐第3章“程序的机器级表示”、第5章“优化程序性能”、第6章“存储器层次结构”、第10章“虚拟存储器”。觉得这四章乃是全书之精华,看得人欲罢不能。
“程序的机器级表示”一章几乎是一种教授逆向工程的方法在讲授,剖析编译器产生的汇编代码,以此来加深对具体代码实现的理解。大量的习题都是根据汇编来猜源程序是什么,有趣极了。这一章还覆盖了缓冲区攻击——但是这点讲得太少了,不解渴,有时间自己弄弄……
讲底层离不了汇编这个有点棘手的东西,我还一度担心自己汇编学得不太过关,会碰到障碍。但这里作者提出一个很实际的要求:以前要求程序员都会写汇编,现在要求程序员都会读汇编。这里以一种“读”的方式教人用汇编,不局限于很多细小的语法,让仅仅懂得C的程序员也毫无障碍。仅仅100多页,不仅初步讲了汇编的语法和使用,还配合大量的例子分析来解读产生的汇编代码,让人理解深刻,实在是技高一筹。
“优化程序性能”是全书最闪光的章节。作者对一个例子不断优化,讲循环效率和过程调用,到讲存储器引用,一直讲到现代处理器的结构,讲到IA32处理器的局限,一路下来,畅快淋漓。还将IA32处理器的优化结果和Compaq Alpha 21164做对比,一目了然的看出哪些优化是处理器相关的,最后讲到profiling(程序剖析)指导优化,可以说平时能够用到的最高技巧(毕竟我还不是编译器开发人员……)和流程走了一边,现实意义相当之高。
这章把能够用到的所有技巧的原理全部讲解得清清楚楚,不做不必要的挖深,结合代码,让人丝毫不觉枯燥,真是佩服得五体投地。虽然章节后对编译器优化还提供了参考文献以及加深的内容,不过我觉得这章的内容已经足够我受用很久了。
“存储器层次结构”实际上可以看作是“优化程序性能”一章的延伸,以及为之后的“虚拟存储器”做铺垫。这章主要详细解释了高速缓存(cache)的工作方式,以及利用局部性使得cache达到最好效果的方法。
而“虚拟存储器”(Virtual Memory)则上升到了操作系统层面,详细解析了VM的实现以及Linux系统上VM组织方式。自己觉得最受用的是malloc/free实现的动态存储器分配的具体方法以及对进程中具体存储结构的了解,还有GC的策略。这些让我感觉自己能够做到的事情似乎又多了一点,一直无法理解的valgrind之类软件的原理似乎也有了点眉目。
这两章讲得比较细致,以至于稍微显得有点枯燥。其实我自己喜欢这两章的主要原因是解了我多年来关于存储器的困惑。不过存储器方面的内容实在博大精深,自己这完全是得了点皮毛就沾沾自喜。
其实在学计算机方面我还是挺实用主义的,一直抱着碰到了再去仔细研究好了的态度,所以看书普遍不认真,只是求到时候能够找得到参考。不过这本书我觉得格外有趣,所以也看得格外认真,把每节后的习题都做了,家庭作业则等着过两天复习(计划是这样的……)的时候加深印象。
不过一直没找到csapp的实习手册。其中有个“二进制炸弹”实验非常吸引人,典型的反汇编作业,有点点实现我小时候破解愿望的感觉——希望找到以后不要让我太失望,呵呵。
不过这本书还是有些不足之处。让人感到最大的遗憾是最后三章“系统级I/O”、“网络编程”、“并发编程”讲得比较简略——自己正好是在这方面稍微熟悉点,觉得少了很多东西,有点遗憾。不过“并发编程”教给我了一个以前我根本不知道的东西——进度图,用来解释为什么会出现死锁以及如何解决实在是好极了(自己也是太孤陋寡闻……)。
另外还有个仔细读了apue2以后还让我非常困惑以至于还得上网查才弄明白的一件事,csapp当头一句话就解决了,那就是csapp写到 pthread_detach函数时,说“为了避免存储器泄露,每个可结合的线程都应该要么被其他线程显式地回收,要么通过调用 pthread_detach函数被分离”。而apue2关于detach的那段话硬是让我云里雾里,仅仅解释了thread的行为和怎么用,不讲为什么,害得我还得去查……不过apue2的thread部分不是W.Richard Stevens写的,是Rago后加的,的确有质量差别……
想来书也是有轻重之分,csapp的重点还是再讲硬件和软件的结合部,后面系统偏应用级的东西只是做抛砖引玉之用,也是难怪。尽管是这样,csapp有时还是会让人眼前一亮。
这本书另外的问题就是虽然中文翻译还算不错——也是过了个修订版的缘故,但是排版经常出错,尤其是排汇编代码和注释的时候。而且这个书名翻译得特别没劲,愣像是混杂在一堆国产计算机结构书里的东西……
不过还是那句,瑕不掩瑜,csapp的确是我看过的最好的计算机书之一了(本来想不加之一的,不过不加至少有点对不起apue^_^)。
说回来,csapp的致谢里面有这样一句话:
最后,我们衷心感谢伟大的技术作家Brian Kernigam以及后来的W.Richard Stevens,他们向我们证明了技术书籍也能写得如此优美。
深入理解计算机系统(修订版)的评论




上个星期终于把csapp看完了。
我买的是中文版的,因为除了貌似评价不错以外,由于涉及到些自己不了解的底层东西,怕是看英文会云里雾里。现在看来,大概不能算是个优点,但是的确能够加快我的看书速度,否则一星期还真不大可能把这书搞定。
对csapp慕名已久,主要在于据说这本书尽量的做到相对实用,不去讲那些和实际编程没多大关系的计算机原理(毕竟是著名计算机院校里面最偏软件的 cmu的作品),重点非常得当,像我这种没有本科科班出生又不想去死读些不知道以后有没有用的东西的人来说,最是适合了。感兴趣的东西就可以再加深,不感兴趣的就算了,正好。
在csapp的序言里有个课程列表,其中推荐了几种教学课程,对应使用不同的章节。我参考选用的是ICS+的规划。ICS+的cmu课号为15-213,据说正好和cmu的邮编相同,然后就有了这句“15-213: The Class That Gives CMU Its Zip!”。以这句为关键词,能够找到ICS+的slide。
ICS+的课程基本上涵盖了全书,除了第4章“处理器体系结构”以外。我自己除了跳过这个的确不太感兴趣的章节(太偏硬件)以外,还有第9章“测量程序执行时间”是略略翻过,其他的都是认真读完写完习题的。
书的确是难得的书。我第一次试图读这本书是几个月以前,当时第2章“信息的表示和处理”没看完就放下了,觉得讲了一大堆数字表达方式很没意思……这次稍微坚持了一下,没想到就一口气读下来了……
重点推荐第3章“程序的机器级表示”、第5章“优化程序性能”、第6章“存储器层次结构”、第10章“虚拟存储器”。觉得这四章乃是全书之精华,看得人欲罢不能。
“程序的机器级表示”一章几乎是一种教授逆向工程的方法在讲授,剖析编译器产生的汇编代码,以此来加深对具体代码实现的理解。大量的习题都是根据汇编来猜源程序是什么,有趣极了。这一章还覆盖了缓冲区攻击——但是这点讲得太少了,不解渴,有时间自己弄弄……
讲底层离不了汇编这个有点棘手的东西,我还一度担心自己汇编学得不太过关,会碰到障碍。但这里作者提出一个很实际的要求:以前要求程序员都会写汇编,现在要求程序员都会读汇编。这里以一种“读”的方式教人用汇编,不局限于很多细小的语法,让仅仅懂得C的程序员也毫无障碍。仅仅100多页,不仅初步讲了汇编的语法和使用,还配合大量的例子分析来解读产生的汇编代码,让人理解深刻,实在是技高一筹。
“优化程序性能”是全书最闪光的章节。作者对一个例子不断优化,讲循环效率和过程调用,到讲存储器引用,一直讲到现代处理器的结构,讲到IA32处理器的局限,一路下来,畅快淋漓。还将IA32处理器的优化结果和Compaq Alpha 21164做对比,一目了然的看出哪些优化是处理器相关的,最后讲到profiling(程序剖析)指导优化,可以说平时能够用到的最高技巧(毕竟我还不是编译器开发人员……)和流程走了一边,现实意义相当之高。
这章把能够用到的所有技巧的原理全部讲解得清清楚楚,不做不必要的挖深,结合代码,让人丝毫不觉枯燥,真是佩服得五体投地。虽然章节后对编译器优化还提供了参考文献以及加深的内容,不过我觉得这章的内容已经足够我受用很久了。
“存储器层次结构”实际上可以看作是“优化程序性能”一章的延伸,以及为之后的“虚拟存储器”做铺垫。这章主要详细解释了高速缓存(cache)的工作方式,以及利用局部性使得cache达到最好效果的方法。
而“虚拟存储器”(Virtual Memory)则上升到了操作系统层面,详细解析了VM的实现以及Linux系统上VM组织方式。自己觉得最受用的是malloc/free实现的动态存储器分配的具体方法以及对进程中具体存储结构的了解,还有GC的策略。这些让我感觉自己能够做到的事情似乎又多了一点,一直无法理解的valgrind之类软件的原理似乎也有了点眉目。
这两章讲得比较细致,以至于稍微显得有点枯燥。其实我自己喜欢这两章的主要原因是解了我多年来关于存储器的困惑。不过存储器方面的内容实在博大精深,自己这完全是得了点皮毛就沾沾自喜。
其实在学计算机方面我还是挺实用主义的,一直抱着碰到了再去仔细研究好了的态度,所以看书普遍不认真,只是求到时候能够找得到参考。不过这本书我觉得格外有趣,所以也看得格外认真,把每节后的习题都做了,家庭作业则等着过两天复习(计划是这样的……)的时候加深印象。
不过一直没找到csapp的实习手册。其中有个“二进制炸弹”实验非常吸引人,典型的反汇编作业,有点点实现我小时候破解愿望的感觉——希望找到以后不要让我太失望,呵呵。
不过这本书还是有些不足之处。让人感到最大的遗憾是最后三章“系统级I/O”、“网络编程”、“并发编程”讲得比较简略——自己正好是在这方面稍微熟悉点,觉得少了很多东西,有点遗憾。不过“并发编程”教给我了一个以前我根本不知道的东西——进度图,用来解释为什么会出现死锁以及如何解决实在是好极了(自己也是太孤陋寡闻……)。
另外还有个仔细读了apue2以后还让我非常困惑以至于还得上网查才弄明白的一件事,csapp当头一句话就解决了,那就是csapp写到 pthread_detach函数时,说“为了避免存储器泄露,每个可结合的线程都应该要么被其他线程显式地回收,要么通过调用 pthread_detach函数被分离”。而apue2关于detach的那段话硬是让我云里雾里,仅仅解释了thread的行为和怎么用,不讲为什么,害得我还得去查……不过apue2的thread部分不是W.Richard Stevens写的,是Rago后加的,的确有质量差别……
想来书也是有轻重之分,csapp的重点还是再讲硬件和软件的结合部,后面系统偏应用级的东西只是做抛砖引玉之用,也是难怪。尽管是这样,csapp有时还是会让人眼前一亮。
这本书另外的问题就是虽然中文翻译还算不错——也是过了个修订版的缘故,但是排版经常出错,尤其是排汇编代码和注释的时候。而且这个书名翻译得特别没劲,愣像是混杂在一堆国产计算机结构书里的东西……
不过还是那句,瑕不掩瑜,csapp的确是我看过的最好的计算机书之一了(本来想不加之一的,不过不加至少有点对不起apue^_^)。
说回来,csapp的致谢里面有这样一句话:
最后,我们衷心感谢伟大的技术作家Brian Kernigam以及后来的W.Richard Stevens,他们向我们证明了技术书籍也能写得如此优美。
本评论版权属于作者yasker,并受法律保护。除非评论正文中另有声明,没有作者本人的书面许可任何人不得转载或使用整体或任何部分的内容。

2006-12-25 19:07:29 Di
这玩意我当工具书用的~~2006-12-26 12:25:51 raeedward
居然能把一本这样的书读得这么有滋味有心得,只能说楼主兴趣特别2006-12-26 12:57:20 yasker
汗……另外个人觉得这本书更适合读,而不是当参考资料……
当参考资料的书可以选择更深入也更古板的……
呵呵
2006-12-26 16:01:41 罂粟
这是我们的ICS教材……里面的八个lab也全部做过…… -,=2006-12-26 22:16:57 Di
哪本古板的翻译得像样的?2007-03-10 02:22:45 fishswimming
恩,此君的写作能力与Michael Abrash不分伯仲 :-]2007-05-13 14:05:42 Love Scarlett
怎么不说说第四章,那个y86模拟器,我始终没有搞出来。总是说找不到init.tcl,我安装了啊,不知道安装在哪了。
2007-05-21 14:22:27 中原一点红
现在出了本《编程卓越之道》(第一卷:深入理解计算机),二者孰优孰劣?2007-06-04 12:17:30 yangtou
看这本书有个疑问讲到内存对齐时,作者说windows要求"任何k字节对象的地址都必须是k的倍数。它要求一个double的地址必须是8的倍数"。我觉得这是错误的,内存地址怎么分配,完全是编译器的事情,只要编译器生成的二进制代码能够在运行就可以了。某个变量在内存中的位置分配是否符合要求,操作系统本身是没有办法感知的,除非体系结构对此有特殊的要求,那也是编译器生成代码的时候就会解决的,和操作系统有什么关系?
2008-01-25 10:20:25 超级李大兵
很不错的一本书买了一年多了
还继续在看呢~~~
2008-05-26 15:19:08 rainman10110
不是楼主有超人的文采,而是他领略到了本书的精华。我刚接触本书不久,在读到第四章时兴奋的几乎坐不住了~~~
我还没看过apue2,所以我认为csapp是地球上最伟大的计算机书籍!
我相信apue2同样会给人醍醐灌顶之感~~~
引用楼主文章中所引用的:
最后,我们衷心感谢伟大的技术作家Brian Kernigam以及后来的W.Richard Stevens,他们向我们证明了技术书籍也能写得如此优美。
谢谢yasker!
2008-07-23 11:15:31 嘶叫的灵魂
本书确实相当好,第一次读的时候由于自己的底子不够,很多没能看懂,一年之后再看,方才发现此书的绝妙。它将近两年来我学的很多知识的盲点扫除了,并对这些知识有了更深入的了解。
中文版翻译虽不能算完美,但已经是相当不错了,译者是很负责的。
此书还是有一定难度的,理论推导较多(否则怎么能叫深入呢?)。有的地方我也看了多遍才弄明白。但一旦投入其中,那种欲罢不能的感觉真是让人沉醉。
此外,此书虽是“计算机系统”,但更多是从软件方面着眼的,欲深入研究硬件的同学有更好的选择。
2008-07-26 10:57:22 横刀天笑
评价如此之好啊?我也在读这本书,不过读的实在费劲,不是科班出生很多东西都不知道,哎2008-10-08 14:11:42 胖城管
好书,正在读,强烈赞美呀~2008-10-24 12:52:35 hacker47
还有更好的呢,试试htdp
或者sicp
2008-12-04 10:07:32 夜孤行
我觉的,后面几章是APUE的概述,想深入了解偏应用的,直接APUE就可以了。2008-12-31 16:07:59 mather
我建了个学习群,欢迎加入 682644712009-03-01 13:36:46 ganggang
看完前三章,感觉非常棒。第四章暂时不看了--感觉偏硬,准备继续啃第五章。2009-05-31 12:01:04 chopin
看完之后,感觉这本书应该是入门书,后面一部分是配合apue和unp的,帮助理解2009-06-13 17:38:10 E.T
第二章让人犯晕,先跳过了……2009-06-19 00:44:48 zezhkui
一周看完。。怀疑你看懂没2009-08-16 14:05:17 释然
第三章汇编是精华,书中使用的编译器是GCC 2.95,在Linux和Unix下很难找了,一般都是GCC3.3或是4.x。编译出来的汇编和书中有差别。而在Windows下的Mingw还存有2.95.3版本,编译的汇编和书中逐行一致。安装C-Free后在目录下有Mingw32,其中的gcc就是2.95.3。遗憾的是工具不完整,例如objdump和nm,包含在CFree网站上单独下载的完整版Mingw3.x版本中。
2009-09-01 22:29:57 steamx
你看书的速度咋这么快呢?一周就能看完.每天看书几个小时?2009-10-07 23:20:24 NightCrawler
这本书蛮不错的,至少让我这样的Unix小白补习了一下2009-11-09 21:31:36 守望者
我相信lz是一周可以看完的。十一前后我用了不到两个星期把csapp看完了,并起做了课后习题,也是按照ICS+的计划看的,从第二章开始就有爱不释手的感觉了,真想一口气读完。这本书讲的很基础,只要学过计算机必修基础课,读起来还是不费力的,觉得读这本书最大的收获就是将以前学过的如操作系统、编译原理、组成原理的知识联系起来了,看过之后对程序从源码的编译到执行后系统的善后有了清晰地认识,这种感觉真的很爽!数据的表示、过程调用中栈的变化,程序优化,编译链接、存储层次结构、虚拟存储等等,读后真有醍醐灌顶的感觉!2009-12-21 17:36:38 Moon Shepherd
看这本书有个疑问讲到内存对齐时,作者说windows要求"任何k字节对象的地址都必须是k的倍数。它要求一个double的地址必须是8的倍数"。我觉得这是错误的,内存地址怎么分配,完全是编译器的事情,只要编译器生成的二进制代码能够在运行就可以了。某个变量在内存中的位置分配是否符合要求,操作系统本身是没有办法感知的,除非体系结构对此有特殊的要求,那也是编译器生成代码的时候就会解决的,和操作系统有什么关系?
为了最好的使用高速缓存,就需要这样。
> 我来回应