读完了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(程序剖析)指导优化,可以说平时可以用到的最高技巧(毕竟我还不是编译器开发者……)和流程走了一边,现实意义相当之高。
这章把可以用到的所有技巧的原理所有解说得清清楚楚,不做不必要的挖深,结合代码,让人丝毫不觉枯燥,真是佩服得五体投地。尽管章节后对编译器优化还提供了參考文献以及加深的内容,只是我认为这章的内容已经足够我受用非常久了。

“存储器层次结构”实际上可以看作是“优化程序性能”一章的延伸,以及为之后的“虚拟存储器”做铺垫。这章主要详解了快速缓存(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,他们向我们证明了技术书籍也能写得如此优美。

时间: 2024-10-14 04:52:12

读完了csapp(中文名:深入理解计算机系统)的相关文章

CSAPP深入理解计算机系统第二章荟萃

1.可以利用数字的算数右移,然后利用0XFF这样的数字做掩码运算,可以获取到一个数字的符号位.计算机的移位运算有一种很重要的作用就是利用掩码运算去提取一个位模式的一段信息. 2.在C语言中的条件语句,以及三目的条件运算符,都可以用移位的方式来做. 3.在进行位扩展操作的时候,比较讲一个32位的有符号数扩展到64位,那么在保证原来的值不变的情况下,把31个低位扩展到64位的低位上,而最高的符号位扩展到高33位上. 4.利用位模式仅仅只能表示一些2的n次幂的一些浮点数,其他的比较特殊的有理数,会近似

速读《深入理解计算机系统(第三版)》总结

速读<深入理解计算机系统(第三版)>总结 第一章 计算机系统漫游 读完第一章的心情实在难以述说,在此写下这一章自己的一点学习经历及感想 仔细读完了这本书的第一章的内容,之前零零散散的学过一些计算机系统知识,也接触过编程,但是对于这两者并没有什么太多的思考,它们底层是什么联系也不太了解.当我读完这一章的内容时,我的内心是非常激动的,解除了很多之前学习中所残留下来的困惑,虽说是残留,但十分致命,令我一直处于一知半解的状态,我第一次的深刻觉得计算机是一个如此紧密的工具,我跟着作者的思路,从给出计算机

速读《深入理解计算机系统》

本周速读了<深入理解计算机系统>这本书,这本书从程序员的角度介绍了计算机系统的内在运作,展示了一些本质概念是如何实际的影响应用程序的正确性.性能和实用性的.收获如下: 1.关于进程和线程 进程是操作系统对运行程序的一种抽象,是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 线程有时被称为轻量级进程,是操作系统能够进行运算调度的最小单位.线程是进程中的一个实体,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥

4.2《深入理解计算机系统》笔记(五)并发、多进程和多线程【Final】

该书中第11章是写web服务器的搭建,无奈对web还比较陌生.还没有搞明白. 这些所谓的并发,其实都是操作系统做的事情,比如,多进程是操作系统fork函数实现的.I/O多路复用需要内核挂起进程.多线程需要内核创建和挂起线程.我么只是使用以下操作系统的这项并发技术.但是我们必须处理一些存在问题. ●进程.用这种方法,每个逻辑控制流都是一个进程,由内核来调度和维护.因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用进程间通信(IPC). ●I/O多路复用.这种形式的并发,应用程序在一个进

深入理解计算机系统读书笔记之第一章:漫游

我是从豆瓣上看到好多人都在推荐这本书,于是就去借来读一读,昨天晚上用了好长时间来读这本书的第一章节,感觉这本书比较符合我(有些基础还不太明白,这本书详细的进行了讲解,很好). 下面写一下我的理解(顺便回顾一下知识) 第一节主要讲的是: A Tour of Computer Systems 以hello.c为例进行讲解,介绍这个程序如何从一个源程序变成可执行程序,再到执行,显示屏上出现“hello,world” ···········································

《深入理解计算机系统》第四章 处理器体系结构

<深入理解计算机系统>第四章 处理器体系结构 我们看到的计算机系统都只限于机器语言程序级.处理器执行一系列指令每天指令执行某个简单操作,它们被编码为由一个或多个字节序列组成的二进制格式.在本章的学习中,我们主要了解ISA抽象的作用以及了解流水线和实现方式. 4.1 Y86-64指令集体系结构 字节序列转换为Y86-64指令的方法总结如下: 通过代码部分确定指令长度,从而以指令为单位划分字节序列: 通过功能部分确定具体的指令: 通过寄存器指示符字节确定指令中涉及的寄存器: 通过转换数值部分以小段

【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才表现出来.前几天线上模块因堆内存写越界1个字节引起各种诡异崩溃,定位问题过程中的折腾仍历历在目,今天读到<深入理解计算机系统>第9章-虚拟存储器,发现书中总结了C程序中常见的内存操作有

《深入理解计算机系统》第六周学习笔记

第四章 处理器体系结构 (一)知识点总结 一.Y86指令集体系结构 1.Y86处理器状态类似于IA32,有8个程序寄存器: %eax.%ecx.%edx.%ebx.%esi.%edi.%esp.%ebp.处理器的每个程序寄存器存储一个字.%esp被入栈.出栈.调用和返回指令作为栈指针. 2.3个一位的条件吗:ZF.SF.OF,它们保存最近的算术或逻辑指令所造成影响的有关信息.程序计数器PC存放当前正在执行指令的地址. 3.程序状态的最后一个部分是状态码stat,它表明程序执行的总体状态 4.Y8

深入理解计算机系统(4.2)---硬件的魅力

引言 这个系列已经很久没更新了,记得上一篇博文已经是三月份了,实在是抱歉.最近业余时间没有以前充裕了,因此更新一篇博文已经变成了一种奢侈.记得以前刚开始写的时候,最多的时候LZ一天写过3篇博文,现在想想,往事如梦. 好了,好不容易写一次,就不多说废话了,本文主要介绍一下硬件以及HCL语言的内容. 从疑问开始 首先,在介绍本文的内容之前,我们先来思考一个看似简单,却实际比较“高深”的问题.众所周知,计算机归根结底是在和0.1打交道,那么到底0和1是如何被计算机记住的呢? 怎么样,这个问题是不是有点