当前位置: 首页 > news >正文

被 CSAPP 虐了!

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

cafe7a09c94f8da35f8ad5d67d7ce535.png

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

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

0019bb433cba0543799f6ec1aee93f96.png

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

f725098765d35cbdc65dd82e183f33bb.png

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

第一部分

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

bbc58d03996da547d5a28ed0271e3be2.png

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

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

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

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

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

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

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

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

363a704b02622d9bcc8b26281def9230.png

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

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

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

  • 选择适当的数据结构和算法。

  • 编写出编译器能够有效优化以转换成可执行代码的源代码。

  • 任务拆分,采用并行计算的方式。

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

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

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

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

第二部分

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

45cb5844866cd495630e82ae53c5492b.png

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

f04a7b75df740be8d0eede4beae0cb0a.png

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

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

d1643f43066747666b12177d3ec40638.png

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

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

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

4b416fb1658f1c87f67512fc6f8455fc.png

总结

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

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

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

97789304b489caeae5a40f9f707c4b81.gif

e7e6e0427532b98721de634cb9bc4c8e.png

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

每天来听华章哥讲书

e6e894633a0da6521db07b0012ac69df.gif

更多精彩回顾

书讯 | 11月书讯(上)| 拿下这些新书,赢在起跑线

书讯 | 11月书讯(下) | 拿下这些新书,赢在起跑线

资讯 | 什么是ETL?一文掌握ETL设计过程

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

干货 | 一文读懂逻辑门

收藏 | 盘点云原生的5大特征

上新 | 【新书速递】产品经理应该知道的72件事

赠书 | 数据大牛都在啃的15本书

c98bf3e7252bce69c7dee5f073e3d069.gif

300df7caac5ca66aff55b91a1fef0c7e.gif

点击阅读全文购买

相关文章:

  • 7张图揭晓RocketMQ存储设计的精髓
  • 看漫画来告诉你:什么是 “元宇宙” ?
  • 【第80期】浅谈如何成为技术一号位?
  • SpringBoot 实战:加载和读取资源文件内容
  • 终于有人把云计算与数据库的关系讲明白了
  • 为什么 Rust 是编程的未来?
  • 四种代码洁癖类型,程序员看了直呼内行
  • JavaScript成最受欢迎的编程语言,社区规模近 1650 万
  • 微软不会放弃Electron:Electron 快速入门及IPC 通信
  • 什么是边缘计算?它是怎样火起来的?终于有人讲明白了
  • 进阶必看的 RocketMQ ,就这篇了
  • 深度解析用户画像标签体系构建方法
  • 【第81期】4道题测试一下,你适不适合做产品经理
  • 【新书速递】你不知道的LevelDB
  • 手把手教你写一个迷你 Webpack
  • #Java异常处理
  • Akka系列(七):Actor持久化之Akka persistence
  • GraphQL学习过程应该是这样的
  • JAVA 学习IO流
  • java多线程
  • JS基础之数据类型、对象、原型、原型链、继承
  • leetcode98. Validate Binary Search Tree
  • Sublime Text 2/3 绑定Eclipse快捷键
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 飞驰在Mesos的涡轮引擎上
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前嗅ForeSpider采集配置界面介绍
  • 一起参Ember.js讨论、问答社区。
  • 原生js练习题---第五课
  • 最近的计划
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 透过事物看本质的能力怎么培养?
  • #AngularJS#$sce.trustAsResourceUrl
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (06)金属布线——为半导体注入生命的连接
  • (6)添加vue-cookie
  • (C++)八皇后问题
  • (k8s中)docker netty OOM问题记录
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)mysql_MYSQL(三)
  • (四) 虚拟摄像头vivi体验
  • ... 是什么 ?... 有什么用处?
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Remoting学习笔记(三)信道
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器