被 CSAPP 虐了!

简介: 最近几个周末去图书馆刷 CSAPP 完全停不下来啊,这种看不懂却还是强忍着痛苦硬逼着自己去看的感觉,真让我着迷。

最近几个周末去图书馆刷 CSAPP 完全停不下来啊,这种看不懂却还是强忍着痛苦硬逼着自己去看的感觉,真让我着迷。

微信图片_20220417154450.jpg

这本书从真正意义上让我体会到了什么叫做看书五分钟,休息俩小时。

不过大家可千万别学我,我相信在坐的各位绝对比我牛批,为什么?因为后面我给你推荐了一款神器,那么首先我们先来介绍一下这本书。

image.gif微信图片_20220417154455.jpg

这本书总共分成十二个章节,我给你绘制了一个思维导图,比较简单明了。

微信图片_20220417154458.jpg

第一章是提纲挈领性质的一章,从一个 hello world 程序来引出 C、引出 UNIX、Linux ,引出 C 语言程序的编译过程,引出高速缓存、系统的硬件组成、存储结构、虚拟内存、网络编程、并发编程,非常 cool。第一章的内容虽然不难理解,却是能让人涨自信心的一章,这一章能让你产生一种激动的心情,因为内容不难,但是却能够开拓你的思路,把你的知识体系串联起来。

第一部分

第二章的内容比较枯燥,我个人认为需要一定的 C 语言基础,虽然这本书的简介中说如果你有 Java 基础的话。。。。。。

微信图片_20220417154502.jpg

还是有点难顶的,所以建议学一波 C 。

别挡我,C 语言我来了,这里推荐两本 C 语言的书吧,第一本书 《C Primer Plus》 这本书是把 C 语言揉碎了手把手教你,另外《C 程序设计语言》也不错。

第二章主要讲的是计算机中数据的存储方式,基本的数据类型和各种补码、反码的表示方式。总之看这一章如果不了解 C 的话,有点昏昏欲睡(原因是可能不太懂),但实际上第二章写的很不错,当你阅读了本书的第二章之后,也许会发现,你所谓的(懂)只是你的一厢情愿而已,数值系统远没有你想象的那么简单。

第三章是程序的机器级表示,如果你把 C 学的差不多了之后(其实如果单看第二章的话,把 C 语言数据类型恶、运算恶补一下即可),那么恭喜你,接下来你要学习一下汇编了,否则你根本看不懂第三章在说什么(别问我为什么知道的,因为我也看不懂)。你可能想知道诸如 pushq、movq、call、popq、ret%rbx、%rdx 等等都是干嘛的,还有汇编是如何编写的。而且你还要懂 C 语言。

这么看来这本书根本就不是一本为初学者准备的书,也可以说是初学者的劝退书。

第四章又是一个打开新世界大门的一章,这章会直接从各种电路开始搞起,这 TM 马上就直接奔硬件了!主要讲了 Y86-64 体系、各种门电路、引出计算机流水线的设计。毕竟现代微处理器可以称得上是人类创造出的最复杂的系统之一。也会给你讲解各种指令集的区别。

与这一章节相关的书籍,可以看看《计算机组成与设计:软件/硬件接口》还有《编码》这两本书,都非常好,非常透彻。

这一章也会和你聊聊指令集架构,这些架构和宏观意义上的应用层架构不一样,非常复杂,比如下面这个 ARM 架构

微信图片_20220417154507.jpg

这本书是一个值得熟读 N 遍的一本书。

第五章:优化程序性能,现在普遍意义上提到的各种优化,不论是架构层优化、指令集优化等核心都离不开这一章所介绍的内容。优化的难点在于你需要对系统有充分理解,当然了在你做优化之前首先要保证原始程序功能正确(并且有回归测试),否则一切都是徒劳。比如你需要了解现在系统存在的性能瓶颈,才能系统性的进行优化,你才能够编写高效的程序。

编写高效程序需要做到下面这几点:

  • 选择适当的数据结构和算法。
  • 编写出编译器能够有效优化以转换成可执行代码的源代码。
  • 任务拆分,采用并行计算的方式。

第六章:存储器层次结构,这一章会向你介绍存储技术的发展,磁盘、主存、高速缓存的性能差距到底有多大,然后介绍局部性原理,一项非常强大的缓存技术。高速缓存读写是如何映射的,高速缓存不同参数的性能影响,如何编写高速缓存又好的代码,存储器山是个什么概念,以及你会见到封面的插图。

看这一章的时候强烈建议把 Ulrich Drepper 撰写的长达 114 页的经典论文 What Every Programmer Should Know About Memory 看了。

