别人对CSAPP的阅读理解

重点性正文:

在阅读的过程中,我对该书的各个章节做了一些标注,以备将来重新翻阅的时候参考。这些标注主要从两个角度进行,一是对我找工作应试(包括笔试和面试)有没有用,二是对我自身的技术提高有没有用,所以分为应试和修炼两个指标,参照流行的打分标准将其分为从★到★★★★★五个等级。

在找工作顺利结束之后,我又回顾了一下之前的标注,结合自己的笔试、面试经历,重新修订了一下。其中应试指标的评分主要是以我的求职目标(互联网行业偏算法的软件工程师)为参照,和其他职位的要求会有些出入。

第一章 计算机系统漫游 A Tour of Computer System

本章对计算机系统做了一个总体的介绍,用简单明了的语言概括了一些后续章节将要重点展开的概念。

应试 ★★:在笔试中可能会碰到一些整体上的概念题。

修炼 ★:属于计算机最基本的概念。

第二章 信息的表示和处理 Representing and Manipulating Information

本章介绍了信息在计算机中的表示形式,重点讲述整数和浮点数的表示形式。

应试 ★:应试中很少会考到。

修炼 ★★★:有很多人可能写了多年的代码都不知道浮点数是如何用那4(8)个字节存储的,不知道其实表达式(x-y<0)并不能替代(x<y)。< p="">

第三章 程序的机器级表示 Machine-Level Representation of Program
本章其实就是汇编语言课程的复习。

应试:重要程度依赖于求职目标,如果是和我一样偏算法的工程师,汇编语言是不会考到的。

修炼 ★★★★★:理解汇编语言和寄存器结构是后面很多内容的基础。

第四章 处理器体系结构 Processor Architecture

本章其实就是计算机体系结构课程的内容。主要介绍的内容有处理器结构,各种逻辑门、功能单元,指令集;指令的执行,指令执行的流水线等。

应试 ★: 对于软件相关职位来说,很少会考到这么底层的东西的。

修炼 ★★★: 对于从事软件层面的技术人员来说,不用深入,但是也应该理解,知道是怎么回事。

第五章 优化程序性能 Optimizing Program Performance

本章讲述如何优化程序的执行效率,包括代码的优化,编译器的优化,以及CPU级别的优化。

5.1-5.6节 主要介绍了几种能有效提高代码性能的方法。

应试 ★★★★: 经常会有一些让你寻找程序瑕疵的问题,如果你能看出代码在哪些细节上可以优化,必定能加分不少。

修炼 ★★★★★: 你当然需要知道编译器在什么层面上能自动帮你优化代码,在编译器无法优化时你自己又如何在小细节上进行优化。

5.7节以后 主要介绍了CPU级别的优化,微指令的概念,功能单元上微指令的并行,程序分支的预测等。

应试 ★: 对于软件相关职位来说,基本不会考这些东西的。

修炼 ★★★: 不用深入,但是应该知道并能够理解。

第六章 存储器层次结构 The Memory Hierarchy

本章详细介绍了计算机系统中的存储结构。

6.1 介绍了不同种类的存储设备以及对应的存取数据的方式。

应试和修炼 ★: 很少会考到,了解一下即可。

6.2-6.7 介绍了存储设备的组织形式,着重介绍了Cache及其工作方式,程序是如何和cache打交道的,不同的循环嵌套顺序、遍历方向等对cache命中的影响。

应试 ★★★★: 在面试中,经常会考到跟cache相关的题目;修改循环嵌套顺序以提高cache命中率也是一些程序改错题的高级玩法。

修炼 ★★★★: 存储结构和cache是计算机中很基础也很重要的概念。

第七章 链接 Linking

顾名思义,本章详细讲解了程序的链接过程,主要分为静态链接和动态链接,以及链接过程中使用到的技术如符号解析、重定位等。

应试 ★★:知道一些基本概念即可。

修炼 ★★★★★:一个软件工程师应该懂得自己写出来的程序是怎么成为一个可执行文件的,有的时候,你很可能会被一个链接错误折磨好几天。

第八章 异常控制流 Exceptional Control Flow

