如何阅读《深入理解计算机系统》这本书?

如何阅读《深入理解计算机系统》这本书?

先占个坑 !2020年一月九号,今天开始撸这本书从头开始,撸完过来回答。

2020.1.10

花了一天时间看完了这本书的第一章和第二章,做完了除了一道之外的所有练习题,家庭作业和编程大作业还没做。第一章主要讲此书的整体框架,如果已经学过一些计算机系统各个部分内容的话,可以快速过一下。如果一点计算机基础没有,可以看一下,能看懂多少算多少,然后往后推,看完后面的内容再回来看一下原来不懂的部分。第二章核心就是二进制,所有的知识点都可以通过画二进制表来解决。里面讲了一些类型转换带来的程序不安全漏洞的问题,包括浮点数精度处理不足带来的导弹拦截系统错误以及火箭坠毁。原来学过一段时间火箭设计,原来还对为啥一直用很老的编程语言版本有疑惑,不过看了这部分有点理解了,对于高可靠性系统,别整太复杂的软件,否则bug太多不可控容易崩 。作为大多数程序员可以不太考虑这种问题,但是越是底层越是使用范围大的软件项目越要重视代码安全,写高可靠性代码是一门艺术呀。欢迎大佬推荐这方面书籍哈哈哈

明天继续开始看汇编做家庭作业

----------------------2020-1-12----------------------

目前在做第三章题,发现了一些错误:

1 中文版练习题3.1的习题答案应该是%rcx而不是$rcx,使用寄存器应该使用%符号

2 中文版练习题3.18题目跟英文版完全不同,习题答案印没了哈哈

此题目的中文版

英文版

所以英文版的答案也不能直接用,下面是我做的答案,在x86-64 linux反编译出来的汇编代码和中文版题目是吻合的。

C代码如下

long test11(long x, long y, long z){ long val = x + y + z; if (x < -3) { if (z > y) val = x * y; else val = y*z; } else if (x>2) val = x * z; return val;}汇编代码如下图所示:

继续撸书去了,非常建议立志未来搞计算机的小朋友们,初中二年级就可以来刷这本书了,前提稍微学习一下C语言基础就行,争取初三之前刷完,别想我都27了才看到这么好的教材,老大徒伤悲呀,汇编真的很麻烦,很多逻辑跟会高级程序语言是反的,好麻烦,我好难,我好菜

----------------

1月13号,又发现第三章中文版的错误,如下图,英文版是正确的,中文版把前三条指令的地址写错了

下图位英文版:

M1没有问题,第二条和第三条指令地址错误

中文版如下

2020-1-15终于刷完了这本书的第三章内容,汇编语言很蛋疼,一个简单的算法整成汇编实现就是一大坨,还容易错!

继续刷第四章,硬件部分,加油!

__------------------------------

2020-1-16

第四章刷了一半,刷到时序硬件设计,看不下去了,流水线也没看,这章后一半内容直接略过去了,我目前暂时不会接触到硬件部分,最多做到汇编级别优化,我原来学过eda,现代处理器设计起来太复杂了,还要做各种时序仿真,跟我目前的需求不是很吻合,就不看了,直接跳到下一章优化程序性能了!

2020-1-18号凌晨

刷完第五章优化程序性能,感觉要比前硬件部分容易很多,实在是不想搞处理器的时序分析。

这一章主要讲如何优化自己的c代码,让代码运行更快。核心是抽象数据流图,simd只是提了一嘴没细讲差评。事实上完全可以略过上一章来看这章,作者在这一章默认认为读者没看处理器,有重新讲了一下处理器的基本处理过程。幸运的是这本书作者常用的汇编指令不是太多,不会像最开始对汇编的不适应了哈哈哈

开张图,练习题目不错,跟内容联系紧密,本章最后给了一本参考书,Software Optimization for High Performance Computing: Creating Faster Applications,这本书提供了更多优化程序的例子和方法,包括在并行机器上的处理,不过有点老,白天有空去看一下啥玩意哈哈,去做家庭作业去喽

1月19号

刷完了存储器层次结构。第六章书中的内容非常简单,我不知道是因为看了前面内容积累的知识,让我提升了,还是这章本来写的就简单

