Computer System: A Programmer's Perspective (深入理解计算机系统) 读书总结

步炯
2023-12-01
Computer System: A Programmer's Perspective 读书总结

中文名为<<深入理解计算机系统>>.


花了一个多月的时候把CSAPP这本书看完了, 看的是英文版的, 看完之后感觉收获很大, 对于程序的理解比以前深入了很多. 本书lab也基本跟着做了, 下面是我做的lab的下载地址:

bomb lab: http://download.csdn.net/detail/xuzhezhaozhao/5288867

buffer lab: http://download.csdn.net/detail/xuzhezhaozhao/5292532

cache lab: http://download.csdn.net/detail/xuzhezhaozhao/5330723

shell lab: http://download.csdn.net/detail/xuzhezhaozhao/5341206

malloc lab: http://download.csdn.net/detail/xuzhezhaozhao/5385469


在这本书的官网上提供了很多资料, 包括9个作者精心设计的Lab, 完成这些lab之后能够很好的理解相关知识, 可以参看Carnegie Mellon UniversityIntro to Computer Systems课程安排来完成这些lab.


这本书作者从程序员的角度来剖析计算机系统, 开头从一个最简单的hello world的C语言程序的编译执行过程让读者对程序的本质有一个清晰的了解, 之后的章节详细的介绍了程序执行过程所需要涉及的各个部分. 作者将计算机硬件和软件天衣无缝的结合在一起, 让程序员能够写出更加安全, 高效的程序.


Chapter1: A Tour of Computer Systems (系统漫游)

这一章粗略的把全书涉及的到的内容作了一个概述, 就像题目描述一样, "系统漫游".


Chapter2: Representing and Manipulating Information (信息的表示)

这一章的内容很多计算机或程序设计入门的书都会有, 但我从来没看过哪本书把这些内容讲的这么详细细致的.

本章详细的介绍了信息在计算机中的存储方式, 信息在计算机中都是用0和1表示, 不同的解析方式就得到了不同的信息. 作者讲了很多C语言中的位运算及相关技巧, 这些知识对于底层编程很有帮助. 我觉得其中讲解的最好的是关于C语言中关于各种数据类型之间转换的问题, 看了之后才知道原来C语言提供的强制类型转换方法可能导致如此多的问题, 如果对于数据的存储没有很清楚的认识, 估计很难发现这些隐晦的bug. 最后还详细的介绍了浮点数在计算机中的表示方法, 看完之后才明白了为什么以前总看到别人说浮点数的表示是近似的, 不是精确的了.

本章lab: Date lab


Chapter3: Machine-Level Representation Programs (程序的机器级表示)

这一章基本就是讲汇编了, 如果有一点基础的话看的应该很轻松, 正好我以前看过王爽的汇编语言, 虽然这章讲的是IA32指令集, 但基本的东西还是一样的, 主要把一些特殊寄存器的功能搞清楚基本上就可以了, 汇编指令也就那个几个, 而且要求也是能够看懂汇编, 以后在调试程序的时候能够看懂程序的汇编表示就行了, 不要求写汇编程序. 这一章需要注意的数据存储时的alignment的特性, 这也是为什么struct { char c; int i; int j; }占用的12个字节的空间而不是9个字节的原因. 这一章还详细的介绍了程序运行时栈的基本结构, 看完之后我才明白了C语言中函数是怎样用栈来传递参数的以及什么是大名鼎鼎的缓冲区溢出攻击了. 

本章lab: Bomb labBuffer lab.


Chapter4: Processor Architecture (处理器体系结构)

这一章是讲处理器是怎么样来工作的, 详细的介绍了汇编指令是怎么翻译成机器语言, 机器语言又是怎样被计算机执行的, 为了更加清晰的表达其流程, 作者直接实现了一个简易的Y86处理器, 在实现Y86的过程中详细的讲解了处理器的实现需要处理的问题以及解决方法, 作者先是实现了Sequential版本的Y86, 读者能够很清楚的理解处理器处理指令的过程, Fetch->Decode->Execute->Memory->Write back->PC update, 每个stage都是连续的执行. 之后作者将Sequential版本的Y86升级到了Pipeline版本的Y86, 通过这个实际的例子作者将Pipeline(流水线)的工作方法及原理剖析的无比清楚, 一看就懂, 基本上没有什么难度.

本章lab: Architecture Lab


Chapter5: Optimizing Program Performance (程序性能优化)