顾名思义,本章主要讲解异常控制,不过这里的“异常”并不是Java或者C++里狭义的异常,而是一个广义的“Exceptions”的概念,包括中断(Interrupt),陷阱(Trap),错误(Falut),中止(Abort)等。本章同时引入了进程的概念,介绍了进程级别的 Exception:信号(signal)以及操作系统处理这个异常的手段--上下文切换(context switch)。

应试 ★★: 主要掌握进程的概念即可。

修炼 ★★★: 知道异常控制流是怎么回事,用户程序和系统交互(如系统调用)的原理和方式即可,不用太深入。

第九章 虚拟存储器 Virtual Memory

非常重要的一章,虚拟存储机制是计算机实现多任务的一项重要技术。计算机正是通过时间片技术使得每个进程在执行时仿佛独占CPU,进而又通过虚拟存储机制使得每一个进程在执行时仿佛独占内存。

第十章 系统级I/O System-Level I/O

介绍类Unix系统下的I/O读写,主要介绍系统层面的I/O接口。由于我们日常编程所用的I/O接口都是各种高级语言提供的经过封装的标准接口,故而如果不进行底层开发的话这部分知识不是必须的,我便跳过没读。

应试 ★★★★★: 本章内容是操作系统课程的重点内容,如果考操作系统,几乎肯定会考到;10.11节的知识也能帮你应对一些程序挑错题。

修炼 ★★★★★: 操作系统中重要的基础内容,即使你只使用Java这样的高级编程语言,至少也应该弄懂垃圾回收机制吧。

10.1介绍了虚拟地址和物理地址,CPU进行寻址操作产生的是虚拟地址,通过存储管理单元(memory management unit)转换为实际的物理内存地址。

10.3~10.5讲述了虚拟存储机制的优点:使得内存可以作为硬盘的cache;能够更方便的管理内存;能更好的提供内存保护机制。

10.6 介绍了虚拟地址如何转换为物理地址。

10.7 很精彩的一节,通过Intel Pentium和Linux的实例讲述了整个存储管理机制。记得以前上操作系统课的时候,各种理论、机制学了一大堆,但就是不知道实际的操作系统到底用的哪套方法,而本节内容正是通过实例让你对刚学的理论机制有一个直观的了解。

10.8~10.10 讲述了存储映射(Memory Mapping)、动态内存分配和垃圾回收机制。

10.11 很实用的一节,列举了一些C编程中容易犯的内存引用错误。


第十一章 网络编程 Network Progranmming

本章简单介绍了网络模型,TCP/IP协议,类Unix系统的socket接口等。

应试和修炼 ★★: 因为篇幅限制,本章只做了简单讲解,要掌握网络编程知识还需要参考专门的网络技术书籍。

第十二章 并发编程 Concurrent Programming

应试 ★★: 除应聘相关职位外,并发编程考的比较少,不过需要清楚锁机制和信号量机制等。

修炼 ★★★: 多线程程序在现今的开发中还是很常见的,但是本章介绍的比较简单,需要参考另外专门的书籍。

本章简单介绍了并发程序设计的内容,主要包括:

1.进程级别的并发,各子进程拥有不同的虚拟地址空间,需要IPC(InterProcess Communication)机制共享数据,切换开销大。

2.I/O复用,事件驱动,单进程运行,共享虚拟地址空间,并发效果不理想。

3.线程,介于上述两种中间,各子线程共享进程的虚拟地址空间,切换开销较小。

另外介绍了并发编程中访问共享变量的信号量机制,并给出了4类容易引起线程不安全的函数。


总的来说,我觉得这本书很适合在找工作之前读一读,因为从网上流传的各种笔试和面试题中,我们就能看出各大IT公司在招聘工程师的时候是很看重基础知识的,而对于像我这样上了三年研究生的同学来说,很多知识由于长时间没用早就忘了,所以需再要再复习一下。但是我们可能没有时间按照课程一门一门地去复习,即使一门一门去看了,也不一定能把知识都联系起来,而这本书正好提供了这样一个视角,从程序员的角度把计算机专业最重要的基础知识都串了起来,形成了一个完整的计算机系统的概念。

作者感受