言归正传,这章内容对于优化程序性能还是很重要的。几乎所有的计算机系统都是层次存储结构,这一章内容虽然简单,但是可以进一步延伸。比如说高性能计算领域,并行结构基本每个核内部都有高速缓存,分布式系统也是这样。在嵌入式端,尤其有图形或者计算机视觉ai各个方面做终端推理,计算的,对极为有限的计算资源更是需求满满,都要用到这里的基本概念。

我在参考文献中看到提了一嘴高速缓存不知晓的算法,不知道啥东西,去看一下

中文翻译也是醉了

友情提示一下,我在读到第四节,高速缓存存储器,通用的高速缓存存储器组织结构的时候,我就很好奇它那么算怎么能跟内存地址完全对应上,后面的内容的确会讲,但是先别往下看。停在这里问自己问题,如果是你,如何设计出查找,确定命中没命中,数据传输的整个过程。先别看直接映射高速缓存和后面内容,看自己能不能想出来。反正我想了一个小时没想出来,再去看后面的内容豁然开朗。我还在好奇,怎么就能保证和内存地址一一对应的关系呢,可惜没证明出来。看了后面内容,我才发现我把证明过程想复杂了,哎!

撸论文和第七章链接了

ps我在别的评论看到有的答主,在cmu求学,他们实际的课程要比书里面的难很多,好羡慕呀,真想去cmu读博士,算了我也要给每章的实验加难度,好羡慕人家能做高难度的事情 ,我还得一边学一边自己设计,查论文找需求,偶尔还得校审中文翻译的错误。

2020-1-24

链接这一章刷了好几天,但是感觉有的地方理解的还是不好。首先我觉得这本书这一章写的不是特别好,静态链接那个地方讲的有点不清楚。我看了两天,还是有点迷糊,后来报考了一下程序员的自我修养-库,链接与装载。

这本书的好处在于,链接这块讲的比较清晰,比csapp容易理解。而且csapp一些地方写的非常不好。比如说

这个结构,我一上来很诧异直接用的类型原名。实际上linux的elf.h头文件中用的是typedef之后的名字,这样更容易理解

这是源码,更容易理解一些。

所以我非常推荐看这一章之前先看一下程序员的自我修养这本书,当然自我修养也存在一些问题,比如说年代有点久远,使用的是32位的体系,不过整体上原理相近,差别不是特别大。

还有读者一章的内容,一定要使用好各种工具,来查看目标文件的结构,否则不太容易理解链接的原理

学好这一章挺重要的,记得一年前,就整一个opencv/pcl库都把我恶心的够呛,经常碰见LINK2019错误,都是看了这一章之后才明白更本质的原因,还是很有收获的,等我把这本书刷完,我再回来刷一遍这章,看能不能有新的体会!!!

本来不到三十页的内容我以为半天就能搞定,结果惨遭社会毒打,接着刷下一章去了

2020-1-27

刚刷完第八章,内容不是很多,主要将一些进程相关的内容,更系统的需要看一下面这本书

1500多页又是一本大厚书呀,哈哈哈

我用vs2019远程linux写代码,这两天踩了一堆坑,都是我环境没配好,蛋疼。。。

2020-1-30

2020年的第一个月马上就要过去了,这本书已经刷了三个星期,本打算三天刷完,无奈的推成了一个星期,又推成两个星期,马上就到第三个星期了,还剩三章,哎

第九章虚拟内存,在操作系统的书中都会讲,本身这块需要操作系统和硬件共同配合实现。我对书里面为啥这么热衷用宏函数很费解,稍微会快一点还有其他原因吗?

操作系统可以参考这三本

这三本中,我只看完了现代操作系统的半本书,还剩一半没看,内核代码也没看呢,os就是个深坑呢,不过我挺喜欢os的 。

有一个开源的动态内存分配dlmalloc,c和cpp实现都有,有空再去撸一下吧

后三章内容不多,抓紧刷吧

2020-1-31

第十章i/o讲的挺好,就是内容太少了,讲的比apue清晰,就是没人家的全,下一章下一章

2020-2-1

第十一章并不能算撸完了,最后web一点东西没看,略过去了。主要是觉得这块讲的不细致,第二是对web没啥需求,以后用到再找细致的书籍看吧

2020-2-3

最后一次更新了。

第十一章将的并发编程,多进程在超算或者分布式用的多一些,多路复用用的不多,更多是融合进入到多线程中,多线程非常重要,这部分也是编程课程不会讲的,反正我原来在大学里的c语言课程没提过,都是工作后我才接触到,被社会毒打!这一章的内容是非常重要的。