读《深入理解计算机系统》,文末送书
共 4224字,需浏览 9分钟
·
2021-08-23 13:07
《深入理解计算机系统》是一本什么样的书呢?两个字,经典。原因有二,第一,这书无数业界大牛推荐,第二,这书和你印象中的经典一样,给人的第一感觉就是厚实。不过,厚实也很容易再给人一种感觉,那就是望而却步——你没准会想,这么厚的书,又是经典,是不是很难读?
大可放心,一点也不会。
经典也是有细分领域的,有很多书之所以经典,是因为对一些问题进行了很深入的探讨,而《深入理解计算机系统》的经典,我认为是把计算机中被分割成很多块的知识,用一本书一口气完整地全部整理出来。
我们先回想一下,计算机专业都开设有哪些专业课。首先肯定有编程,这个专业很大一部分工作是要给码农培养接班人。编程的一个重要环节是编译,那设计编译器要开一门课,叫编译原理。编译完了要运行,运行需要依赖硬件环境和软件环境,于是就有了计算机组成原理和操作系统。如果早个二三十年,计算机的知识体系到这就差不多了,不过现在可是网络时代,所以还得再加一门课,叫计算机网络。这还是往大了分,细分就更多了,光编程语言就有好几种,而且别忘了背后还有一堆的各种数学,就不细说了。
计算机技术蓬勃发展,学科体系自然枝繁叶茂,但学计算机很容易就像在追冰与火之歌一样,世界观太宏大支线剧情太多,眼前很难呈现出一幅完整的图景。所以当时我们学各门学科的时候,大家问的最多的不是学科本身的某个知识点,而是“为什么要学这门课”。刚才我把各个主要科目串了一串,读完应该会对各科之间的关系有一个更宏观的了解。
可是,光有这么一句话肯定还有很多问题没法解决。有没有一本书专从这个角度讲计算机科学呢?计算机科学有很多经典的书,但大多数都是专注各个领域的内部知识,不过好在还真有一本经典的书,是从计算机的角度来看待计算机,这就是《深入理解计算机系统》。
我当初读《深入理解计算机系统》,读完就是一个感觉,淋漓畅快。感觉脑子里很多零星的碎片,读完以后都拼在了一起。《深入理解计算机系统》书很厚,讲的也深入,但深入的是知识点与知识点之间的关联,也许很多正好都是你深感困扰的问题,读完很容易让你有种“哦,原来是这样”的感叹,节省了很多去苦苦思索的时间。写本文的时候我特意看了一下大家对《深入理解计算机系统》的书评,果然很多人感受和我一样,相见恨晚。
《深入理解计算机系统》这本书起源于卡内基梅隆大学(CMU)的一门课,叫计算机系统导论(ICS)。这门课相信计算机系的学生都不会陌生,一般都是作为第一门专业课开设的,内容基本就是回答大家刚入坑时最想知道的那个问题:学计算机都学些什么。对于我来说,这是当时唯一一门从计算机整体视角来开展介绍的课程,在那以后,我们就被扔进各个子学科里面扑腾,再也难一窥全貌。
《深入理解计算机系统》的作者们很谦虚,说这本书起源于ICS,但经过3版的不断扩充内容,涵盖范围已经很广,现在也可以作为计算机组成原理(ORG)和系统编程(SP)的教材,但我觉得,这本书的用途远不止于“教材”。
相信每个学完计算机的学生都会认同,学计算机,编程也好其它什么也好,最佳的方法就是动手,亲自动手做一次,比看什么书都掌握得牢靠。但是,这就带来一个悖论:学计算机,最好的方法就是去做一台计算机,计算机专业教的内容一言蔽之,确实就是怎样去制造计算机运行的各个所需部件,但限制条件非常多,真正动手撸一台计算机不太现实。
那怎么办呢?我经常在B站围观大牛完成各种精巧的小玩意,看了一遍,感觉自己也像是做了一遍,虽然肯定没有自己动手来得实在,不过肯定比只看纯描写要好得多。那我们是不是能退而求其次,“看”别人一个部件一个部件地撸一台计算机呢?《深入理解计算机系统》就是从这个理念出发写成了本书。
《深入理解计算机系统》是一本经典书,现在已经出到了第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。
此外还有不少细节上的调整甚至重写,也对一些容易让人困扰的知识点进行了扩充说明,总的来说阅读体验比上一版更好。
《深入理解计算机系统》一共12章,分成程序结构和执行、在系统上运行程序和程序间的交互和通信三个部分,涉及了计算机技术的方方面面,横跨多个科目。下面我就毛遂自荐充当各位的导游,和大家一起逐章看看都讲了哪些内容。
第一章,章名就叫“计算机系统漫游”,可以认为是这本书的“计算机导论”课,以一个hello程序为主线,串起了从编代码到程序执行整个过程都经历了哪些环节。最后有一个知识点,叫“Amdahl定律”,研究各个部件的性能提升和整体性能提升的关系。
第二章,叫“信息的表示和处理”,介绍了一些数字逻辑的内容,也就是计算机的“计算”部分。计算可分为数值类型和运算类型两个组成部分,在数学体系里,数的类型有很多,譬如自然数、整数、有理数、无理数、代数数、超越数、实数等等,光数系都是数学里的重点研究对象,不过别担心,计算机里边就简单多了,目前只分为整数和浮点数两类。
第二章也是“程序结构和执行”部分的第一章,往下都是从机器角度看程序构造。
第三章,叫“程序的机器级表示”,名字挺拗口,其实说的就是指令集的事。计算机专业一般不会为CPU指令集专门开一课,很多知识点和汇编语言说的内容重合,前面说的全面调整为x86-64体系,在这个部分体现得很充分。
第四章,叫“处理器体系结构”,讲的是CPU的工作原理。不要和上一章搞混了,CPU的指令集,和CPU本身的结构原理有关系,但不完全是一回事,这一章更多的是逻辑电路相关的内容,介绍诸如时钟周期、流水线等偏硬件内容。
第五章,叫“优化程序性能”,章名就已经很明确,划分知识点的话大部分属于编译原理范畴。我们上编译原理主要讲的是各种文法和实现诸如词法器这类的部件,不过这都属于基本功,真正的重点和难点在于优化。当然程序性能优化不止编译优化,这是一套体系,还有内存、存储等多个地方都可以进行优化。要想看编译原理的基本功部分,推荐看龙书。
第六章,叫“存储器层次结构”,就是我们所说的内存外存了,涉及磁盘构造、缓存设计等等问题。
第七章,叫“链接”,这是源码编译的一个重要环节。回忆一下编译原理对编译过程的介绍,源码编译不是直接从源码编译成目标代码,也就是不是直接生成机器码,而生成一种叫“中间代码”的产物。以中间代码为界,前面叫“前端”,对应的还有一个“后端”,就是通过中间代码最终生成目标代码,链接就是这个过程的一个重要环节。第七章也是“在系统上运行程序”部分的第一章,往下主要是从操作系统的角度看程序运行性的各种情况。
第八章,叫“异常控制流”,“异常”这个概念大家肯定都听过,不过这里主要指的是操作系统中的异常及中断的工作流程,不过也简要讨论了高级编程语言中的异常。
第九章,叫“虚拟内存”,虚拟内存在现代操作系统中非常重要,这一章主要讨论虚拟内存的各种管理机制,以及现在很热门的垃圾收集(GC),还延伸了一点安全人员很感兴趣的内存泄露方面的讨论。
第十章,叫“系统级IO”,主要介绍文件系统的读写等操作接口。要是能对文件系统本身多展开一点内容就更好了。这一章也是“程序间的交互和通信”部分的第一章,往下说的就都是各种IO了。
第十一章和第十二章分别介绍了“网络编程”和“并发编程”,至此主流的各种IO就全部介绍了一遍。
被誉为“价值超过等重量黄金的无价资源宝库”,理解计算机系统首选书目,十余万程序员的共同选择。
卡内基-梅隆大学、北京大学、清华大学、上海交通大学等国内外众多知名高校选用指定教材。
从程序员视角全面剖析的实现细节,使读者深刻理解程序的行为,将所有计算机系统的相关知识融会贯通。
本书是一本将计算机软件和硬件理论结合讲述的经典教程,内容覆盖计算机导论、体系结构和处理器设计等多门课程。本书的最大优点是从程序员的角度描述计算机系统的实现细节,通过描述程序是如何映射到系统上,以及程序是如何执行的,使读者更好地理解程序的行为,以及程序效率低下的原因。
如何使用本书从程序员的角度来学习计算机系统是如何工作的会非常有趣。最理想的学习方法是在真正的系统上解决具体的问题,或是编写和运行程序。这个主题观念贯穿本书始终。因此我们建议你用如下方式学习这本书:
学习一个新概念时,你应该立刻做一做紧随其后的一个或多个练习题来检验你的理解。这些练习题的解答在每章的末尾。要先尝试自己来解答每个问题,然后再查阅答案。
每一章后都有一组难度不同的作业题,这些题目需要的时间从十几分钟到十几个小时,但建议你尝试完成这些作业题,完成之后你会发现对系统的理解更加深入。
本书中有丰富的代码示例,鼓励你在系统上运行这些示例的源代码。
向老师或他人请教和交流是很好的学习方式。
扫码关注【深入理解计算机系统】视频号
在本文最后做个简单的抽奖活动,本文留言的第一、第十个人,留言点赞数第一、第二名的人(点赞截止时间是今天上午 11:59 分,每个人最多获得一本),都能够得到一本《深入理解计算机系统》,你需要写写自己与本书的故事、读后感、在工作中用到过书里面的知识、面试遇到过相关的问题等等……
100 字以内就行,不用长篇大论~
没抽到的老哥就只能自己买了🤪