以上就是 CSAPP 的第一部分,第一部分主要介绍了程序和硬件之间的交互关系。

而第二部分则专注于程序和操作系统之间的交互关系,你会学到如何使用操作系统提供的服务来构建系统级程序。

第二部分

第七章:链接,我们使用 Linux 的时候,很多情况下会出现很多难以理解的错误,其中很多都是链接错误。链接分为静态链接和动态链接,我们写的 C 程序在执行的过程中都会经过链接阶段。

微信图片_20220417154511.jpg

除了这一章内容之外,大家也可以看一下一本把链接讲的非常透彻的一本书:《程序员的自我修养 -- 链接, 装载与库》,主要讲授代码指令是如何保存的,库文件如何与应用程序代码静态链接,应用程序如何被装载到内存中并开始运行,动态链接如何实现,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 站课程。

微信图片_20220417154517.jpg

看到这里有没有心潮澎湃的要马上学起来呢?

还有一些电子书的下载渠道:

微信图片_20220417154520.jpg

CSAPP 不管是中英版本都有一些勘误,有一些已经改正了,有一些还没改,大家可以在 http://www.yiligong.org/csapp3e/ 反馈你见到的勘误,有一些是影响阅读的,但是有一些是影响理解的。

这里给大家一个小提示,我粗略过了一遍,就拿中文版的《深入理解计算机系统》来说,大家可以看一下最开头处的印刷时间,然后针对这些勘误的提出时间进行比较,在印刷之前的很多勘误已经得到修正了。

也就是说,对于这个网站的使用方法,大家可以从后往前看。

微信图片_20220417154524.jpg

总结

上面只是我对这本书一个粗俗的理解,书我还没看完,不过我已经有相关 C 语言、汇编语言的学习计划了,另外,知乎上有一个对 《如何阅读深入浅出计算机系统》 的一个总结性回答,https://www.zhihu.com/question/20402534/answer/1670374116 我认为还是非常好的。

这个回答里面有练习题的答案,还有学习这本书需要的前置知识,这个回答给我的感觉是答主已经刷过几遍了,作为过来人的经验还是值得学习的。

最最最重要的就是做实验,你可以在 http://csapp.cs.cmu.edu/3e/labs.html 上找到 csapp 的所有实验。

相关文章
|
C语言
【蓝桥杯刷题】盗版Huybery系列之手抓饼赛马
【蓝桥杯刷题】盗版Huybery系列之手抓饼赛马
111 0
|
8月前
|
机器学习/深度学习 存储 算法
献给阿尔吉侬的花束
献给阿尔吉侬的花束
74 0
|
定位技术
1256:献给阿尔吉侬的花束 2021-01-09
1256:献给阿尔吉侬的花束 2021-01-09
105 0
|
机器学习/深度学习 算法 测试技术
面试官在“逗”你系列:到底应该怎么爬楼梯?! | 牛气冲天新年征文
算法题是在面试过程中考察候选人逻辑思维能力、手写代码能力的一种方式,因为有一句古话说的好:“说一千道一万,不如写段代码看一看”。今天我们就来个单刀直入,直奔主题,从一个真实面试题到底怎么爬楼梯来聊一聊算法中的动态规划 。
212 0
|
程序员 网络架构
过年回家,程序猿最怕的5件事
时间过得真快啊,一月接一月,一年又一年。程序猿工作繁忙,每天游离于代码之间,似乎已经忘记了时间的流淌。
过年回家,程序猿最怕的5件事
|
弹性计算 程序员 区块链
这群程序员疯了!他们想成为IT界最会带货的男人!
随着网红主播越来越火,通过直播带货种草的形式也成了今年双12的热点。 不过,网红主播带货早已见怪不怪,但你们见过程序员直播带货吗!?近日,趁着阿里云双12年末采购节,阿里云邀请了一波程序员GG来为大家直播带货!
|
算法 大数据
阿里的攻城狮和程序媛用算法给骗子“画个像”
最近,阿里巴巴安全部算法团队裕宏与钱盾团队梅黛共同产出的恶意电话识别论文“DeMalC: A Feature-rich Machine Learning Framework for Malicious Call Detection” 被信息检索、知识管理和数据库领域中的顶级ACM会议CIKM 2017收录。
5697 0
一碗鸡汤
一、要成为自己的专家 1、找到自己的独特性——《发现自己的优势2.0》 2、弄清楚让我们做出决定的根本原因(是为了亲人、朋友还是为了成就感) 3、经验(定期反省自己什么做对了,什么做错了,有没有更对的经验可循)   人做不成事有两个原因:第一,他对自己说他不行;第二,别人说他不行。
912 0