无论是要打牢计算机基础还是准备校招面试,这本书你不可错过!

本文详细介绍了《深入理解计算机系统》这本书的内容概要和阅读体验,强调了它作为程序员了解系统知识的重要价值。书中涵盖了从二进制、汇编、程序的机器级表示到存储器体系、链接、异常控制流等多个关键概念,并通过配套实验深化理解。作者分享了自己的学习历程,建议根据前置知识选择合适的学习路径,无论是系统性阅读还是按需查阅,都能从中受益。这本书对于提升程序员的底层知识和技能非常有帮助。
摘要由CSDN通过智能技术生成

导读:是一本非常适合程序员初步了解 System 知识的好书!不管你是前端、后端还是算法,csapp上的内容都算是基本功。

文章首发于编程指北

看标题,大家应该知道我今天的主题了。

是的,《深入理解计算机系统》

这本书我还算比较熟悉,算是完整的看过一遍,部分章节看过两三遍,有些是校招准备面试的时候看看,真的挺合适的。

而这本书也被誉为计算机届的神书,豆瓣评分也是接近10分,个人感觉是一本非常适合程序员初步了解 System 知识的好书。

现在基本搬家都带着:

CSAPP 全称 Computer Systems A Programmer's perspective,中文书名是《深入理解计算机系统》。

这本书可能叫做“程序员需要了解的计算机知识”更为恰当一点。

先看下这本书我们能学到啥?

然后聊聊我看这本书的历程

最后说说我推荐的阅读方式~

首先是关于这本书

其实它的简介和第一章《计算机系统漫游》已经写得非常清楚了:

从一个简单的hello world程序在计算机上的执行过程:

预处理->编译->汇编->链接->可执行文件->装载->数据流->屏幕输出显示

汇总成一句:信息 = 位+上下文。

豆瓣上figure9的书评很到位:

  • 第二章是关于二进制的,这部分内容会在数字逻辑这类课里学到,都比较熟悉,但是csapp里确实我见过关于进制讲得最透彻的书,不像其它书都是一句话让你背取反+1。

  • 这章的里有不少关于二进制的技巧,做一遍作业对于二进制的各种操作绝对会比较熟悉,最经典的就是不用临时变量交换两个数。话说回来,真要想在二进制上玩出花来,参考Hacker's delight会有更大的惊喜。

  • 程序的机器级表示这一章偶花了不少时间阅读,毕竟偶没学过汇编,基础基本为0。不过这本书里出现的汇编指令绝大多数都由运算、取数存数、跳转这三种指令所组成,所以在阅读上不会存在任何难度。

  • 这部分融合了程序员所需了解的编译和汇编这两样课程中的基础知识:想知道for、do..while、while三种循环的实质性区别?想知道多重if和 switch的本质区别?想知道数组的存储方式?想知道数组下标读取和指针读取的区别?想知道递归过程调用的背后实现机理?看看这一章,相信你会对C语言乃至程序设计语言有更深的理解。

  • 指令集&体系结构这一章,两位作者为了让读者更好的理解指令集(X86),别具一格的搞出了一个简化版的Y86指令集,并用其表示基本的运算和控制,甚至连数字电路的HCL都来了一笔(暴汗)。数据流、组合逻辑和流水线,图示+详细的讲解,一目了然。国内的计组教科书应该多借鉴一下。

  • 程序性能优化这一章对程序员尤其实用,毕竟,正如TDD和XP的开创者Kent Beck所说,make it run, make it right, make it fast。而第三步又是最麻烦的一步,确认和消除性能的瓶颈,有时比Debug还要恐怖,所以Knuth大神说:Premature optimization is the source of evil。

  • 存储器体系结构的内容用五个字概括就是:利用局部性。只有了解了计算机的梯形存储器体系结构,才能体会到为什么同样逻辑的程序会产生如此之大的性能差距,虽然计算机设计者的初衷是把存储器当成一个巨型数组。然而这个大号数组的不同体位的差距还是非常大地,搞不好就郁闷鸟。

  • 链接这部分内容篇幅不多,原理上讲的很简洁,文件节和符号解析表只是给出了几个图示,并没有过多的关注其实现。CSAPP把重点放在了链接对源代码产生的影响,同时也让偶再次理解到了全局变量很邪恶。动态链接部分让偶恍然大悟,.net里面的反射和程序集,放到C里面就是动态调用和共享库,都是相通的,无非C的代码更诡异一些。

  • 异常控制流这一章的名字比较囧,以至于我刚开始认为它会介绍点诸如try...catch的异常处理机制。然而看了才明白,它介绍的是更为广义的exception,既包括硬件中断,也包括故障中断,比如说陷入(trap)和故障(fault)。这一章做的比较绝的是,通过讲述异常流,引入了OS中最核心的概念:进程。然而它并不在进程的具体特性上下文章,而是通过讲述unix下进程相关的api 及使用,从一种程序员的角度告诉你,进程是这么用的,进程之间是这么交换信息的。到最后捎带介绍了一下C里面的非局部跳转(更加强大的Goto,也就是 setjmp和longjmp),别以为只有C++和Java才有异常处理机制,C一样可以做到。

  • 程序的时间度量这一章感觉用处不大,扫过。

  • 虚拟内存这一章从原理和实现两个不同的层面介绍了存储器体系结构的核心部分:VM。说实话,之前学习VM顶多就是冲着局部性去的,但没想到VM可以做的事有这么多,无论是存储器磁盘映射,还是malloc在磁盘上分配空间返回地址至PTE,都让偶对VM有了一个崭新的认识,原来VM还可以这么用。为了帮助读者深入理解内存的分配机制,作者甚至搞出了一个malloc的实现,从源代码来讲解内存分配、碎片合并、垃圾回收这些概念,帅气。

  • 系统级IO,网络编程以及并发编程这些东西是我比较喜欢的内容,这部分包括了 malloc lab、proxy等