对《深入理解计算机系统》(CSAPP)慕名已久,主要在于据说这本书尽量的做到相对实用,不去讲那些和实际编程没多大关系的计算机原理(毕竟是著名计算机院校里面最偏软件的CMU的作品),重点非常明确,像我这种没有本科科班出身又不想去死读些不知道以后有没有用的东西的人来说,最是适合了。感兴趣的东西就可以再加深,不兴趣的就算了。 
书的确是难得的书。我第一次试图读这本书是几个月以前,当时第2章“信息的表示和处理”没看完就放下了,觉得讲了一大堆数字表达方式很没意思……这次 稍微坚持了一下,没想到就一口气读下来了…… 
重点推荐第3章“程序的机器级表示”、第5章“优化程序性能”、第6章“存储器层次结构”、第10章“虚拟存储器”。觉得这四章乃是全书之精华,看得人欲罢不能。 
“程序的机器级表示”一章几乎是一种教授逆向工程的方法在讲授,剖析编译器产生的汇编代码,以此来加深对具体代码实现的理解。大量的习题都是根据汇编 来猜源程序是什么,有趣极了。这一章还覆盖了缓冲区攻击——但是这点讲得太少了,不解渴,有时间自己弄弄…… 
讲底层离不了汇编这个有点棘手的东西,我还一度担心自己汇编学得不太过关,会碰到障碍。但这里作者提出一个很实际的要求:以前要求程序员都会写汇编, 现在要求程序员都会读汇编。这里以一种“读”的方式教人用汇编,不局限于很多细小的语法,让仅仅懂得C的程序员也毫无障碍。仅仅100多页,不仅初步讲了 汇编的语法和使用,还配合大量的例子分析来解读产生的汇编代码,让人理解深刻,实在是技高一筹。 
“优化程序性能”是全书最闪光的章节。作者对一个例子不断优化,讲循环效率和过程调用,到讲存储器引用,一直讲到现代处理器的结构,讲到IA32处理 器的局限,一路下来,畅快淋漓。还将IA32处理器的优化结果和Compaq Alpha 21164做对比,一目了然的看出哪些优化是处理器相关的,最后讲到profiling(程序剖析)指导优化,可以说平时能够用到的最高技巧(毕竟我还不 是编译器开发人员……)和流程走了一边,现实意义相当之高。 
这章把能够用到的所有技巧的原理全部讲解得清清楚楚,不做不必要的挖深,结合代码,让人丝毫不觉枯燥,真是佩服得五体投地。虽然章节后对编译器优化还 提供了参考文献以及加深的内容,不过我觉得这章的内容已经足够我受用很久了。      “存储器层次结构”实际上可以看作是“优化程序性能”一章的延伸,以及为之后的“虚拟存储器”做铺垫。这章主要详细解释了高速缓存(cache)的工 作方式,以及利用局部性使得cache达到最好效果的方法。 
而“虚拟存储器”(Virtual Memory)则上升到了操作系统层面,详细解析了VM的实现以及Linux系统上VM组织方式。自己觉得最受用的是malloc/free实现的动态存储器分配的具体方法以及对进程中具体存储结构的了解,还有GC的策略。这些让我感觉自己能够做到的事情似乎又多了一点,一直无法理解的valgrind之类软件的原理似乎也有了点眉目。 
这两章讲得比较细致,以至于稍微显得有点枯燥。其实我自己喜欢这两章的主要原因是解了我多年来关于存储器的困惑。不过存储器方面的内容实在博大精深,自己这完全是得了点皮毛就沾沾自喜。 
其实在学计算机方面我还是挺实用主义的,一直抱着碰到了再去仔细研究好了的态度,所以看书普遍不认真,只是求到时候能够找得到参考。不过这本书我觉得 格外有趣,所以也看得格外认真,把每节后的习题都做了,家庭作业则等着过两天复习(计划是这样的……)的时候加深印象。 
不过一直没找到CSAPP的实习手册。其中有个“二进制炸弹”实验非常吸引人,典型的反汇编作业,有点点实现我小时候破解愿望的感觉——希望找到以后不要让我太失望,呵呵。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 深入理解计算机系统(CSAPP)是由Randal E. Bryant和David R. O'Hallaron编写的经典计算机科学教材。该教材通过涵盖计算机体系结构、机器级别表示和程序执行的概念,帮助学生深入理解计算机系统的底层工作原理和运行机制。 深入理解计算机系统的练习题对于学生巩固并应用所学知识非常有帮助。这些练习题涵盖了计算机硬件、操作系统和编译器等多个领域,旨在培养学生解决实际问题和设计高性能软件的能力。 对于深入理解计算机系统的练习题,关键是通过实践进行学习。在解答练习题时,应根据课本提供的相关知识和工具,仔细阅读问题描述,并根据实际需求设计相应的解决方案。 在解答练习题时,需要多角度思考问题。首先,应准确理解题目要求,并设计合适的算法或代码来解决问题。其次,应考虑代码的正确性和效率,以及对系统性能的影响。此外,还要注意处理一些特殊情况和异常情况,避免出现潜在的错误或安全漏洞。 解答练习题的过程中,应注重查阅相关资料和参考优秀的解答。这可以帮助我们扩展对问题的理解,并学习他人的思路和解决方法。同时,还可以通过与同学和老师的讨论,共同探讨问题和学习经验。 总之,通过解答深入理解计算机系统的练习题,可以帮助学生巩固所学知识,同时培养解决实际问题和设计高性能软件的能力。这是一个学以致用的过程,可以加深对计算机系统运行机制和底层工作原理的理解。 ### 回答2: 理解计算机系统(CSAPP)是一本经典的计算机科学教材,通过深入研究计算机系统的各个方面,包括硬件、操作系统和编程环境,对于提高计算机科学专业知识与能力具有很大帮助。 练习题是CSAPP中的重要部分,通过练习题的完成,可以加深对计算机系统的理解,并将理论知识转化为实践能力。练习题的数量、难度逐渐递增,从简单的概念与基础问题到复杂的系统设计与实现。 在解答练习题时,首先需要对题目进行仔细阅读理解,明确题目的要求和限制条件。然后,可以利用课堂讲解、教材内容、网络资源等进行查阅和学习相应的知识。同时,还可以参考课后习题解答等资料,了解一些常见的解题方法和思路。 在解答练习题时,可以利用计算机系统的工具和环境进行实际测试和验证。例如,可以使用调试器、编译器和模拟器等工具对程序或系统进行分析和测试。这样可以更加深入地理解问题的本质,并找到恰当的解决方法。 另外,解答练习题时还可以与同学、教师和网上社区进行交流和讨论。这样可以互相学习和交流解题思路,共同解决问题。还可以了解不同的解题方法和技巧,提高解题效率和质量。 练习题的解答过程可能会遇到一些困难和挑战,例如理论知识的不足、复杂问题的分析与解决。但是通过不断地思考和实践,相信可以逐渐提高解题能力,更好地理解计算机系统。 总之,深入理解计算机系统(CSAPP)练习题是提高计算机科学专业知识和能力的重要途径。通过仔细阅读理解题目,查阅相关知识,利用计算机系统工具和环境进行实践,与他人进行交流和讨论,相信可以更好地理解计算机系统的各个方面,并将知识转化为实际能力。 ### 回答3: 《深入理解计算机系统(CSAPP)》是计算机科学领域的经典教材之一,对于深入理解计算机系统的原理、设计和实现起到了极大的帮助。在阅读这本书的过程中,书中的习题也是非常重要的一部分,通过做习题,我们可以更好地理解书中所讲的概念和思想。 CSAPP的习题涵盖了课本中各个章节的内容,从基础的数据表示和处理、程序的机器级表示、优化技术、程序的并发与并行等方面进行了深入探讨。通过解答习题,我们可以对这些知识进行实践应用,巩固自己的理解,并培养自己的解决问题的思维方式。 在解答习题时,我们需要充分理解题目要求和条件,并从知识的角度进行分析。有些习题可能需要进行一些编程实践,我们可以通过编程实现来验证和测试我们的思路和解决方案。在解答问题时,我们还可以查阅一些参考资料和网上资源,充分利用互联网的学习资源。 在解答习题时,我们需要保持积极的思维和态度。可能会遇到一些困难和挑战,但是通过坚持和努力,我们可以克服这些困难,提高我们的解决问题的能力。同时,我们还可以通过与同学或者其他人进行讨论,相互分享解题经验和思路,从而更好地理解问题。 综上所述,通过深入理解计算机系统(CSAPP)的习题,我们可以进一步巩固和深化对计算机系统的理解。掌握这些知识,不仅可以提高我们在计算机领域的能力,还可以为我们未来的学习和职业发展奠定重要的基础。因此,认真对待CSAPP的习题,是我们在学习计算机系统知识中不可或缺的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值