ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《深入理解计算系统》这本书到底怎样学?

2021-10-27 09:35:35  阅读:165  来源: 互联网

标签:本书 一章 程序 介绍 理解 深入 链接 虚拟内存


原文链接 :被 CSAPP 虐了

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

image-20211025202910686

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

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

image-20211025203724031

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

image-20211025225218317

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

第一部分

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

image-20211025230317641

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

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

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

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

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

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

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

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

image-20211026083152130

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

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

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

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

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

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

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

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

第二部分

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

image-20211026162805480

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

image-20211026170441694

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

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

image-20211026170730582

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

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

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

image-20211026171149888

总结

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

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

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

最后给大家推荐一下我自己的 Github https://github.com/crisxuan/bestJavaer ,里面有非常多的硬核文章,绝对会对你有帮助。

标签:本书,一章,程序,介绍,理解,深入,链接,虚拟内存
来源: https://www.cnblogs.com/cxuanBlog/p/15468986.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有