最近几个周末去图书馆刷 CSAPP 完全停不下来啊,这种看不懂却还是强忍着痛苦硬逼着自己去看的感觉,真让我着迷。
这本书从真正意义上让我体会到了什么叫做看书五分钟,休息俩小时。
不过大家可千万别学我,我相信在坐的各位绝对比我牛批,为什么?因为后面我给你推荐了一款神器,那么首先我们先来介绍一下这本书。
这本书总共分成十二个章节,我给你绘制了一个思维导图,比较简单明了。
第一章是提纲挈领性质的一章,从一个 hello world 程序来引出 C、引出 UNIX、Linux ,引出 C 语言程序的编译过程,引出高速缓存、系统的硬件组成、存储结构、虚拟内存、网络编程、并发编程,非常 cool。第一章的内容虽然不难理解,却是能让人涨自信心的一章,这一章能让你产生一种激动的心情,因为内容不难,但是却能够开拓你的思路,把你的知识体系串联起来。
第二章的内容比较枯燥,我个人认为需要一定的 C 语言基础,虽然这本书的简介中说如果你有 Java 基础的话。。。。。。
还是有点难顶的,所以建议学一波 C 。
别挡我,C 语言我来了,这里推荐两本 C 语言的书吧,第一本书 《C Primer Plus》 这本书是把 C 语言揉碎了手把手教你,另外《C 程序设计语言》也不错。
第二章主要讲的是计算机中数据的存储方式,基本的数据类型和各种补码、反码的表示方式。总之看这一章如果不了解 C 的话,有点昏昏欲睡(原因是可能不太懂),但实际上第二章写的很不错,当你阅读了本书的第二章之后,也许会发现,你所谓的(懂)只是你的一厢情愿而已,数值系统远没有你想象的那么简单。
第三章是程序的机器级表示,如果你把 C 学的差不多了之后(其实如果单看第二章的话,把 C 语言数据类型恶、运算恶补一下即可),那么恭喜你,接下来你要学习一下汇编
了,否则你根本看不懂第三章在说什么(别问我为什么知道的,因为我也看不懂)。你可能想知道诸如 pushq、movq、call、popq、ret、%rbx、%rdx 等等都是干嘛的,还有汇编是如何编写的。而且你还要懂 C 语言。
这么看来这本书根本就不是一本为初学者准备的书,也可以说是初学者的劝退书。
第四章又是一个打开新世界大门的一章,这章会直接从各种电路开始搞起,这 TM 马上就直接奔硬件了!主要讲了 Y86-64 体系、各种门电路、引出计算机流水线的设计。毕竟现代微处理器可以称得上是人类创造出的最复杂的系统之一。也会给你讲解各种指令集的区别。
与这一章节相关的书籍,可以看看《计算机组成与设计:软件/硬件接口》还有《编码》这两本书,都非常好,非常透彻。
这一章也会和你聊聊指令集架构,这些架构和宏观意义上的应用层架构不一样,非常复杂,比如下面这个 ARM 架构
这本书是一个值得熟读 N 遍的一本书。
第五章:优化程序性能,现在普遍意义上提到的各种优化,不论是架构层优化、指令集优化等核心都离不开这一章所介绍的内容。优化的难点在于你需要对系统有充分理解,当然了在你做优化之前首先要保证原始程序功能正确(并且有回归测试),否则一切都是徒劳。比如你需要了解现在系统存在的性能瓶颈,才能系统性的进行优化,你才能够编写高效的程序。
编写高效程序需要做到下面这几点:
选择适当的数据结构和算法。
编写出编译器能够有效优化以转换成可执行代码的源代码。
任务拆分,采用并行计算的方式。
第六章:存储器层次结构,这一章会向你介绍存储技术的发展,磁盘、主存、高速缓存的性能差距到底有多大,然后介绍局部性原理,一项非常强大的缓存技术。高速缓存读写是如何映射的,高速缓存不同参数的性能影响,如何编写高速缓存又好的代码,存储器山是个什么概念,以及你会见到封面的插图。
看这一章的时候强烈建议把 Ulrich Drepper 撰写的长达 114 页的经典论文 What Every Programmer Should Know About Memory 看了。
以上就是 CSAPP 的第一部分,第一部分主要介绍了程序和硬件之间的交互关系。
而第二部分则专注于程序和操作系统之间的交互关系,你会学到如何使用操作系统提供的服务来构建系统级程序。
第七章:链接,我们使用 Linux 的时候,很多情况下会出现很多难以理解的错误,其中很多都是链接错误。链接分为静态链接和动态链接,我们写的 C 程序在执行的过程中都会经过链接阶段。
除了这一章内容之外,大家也可以看一下一本把链接讲的非常透彻的一本书:《程序员的自我修养 -- 链接, 装载与库》,主要讲授代码指令是如何保存的,库文件如何与应用程序代码静态链接,应用程序如何被装载到内存中并开始运行,动态链接如何实现,C/C++运行库的工作原理,以及操作系统提供的系统服务是如何被调用的。非常好的一本国产书。
第八章:异常控制流,世界上不会存在完美运行的程序,任何程序都会出错,这些错误可能是线程执行过程中出错、可能是系统调用异常、页面映射错误等等。这一章会向你介绍各种异常出现之后,操作系统是如何处理的。
第九章:虚拟内存,虚拟内存其实是存储器层次结构的衍生,至于为什么单独拿一章来说,因为虚拟内存太重要了。这一章会向你介绍为什么我们的计算机内存只有 8G(或其他)却能够运行自身数倍以上的程序。虚拟内存有的时候也是面试官比较爱问的一个点:虚拟内存是如何映射的,什么是页框、页表诸如此类。
第三部分主要介绍程序间的相互通信,主要包括 IO、网络编程和并发编程。
IO 这部分介绍类 Unix 系统下的 I/O 读写,主要介绍系统层面的 I/O 接口。
今天互联网中的大千世界都立足于 TCP/IP 协议之上,Socket 甚至已经成为了网络编程的同义词。这部分主要向你介绍了网络的变迁,什么客户端-服务器编程模型、Web 服务器,最后再带你写一个 Web 服务器。
网络这部分内容远比这一章节介绍的复杂,网络这部分内容给大家推荐几本书:《计算机网络:自顶向下方法》、《TCP/IP 详解》,《UNIX 网络编程》。
你一定要知道的是 W. Richard Stevens,他的个人网站 http://www.kohala.com/start/
并发这一章节主要介绍了 C 中如何编写并发程序,如何榨干 CPU ,让其发挥峰值性能。
读 csapp 这本书还是需要一定基础的,而且读起来不是那么容易(起码对于我来说是这样的)。
不过,业界还是有一些好资源,能让你更快的深入这本书。
给大家推荐一个网站,https://fengmuzi2003.gitbook.io/csapp3e/
这个网站可以理解为是 CSAPP 的导读网站,对每一章都进行了介绍,而且推荐了一些不错的资源。
比如他分享的深入理解计算机系统的 B 站课程。
看到这里有没有心潮澎湃的要马上学起来呢?
还有一些电子书的下载渠道:
CSAPP 不管是中英版本都有一些勘误,有一些已经改正了,有一些还没改,大家可以在 http://www.yiligong.org/csapp3e/ 反馈你见到的勘误,有一些是影响阅读的,但是有一些是影响理解的。
这里给大家一个小提示,我粗略过了一遍,就拿中文版的《深入理解计算机系统》来说,大家可以看一下最开头处的印刷时间,然后针对这些勘误的提出时间进行比较,在印刷之前的很多勘误已经得到修正了。
也就是说,对于这个网站的使用方法,大家可以从后往前看。
上面只是我对这本书一个粗俗的理解,书我还没看完,不过我已经有相关 C 语言、汇编语言的学习计划了,另外,知乎上有一个对 《如何阅读深入浅出计算机系统》 的一个总结性回答,https://www.zhihu.com/question/20402534/answer/1670374116 我认为还是非常好的。
这个回答里面有练习题的答案,还有学习这本书需要的前置知识,这个回答给我的感觉是答主已经刷过几遍了,作为过来人的经验还是值得学习的。
最最最重要的就是做实验,你可以在 http://csapp.cs.cmu.edu/3e/labs.html 上找到 csapp 的所有实验。