当然,要想深入学习的话,好书有的是,OS 有Tanenbaum 老爷子的 Modern operating systems,计组有Stanford校长的量化研究和软/硬接口,编译自然就是Aho的龙书,链接可以参考Levine的 Linkers&Loaders,程序设计语言原理可以阅读Scott的Programming language pragmatics。

其次是自己看这本书的历程

这本书是在大一逛知乎听大佬们说起的,大一暑假有大四学长学姐在学校广场摆摊卖书,我也买了些,其中有一本就是被称为计算机专业神书的 CSAPP。

大二时,在上一些无聊的课时,我总把这本书带着,每节课可能会翻个几页,那时候看到里面的汇编、内存管理、存储器层次我是真的云里雾里,因为还没学操作系统,C 语言也学得很差。

所以断断续续的看了几章,说不上学到了什么,但让我对这种枯燥的基础知识第一次产生了兴趣,有一种想彻底搞懂它们的想法。

后来在知乎大佬的指引下,为了看懂这本书,去看了王爽那本《汇编语言》。

重学了 C 语言(主要是指针和内存),由于已经学了汇编,指针对我再也不是问题了。

同时,在大二、大三上陆续学习了操作系统、计算机组成原理、数字逻辑等,其实熟悉的同学就知道,这已经涵盖了csapp书里的绝大部分内容。

值得一提的是,大三我们学院有门 System Programing 的课,教材就是使用的 CSAPP,因此我之前大二草草看完的书,得以再次翻开,这一次我把附带的是个实验也挨着挨着做了,收获良多,有位运算各种奇技淫巧,有 Bomb lab 刺激的打怪通关、也知道了buffer overflow attack.... 还有实现基本的内存管理等等。

印象最深的便是做 bomb lab,一个个 phase 的通过真的很让人兴奋,我几乎是熬夜连着把这几个 phase 过掉的,当然头发也没少掉。

当时还在简书写了个万字长文记录:

CSAPP--配套实验(Bomblab)记录

其它个人觉得比较有意思的lab有:

Malloc Lab:实现一个类似C语言的malloc函数,主要学习内存管理

Proxy Lab:http server,学习linux下网络编程和多线程编程,锁、条件变量等

Attack Lab:缓存区溢出攻击,主要学习Linux下函数调用过程和堆栈等

最后就是如何去阅读呢?

读一本书,尤其是专业技术类,决定你能否看下去的一个重要因素就是你是否具备前置知识。

总不能高中数学都没学就想去看高数吧。

那这本书的前置知识,我认为你需要具备一些 C 语言知识、以及系统知识,比如 Unix、Linux基本操作,有 C 语言背景最好,如果完全没学过 C 的话,那么前几章看起来会比较吃力。

这本书有我个人认为有两种打开方式:

  •  第一种是学习过操作系统、计算机组成等,所以看起来应该不存在很大的难度,从头到尾一章章啃,看完一章一定要做一些课后的作业和配套的lab,lab可以算这本书的精华之一了。

  • 第二种是按需学习,之前说过,这本书涵盖了计算机学科主要的知识,将整个线串起来了,所以在这里面你能找到链接&加载,也能找到内存管理、还有语言的机器级表示汇编等,所以当你学习内存管理时你就去看看第九章虚拟内纯,学到C&C++编译链接时,可以去看看第七章链接,学习到存储的时候,可以去看看第六章存储器层次结构。

是的,每一章都是比较独立的,因此你完全可以跳着挑自己感兴趣的去学习

资源

配套的lab:http://csapp.cs.cmu.edu/3e/labs.html

为什么我推荐程序员都去看看?

这本书本身包含的内容其实都是在数字逻辑、操作系统、网络、体系结构等课程中学过的。

但是这本书创造性的把OS,计算机组成结构,数字电路,以及编译原理这些计算机基础学科中的核心概念汇集在一起。

从而覆盖了指令集、汇编、代码优化、存储体系、链接、加载、进程以及虚拟内存这些程序员所必须了解的关键 CS 系统知识

如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍,阅读 深入理解计算机系统是最有效率的方式。这就是推荐的原因。

这本书里的内容其实就是大家经常说的底层知识/内功。

而我们国内大部分学校都是不注重系统知识的培养的,只有少数 985 高校有开设系统编程课程。

这本书最精华的还有它的配套实验,墙裂建议大家看书的时候一起干掉,实现shell、缓存优化、缓冲区溢出攻击...... 每一个实验都有助于你理解系统原理。

前两天,总理有个视频传播得挺火的,视频的内容是:

“讲到这里,我想对青年学生们说几句话,不管你们将来从事什么职业、有什么样的志向,一定要注意加强基础知识学习,打牢基本功和培育创新能力是并行不悖的,树高千尺,营养还在根部。把基础打牢了,将来就可以触类旁通,行行都可以写出精彩。”

我想这在 CS 领域也是适用的,不管你是前端、后端还是算法,csapp上的内容都算是基本功。

书籍购买

最后,如果你想购买这本书的话,欢迎点击下方链接,中英文版本都有,任你挑选:

 

 


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 4月书讯 | 好书和最美四月天一起来了...

资讯 | DB-Engines 4月数据库排名:Redis有望甩掉“千年老七”?

书单 | 8本书助你零基础转行数据分析岗

干货 | 什么是架构?网络架构中都有什么?终于有人讲明白了

收藏 | 终于有人把Scrapy爬虫框架讲明白了

上新 | 河马书来了!线上实验领域的“圣经”火热预售中

点击阅读全文查看更多好书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值