读完了csapp(中文名:深刻理解计算机系统)

上个星期最终把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章“虚拟存储器”。认为这四章乃是全书之精华,看得人欲罢不能。网络

“程序的机器级表示”一章差点儿是一种教授逆向project的方法在讲授,剖析编译器产生的汇编代码,以此来加深对详细代码实现的理解。大量的习题都是依据汇编来猜源程序是什么,有趣极了。这一章还覆盖了缓冲区攻击——但是这点讲得太少了,不解渴,有时间本身弄弄……
讲底层离不了汇编这个有点棘手的东西,我还一度操心本身汇编学得不太过关,会碰到障碍。但这里做者提出一个很是实际的要求:曾经要求程序猿都会写汇编,现在要求程序猿都会读汇编。这里以一种“读”的方式教人用汇编,不局限于很是多细小的语法,让只懂得C的程序猿也毫无障碍。只100多页,不只初步讲了汇编的语法和使用,还配合大量的样例分析来解读产生的汇编代码,让人理解深入,实在是技高一筹。并发

“优化程序性能”是全书最闪光的章节。做者对一个样例不断优化,讲循环效率和过程调用,到讲存储器引用,一直讲到现代处理器的结构,讲到IA32处理器的局限,一路下来,畅快淋漓。还将IA32处理器的优化结果和Compaq Alpha 21164作对照,一目了然的看出哪些优化是处理器相关的,最后讲到profiling(程序剖析)指导优化,能够说平时能够用到的最高技巧(毕竟我还不是编译器开发者……)和流程走了一边,现实意义至关之高。
这章把能够用到的全部技巧的原理全部解说得清清楚楚,不作没必要要的挖深,结合代码,让人丝绝不觉枯燥,真是佩服得五体投地。尽管章节后对编译器优化还提供了參考文献以及加深的内容,只是我认为这章的内容已经足够我受用很是久了。 app

“存储器层次结构”实际上能够看做是“优化程序性能”一章的延伸,以及为以后的“虚拟存储器”作铺垫。这章主要详解了快速缓存(cache)的工做方式,以及利用局部性使得cache达到最好效果的方法。
“虚拟存储器”(Virtual Memory)则上升到了操做系统层面,详细解析了VM的实现以及Linux系统上VM组织方式。本身认为最受用的是malloc/free实现的动态存储器分配的详细方法以及对进程中详细存储结构的了解,还有GC的策略。这些让我感受本身能够作到的事情彷佛又多了一点,一直没法理解的valgrind之类软件的原理彷佛也有了点眉目。
这两章讲得比較仔细,以致于略微显得有点枯燥。事实上我本身喜欢这两章的主要缘由是解了我多年来关于存储器的困惑。只是存储器方面的内容实在博大精深,本身这全然是得了点皮毛就沾沾自喜。 ide

事实上在学计算机方面我仍是挺有用主义的,一直抱着碰到了再去细致研究好了的态度,因此看书广泛不认真,仅仅是求到时候能够找获得參考。只是这本书我认为格外有趣,因此也看得格外认真,把每节后的习题都作了,家庭做业则等着过两天复习(计划是这种……)的时候加深印象。
只是一直没找到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,他们向咱们证实了技术书籍也能写得如此优美。