这一章是讲程序性能优化的一些技巧, 作者从一个简单的程序实例开始, 通过不断的优化其性能讲解了程序优化的技巧, 可以看出, 同样一个程序, 可能不同的书写顺序都有可能使程序的性能发生巨大的变化, 掌握这些程序优化的技能可以在不改进程序算法的前提下大大提高程序的效率.

本章lab: Performance Lab, 可以在看完第6章之后做.


Chapter6: The Memory Hierarchy (存储器结构)

这一章主要是要了解缓存cache的思想, cache的出现大大的加快了程序执行的效率, 计算机的设计者将存储器按读取速度分成了不同的等级, 最上面的等级的读取速度最快, 上一等级是下一等级的cache. 作者详细的介绍的cache的结构, 可以看出, 如果我们的程序能够有好的spatial locality和temporal locality性, 那么就可以大大减少数据读取的时间从而提高程序的效率. 作者通过很多cache的实例详细介绍了其工作原理, 本书的封面的图就是一个 Memory Mountain 图.

本章lab: Cache Lab,


Chapter7: Linking (链接)

如果你写程序时遇到编译没有问题, 但链接报错的情况, 那你就应该好好看一看这一章, 这一章详细的介绍了链接过程及实现方法, 看完之后我终于知道.o文件是怎么回事了, 而且在写Makefile文件的时候也知道为什么可以那样写了, 以前总觉得怎么这样也可以生成.o文件. 看完这一章, 再遇到链接错误大部分应该都可以搞定了.


Chapter8: Exceptional Control Flow (异常控制流)

这一章详细介绍了unix的异常控制机制, 并且涉及到了进程process的概念, 还讲解了unix中signal的概念, 以前只知道kill命令可以向进程发送信号, 现在才知道signal的概念在unix中是如此的重要, 作者通过实现一个简易版的unix shell详细剖析了进程和signal的关系. 我看完之后再做了一下那shell lab, 发现涉及到进程和signal的编程果然是很麻烦, 不过基本概念还是搞清楚了.

<[>本章lab:  Shell lab


Chapter9: Virtual Memory (虚拟内存)

这一章详细介绍了虚拟内存的概念, 了解了虚拟内存之后才彻底知道了计算机是怎样实现多进程机制的, 而且虚拟内存提供了一个极好的内存保护机制, 可以说是计算机系统中一个极其重要的概念. 我觉得这一章最好的地方是详细的讲解了C语言中malloc函数的实现, 以前只知道用, 不知道内部实现, 读完这一章之后才明白malloc分配的内存是heap中的内存, 才明白malloc内存之后如果不free该块内存会产生怎样的后果, 作者还介绍了一些malloc函数的实现算法, 各有优点, 这一章的lab就是实现一个自己的高效的malloc函数, 很有挑战性.

本章lab:  malloc lab


Chapter10: System-Level I/O (系统级 I/O)

这一章介绍了文件的概念及unix下对文件操作的底层实现的函数read和write, 记得以前就看到过file descriptor的概念, 但不知道是什么, 还有关于重定向流的实现, 看完这一章都懂了. 作者讲解的很深入, 不是只说一下结果, 而是将具体的实现方法都讲的很楚, 让人有一个很清晰的认识.


Chapter11: Network Programming (网络编程)

这一章介绍了网络编程的基本概念. 讲解了关于 socket的用法, 这一章的基础是第10章, 因为对socket的读写是用系统级I/O而不程序级I/O. 作者在最后实现了一个小型的web Server并详细讲解了源代码.


Chapter12: Concurrent Programming (并发编程)

这一章介绍了基本的并发编程的概念, 讲了三种并发编程的方法: Processes, I/O multiplexing, Threads. 最主要的是讲了threads编程, 把关于线程编程的方法和会遇到的问题讲解的很清楚, 并用了经典的生产-消费问题作为例子讲解了怎样处理线程编程中的Shared Resorces, 这一章里面作者引用的progress graph是理解进程和线程执行过程的很好的工具, 讲解deadlock时用progrss graph真是一看就懂. 作者在这一章里面提到了很多并发编程会遇到的问题, 并发编程不像普通的单进程下单线程编程, 由于CPU在不同的进程线程中切换是随机的, 程序员无法预测指令的执行顺序, 有可能写出来的程序运行1000次都没有问题, 但在1001次执行的时候就出现问题了, 这种bug很隐晦而且不易发现, 必须对进程和线程的实现原理有一个清晰的理解才能编出可靠的多进程多线程程序.

本章lab:  Proxy Lab,

 类似资料: