当前位置: 华文问答 > 数码

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

2013-05-27数码

先占个坑 !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语言课程没提过,都是工作后我才接触到,被社会毒打!这一章的内容是非常重要的。

最后面要做一个多线程的服务器,把大量前面学的知识结合在一起,还是挺好的训练,有空应该做一下。并发,多核编程这块还有基本参考书

第一本

将posix多线程库并发编程的,不过有点老了,C++标准库都支持多线程了哈哈

第二本

也是多线程编程的

第三本

讲并行编程的

全书都读完了,做一个总结吧!这本书很基础,如果一个程序员把这本书拿过来翻一番,发现大量不理解的地方,实际上都应该读一下这本书,实际上这本书是大学里里面给大一学生看的,所以不用担心难度问题,不会大,尤其对于转行过来的,既然是转行就要做的比科班更好,学的更多,技术更强,否则转过来受虐干啥。而且对于转行过来工作的人群,看这本书如果都费劲,意味着不会在社会上coding方面获得高级职位。

对于我自己,只是感叹自己的水平太差劲,基础不好,都看了恩多后续课程,依然花了三个多星期才啃完,家庭作业也没全部做完,大部分家庭作业也不难,编程实验代码量还是有了,完整撸下来上万行代码量是没得跑的。都是基础训练,也感叹自己不能拿出好的学习状态,遇到自己不熟悉的领域,激情和效率下降明显,还有就是很多参考文献没在读这本过程中读完,如果能把重要的参考文献在这过程中也能过一遍,一定收获更多,不过目前我的收获也是很大的,只不过没达到期望的收益率,投入时间太多了。

总结完自己,也对读者给一些过来人的建议吧,我分为几类讨论:

科班在学的大学生

这部分人,跟着老师学习就好,国内好一点的计算机学校哈工大,北邮等及以上,这些学校的青年教师的水平都是有保证的,有一些年轻有为的老师在讲授这门课的过程中,可能还会做课程创新,加入更多新的知识进来,所以跟紧这样的老师就好,如果是大佬,肯定会做的比老师讲的快。这部分同学在学习中遇到一些难以理解的问题都很正常,因为之前没接触过嘛,踏踏实实的研究学习就是,没啥好着急的。

转行的工作人员

如果自己基础比较好,后续课程都学了,而且在工作中应用起来了,其实这本书可以看看,查缺补漏,形成完整的知识体系,快速扫过,只在自己新的知识上花点时间,一两个星期妥妥的,别像我这么菜鸡

如果转行过来工作,看这本大部分内容还费劲,抓紧补,要比上一类人投入多倍的精力,集中刷,别拖个七八个月,学生无所谓,但是工作的人,时间非常紧张,更要更有效率。而且刷完会让你的工作技能更专业,用业余时间刷不要超过两个月,战线拖的太长,就看不下去了,但是也要保证好质量,这本书比较人性化的地方就是习题安排和知识点契合比较好,做题卡壳,基本就是知识点没有掌握,抓紧回去温习巩固,也不要把这本是想的过于神化,把它踩在脚底下才能让你站得更高

小学生,初中生,高中生

我估计会有一部分这个年龄段的小朋友会看到我的回答。我认为这些孩子是希望,如果是由于对计算机感兴趣,想去更好理解计算机,可以来看这本书的,在你们这个年龄阶段,如果做好引导,加上兴趣的精神加成,是可以读懂这本书的核心知识点的,除非极为天赋异禀,否则需要旁边有人带一带。时间下半年到一年,因人而异。如果有成人辅导这些孩子,尤其对于小学生和初中生,因为整体的知识体系孩子还没有建立起来,要有耐心,量不要太大,根据孩子接受程度调整好速度,别为了灌输,把孩子的兴趣浇灭了。对于高中生,我觉得没啥问题,我上高一就在自学大学课程了,大量的清华报送生也是这么干的,不过我是菜鸡,没法跟大神比,要是学起来有困难,可以找老师问一问,或者上网自己解决。国内每个省前几的好中学,都配有相应方面的教师,辅导起来没太大问题,现在的中学老师都是研究生起步,没有压力的。如果学校没那么好,教育不公平,我也没办法,自己上网,自己能打到哪里算哪里吧,就像我,只能感叹自己的无能。

这个问题的回到就不在更新了,欢迎大佬批评指正