如何阅读《深入理解计算机系统》?(文末送书)
扫描二维码
随时随地手机看文章
导读:如果你也读CS专业,如果你也不知道怎么回答“学计算机不就是学修电脑”这个CS系的宿命之问,推荐一定读一读《深入理解计算机系统》。《深入理解计算机系统》是一本什么样的书呢?两个字,经典。原因有二,第一,这书无数业界大牛推荐,第二,这书和你印象中的经典一样,给人的第一感觉就是厚实。不过,厚实也很容易再给人一种感觉,那就是望而却步——你没准会想,这么厚的书,又是经典,是不是很难读?
大可放心,一点也不会。
经典也是有细分领域的,有很多书之所以经典,是因为对一些问题进行了很深入的探讨,而《深入理解计算机系统》的经典,我认为是把计算机中被分割成很多块的知识,用一本书一口气完整地全部整理出来。
1《深入理解计算机系统》为什么经典
我们先回想一下,计算机专业都开设有哪些专业课。首先肯定有编程,这个专业很大一部分工作是要给码农培养接班人。编程的一个重要环节是编译,那设计编译器要开一门课,叫编译原理。编译完了要运行,运行需要依赖硬件环境和软件环境,于是就有了计算机组成原理和操作系统。如果早个二三十年,计算机的知识体系到这就差不多了,不过现在可是网络时代,所以还得再加一门课,叫计算机网络。这还是往大了分,细分就更多了,光编程语言就有好几种,而且别忘了背后还有一堆的各种数学,就不细说了。
计算机技术蓬勃发展,学科体系自然枝繁叶茂,但学计算机很容易就像在追冰与火之歌一样,世界观太宏大支线剧情太多,眼前很难呈现出一幅完整的图景。所以当时我们学各门学科的时候,大家问的最多的不是学科本身的某个知识点,而是“为什么要学这门课”。刚才我把各个主要科目串了一串,读完应该会对各科之间的关系有一个更宏观的了解。
可是,光有这么一句话肯定还有很多问题没法解决。有没有一本书专从这个角度讲计算机科学呢?计算机科学有很多经典的书,但大多数都是专注各个领域的内部知识,不过好在还真有一本经典的书,是从计算机的角度来看待计算机,这就是《深入理解计算机系统》。
我当初读《深入理解计算机系统》,读完就是一个感觉,淋漓畅快。感觉脑子里很多零星的碎片,读完以后都拼在了一起。《深入理解计算机系统》书很厚,讲的也深入,但深入的是知识点与知识点之间的关联,也许很多正好都是你深感困扰的问题,读完很容易让你有种“哦,原来是这样”的感叹,节省了很多去苦苦思索的时间。写本文的时候我特意看了一下大家对《深入理解计算机系统》的书评,果然很多人感受和我一样,相见恨晚。
2《深入理解计算机系统》都写了什么
《深入理解计算机系统》这本书起源于卡内基梅隆大学(CMU)的一门课,叫计算机系统导论(ICS)。这门课相信计算机系的学生都不会陌生,一般都是作为第一门专业课开设的,内容基本就是回答大家刚入坑时最想知道的那个问题:学计算机都学些什么。对于我来说,这是当时唯一一门从计算机整体视角来开展介绍的课程,在那以后,我们就被扔进各个子学科里面扑腾,再也难一窥全貌。
《深入理解计算机系统》的作者们很谦虚,说这本书起源于ICS,但经过3版的不断扩充内容,涵盖范围已经很广,现在也可以作为计算机组成原理(ORG)和系统编程(SP)的教材,但我觉得,这本书的用途远不止于“教材”。
相信每个学完计算机的学生都会认同,学计算机,编程也好其它什么也好,最佳的方法就是动手,亲自动手做一次,比看什么书都掌握得牢靠。但是,这就带来一个悖论:学计算机,最好的方法就是去做一台计算机,计算机专业教的内容一言蔽之,确实就是怎样去制造计算机运行的各个所需部件,但限制条件非常多,真正动手撸一台计算机不太现实。
那怎么办呢?我经常在B站围观大牛完成各种精巧的小玩意,看了一遍,感觉自己也像是做了一遍,虽然肯定没有自己动手来得实在,不过肯定比只看纯描写要好得多。那我们是不是能退而求其次,“看”别人一个部件一个部件地撸一台计算机呢?《深入理解计算机系统》就是从这个理念出发写成了本书。
3《深入理解计算机系统》第3版都改了什么
《深入理解计算机系统》是一本经典书,现在已经出到了第3版,正好我手里第2版和第3版都有,顺手先一个比较。
总的来说,第3版基本沿用了第2版的框架,但也有不少变化。首先第3版有两个直观变化,一个是更厚了一点,一个是印刷更好看了,第2版是最经典的黑白印刷,第3版加入了蓝色,正好这本书里面很多代码图表,看起来更醒目了。
在内容上第3版也做了大量修改。第2版和第3版大概相差10年,在第2版上市的时候,IA32架构,也就是我们俗称的32位指令集还是主流,但到了现在,已经是64位指令集,也就是x86-64的天下了。第3版也体现了技术的变化,指令集的表现形式均采用64位。指令集是非常底层的东西,所以这部分牵涉了很多内容,书里都做了全面调整。
另一个内容上的大改动是API的升级,譬如在第11章,第3版用新的getaddrinfo和getnameinfo函数取代了老版的gethostbyname和gethostbyaddr。
此外还有不少细节上的调整甚至重写,也对一些容易让人困扰的知识点进行了扩充说明,总的来说阅读体验比上一版更好。4《深入理解计算机系统》漫游指南
《深入理解计算机系统》一共12章,分成程序结构和执行、在系统上运行程序和程序间的交互和通信三个部分,涉及了计算机技术的方方面面,横跨多个科目。下面我就毛遂自荐充当各位的导游,和大家一起逐章看看都讲了哪些内容。
第一章,章名就叫“计算机系统漫游”,可以认为是这本书的“计算机导论”课,以一个hello程序为主线,串起了从编代码到程序执行整个过程都经历了哪些环节。最后有一个知识点,叫“Amdahl定律”,研究各个部件的性能提升和整体性能提升的关系。
第二章,叫“信息的表示和处理”,介绍了一些数字逻辑的内容,也就是计算机的“计算”部分。计算可分为数值类型和运算类型两个组成部分,在数学体系里,数的类型有很多,譬如自然数、整数、有理数、无理数、代数数、超越数、实数等等,光数系都是数学里的重点研究对象,不过别担心,计算机里边就简单多了,目前只分为整数和浮点数两类。第二章也是“程序结构和执行”部分的第一章,往下都是从机器角度看程序构造。
第三章,叫“程序的机器级表示”,名字挺拗口,其实说的就是指令集的事。计算机专业一般不会为CPU指令集专门开一课,很多知识点和汇编语言说的内容重合,前面说的全面调整为x86-64体系,在这个部分体现得很充分。
第四章,叫“处理器体系结构”,讲的是CPU的工作原理。不要和上一章搞混了,CPU的指令集,和CPU本身的结构原理有关系,但不完全是一回事,这一章更多的是逻辑电路相关的内容,介绍诸如时钟周期、流水线等偏硬件内容。
第五章,叫“优化程序性能”,章名就已经很明确,划分知识点的话大部分属于编译原理范畴。我们上编译原理主要讲的是各种文法和实现诸如词法器这类的部件,不过这都属于基本功,真正的重点和难点在于优化。当然程序性能优化不止编译优化,这是一套体系,还有内存、存储等多个地方都可以进行优化。要想看编译原理的基本功部分,推荐看龙书。
第六章,叫“存储器层次结构”,就是我们所说的内存外存了,涉及磁盘构造、缓存设计等等问题。
第七章,叫“链接”,这是源码编译的一个重要环节。回忆一下编译原理对编译过程的介绍,源码编译不是直接从源码编译成目标代码,也就是不是直接生成机器码,而生成一种叫“中间代码”的产物。以中间代码为界,前面叫“前端”,对应的还有一个“后端”,就是通过中间代码最终生成目标代码,链接就是这个过程的一个重要环节。第七章也是“在系统上运行程序”部分的第一章,往下主要是从操作系统的角度看程序运行性的各种情况。
第八章,叫“异常控制流”,“异常”这个概念大家肯定都听过,不过这里主要指的是操作系统中的异常及中断的工作流程,不过也简要讨论了高级编程语言中的异常。
第九章,叫“虚拟内存”,虚拟内存在现代操作系统中非常重要,这一章主要讨论虚拟内存的各种管理机制,以及现在很热门的垃圾收集(GC),还延伸了一点安全人员很感兴趣的内存泄露方面的讨论。
第十章,叫“系统级IO”,主要介绍文件系统的读写等操作接口。要是能对文件系统本身多展开一点内容就更好了。这一章也是“程序间的交互和通信”部分的第一章,往下说的就都是各种IO了。
第十一章和第十二章分别介绍了“网络编程”和“并发编程”,至此主流的各种IO就全部介绍了一遍。5