我与《深入理解计算机系统》有三次接触吧,真有缘。。
第一次:在我读专科大二的时候,自己就看过一遍《深入理解计算机系统》,想想就是放寒假前看完的,和现在的时间也差不了多少。
第二次:在专科大三下学期又重新重头看起了本书,其主要原因为第一遍看的比较粗,不求甚解。以至于看第二遍时都没有第一遍的印象,像看一遍新的书一般。就看了大概前面三章的样子吧,就没继续看了,去搞其他的了。
第三次:到了本科大三(加上专科大三,这是第二次大三了),学校用这本书开了这门课。
在学校开这门课的时候,才知道课本的配套实验内容,以及一些资源。凭借此次机会我也是一口气从头到尾看完了本书,完成了八个实验,相比于第一次粗糙的看,这一次细致了很多。也花了前前后后差不多一个学期(3~4个月)的时间吧。
看完之后觉得一些资源和一些方法是那么的清楚就不想写这篇播客了(一搜就好多),但是想到在第一次看和第二次看的时候都不知道这些东西,也是凭借着学校的开头才真正的看完了此书。所有还是决定写写我的个人看法和一些资源分享给非“科班”和学校没有这门课程想看此书的人一点参考吧,也算是记录记录吧。
本文将从一下几个方面描述:简单介绍+前置知识+学习资源+题目(练习题+家庭作业+实验)。仅供参考。
《深入理解计算机系统》很多人都在推荐,那它到底是一本什么样的书呢?它的英文名《ComputerSystem:A Programer perspective》简称csapp,翻译过来就是程序员视角下的计算机,我觉得这个名字比较适合本书,它确实讲的不太深入理解计算机系统,更像把你领进门。
《深入理解计算机系统》里面包含了汇编+计算机组成原理+操作系统+计算机网络,一本700多页的书涉及讲那么多内容是不可能面面俱到的,每一个章节都有许多可以扩充的知识和书籍。但是它会让你对整个计算机有一个体系上的认识,把你领进门,很多学校也是使用本书完成计算机导论的课程。
《深入理解计算机系统》这本书不算太难。从它的广为流传和作为计算机导论来看,如果太难是不会那么大众的。
只需要C语言基础就好了。有涉及到一点点数据结构中的链表,有一个地方有树。
做实验需要安装Linux虚拟机,不过不用专门去学虚拟机,用的不深。
如果你是按顺序读的话,读到第三章就是一个门槛了,可能就会在这里因看不懂而放弃了。建议看看王爽编写的《汇编语言》
《汇编语言》全书300多页,10天左右的时间就可以完成,里面有17个很小的实验:
汇编语言(王爽第三版)实验大全。
我是三次看到《深入理解计算机系统》第三章都会阅读《汇编语言》。《深入理解计算机系统》第三章里有两个实验也是需要阅读汇编代码的,先看《汇编语言》会很有帮助。当然不看也是可以的,我的同学们也是有没看过《汇编语言》就完成这些内容的。
需要注意的是《汇编语言》是采用以8086CPU为中央处理器的PC机来进行学习,而《深入理解计算机系统》第三章是x86-64,也就是说它们的汇编语法是不同的,但是大致思想相同,转换过来也很快。
第4章 处理器体系结构算是计算机组成原理的内容了,可以单独开一课了,下面提到的《2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频》里面也是没有这一章的内容的,推荐了另外一个视频挺有帮助。也涉及到了一点汇编语言,不过看的懂第三章和实验二和实验三的话这点汇编语言也就不算什么了。
其他章节我感觉也没有什么前置知识了。
学校没开这门课可以自学吗?完全可以的,学校开了也是自学的,比如我们学校一个学期才讲了1 2 3 7章,而我的进度已经看完了。算一笔简单的帐,比如一次课80分钟,一个星期两次课就是160分钟。你拿星期六一天学8个小时(480),一天就顶3个星期的课程时间,更别说你还有大把的课余时间。或许有人会说上一次课顶自己自学几个小时,那就是看人了,B站也有《深入理解计算机系统》两位作者的授课视频(下面的学习资源有)。自学你还可以根据自己的进度来调整。
《深入理解计算机系统》官网:http://csapp.cs.cmu.edu
官网我主要是用来下载实验
《2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频》网站:https://www.bilibili.com/video/BV1iW411d7hd
是《深入理解计算机系统》的两位作者授课的课程视频。除了第四章其他章节的授课都有,原因好像是第四章有一个单独的课程计组吧。很值得一看,英语不好也可以看的,虽然我看PPT的英文都看不太懂,但是借助课本来看还是很有帮助的,听英文我也听不懂,都是看字幕的,翻译的我觉得也是可以的。
我也没有全部看完,一般课本有不太懂的地方我才会去看对应的课程视频。后几章我有些都是看一遍书在看一遍视频然后在看一遍书,就会搞懂许多第一遍忽略或不懂的地方。
《【合集】CSAPP-深入理解计算机系统》网站:https://www.bilibili.com/video/BV1cD4y1D7uR
这个系列的视频每集10分钟左右,算是总结类的,适合你完成每一章的学习后来看一遍巩固。
这个系列更新完第七章就停更了,前面提到《2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频》没有第四章的内容,而此系列第四章我觉得很值得一看,第四章课本上的图都是一张就搞定的,看的不知道什么“流程”,而此系列把该“流程”表示了出来。
学习《深入理解计算机系统》用到的资源就这些了。
简单说说是怎么处理的。
每一部分内容后面都会有一些练习题,往往考察的知识点就是前面一点点的内容,还有答案。所以我都会选择去完成该练习题。还是很值得一做的。
每一章后面都有家庭作业,挺多的,因为没有官方的答案所以我没有选择去做。
《深入理解计算机系统》官网实验下载地址:http://csapp.cs.cmu.edu/3e/labs.html
自己写的实验汇总:《深入理解计算机系统》csapp第3版实验汇总
官方主要有8大实验
学校加了1个实验
需要安装Linux虚拟机,我安装的是Ubuntu 18.04版本的。还可以在虚拟机里面安装Sublime Text编辑器来方便C程序的编写。
网上也有各种各样的答案和解析了,我自己也写了全部实验的解析:
但是最好还是自己去认真的思考,以“我下次遇到这个我还能独立做出来吗?”为基础来完成实验,如果你完完全全是自己做的,那下次遇到你还是很有信心经过思考和琢磨还是可以做出来的。但如果你是看了解析做出来的,觉得自己会了,但有信心下次遇到可以独立做出来吗?
我个人是实验一有个别函数是参考了网上的,实验二和实验三和实验四几乎是独立完成的,实验五的A部分独立完成的,B部分后两个参考别人的。后面的678都有参考别人的了(流下了没技术的泪水)。
学习完“第2章 信息的表示和处理”就可以开始Data Lab了。
第一个实验是使用有限的逻辑和算术运算实现函数。
比如只使用&和~来实现||。大部分函数都要求不能使用if和while语句,只能用顺序结构,就是各种运算符来实现函数要求。
实验心得:每一题都思考几个小时,不停的去尝试,经过充分的思考搞不定在去参考网上的解析。有时候会发现函数能处理大部分情况,但有些数值就不行了。
《深入理解计算机系统》实验一Data Lab
《深入理解计算机系统》实验一Data Lab 下载和官方文档机翻
(温馨提示:这里我写的实验一Data Lab不是官方版的,是学校发的,所以有些函数功能不一样,仅供参考。)
学习完“第3章 程序的机器级表示”就可以开始Bomb Lab了。
第二个实验,使用gdb来调试目标代码文件,阅读汇编语言来找到6个正确的字符串来完成6关(一关一个字符串)。
实验心得:相信我,这个实验是完完全全可以自己完成的,只要有耐心,一行一行阅读汇编代码,可以把汇编代码写成C语言方便自己观看,每读一行就离答案越近。这算是8个实验里面中可以一步一步接近答案的实验了。我还记得用了3天,当时晚上解决完最后一关,精神上得到了满足。就是那种越来越接近答案越来越清晰然后完成的。
《深入理解计算机系统》实验二Bomb Lab
《深入理解计算机系统》实验二Bomb Lab下载和官方文档机翻
学习完“第3章 程序的机器级表示”就可以开始Attack Lab了。是“第3章 程序的机器级表示”后半部分(3.10.3 内存越界引用和缓冲区溢出)关于缓冲区溢出的部分。
第三个实验,里面缓冲区溢出来改变程序的行为,比如程序原本是要跳转到sum()函数的,我们在不改变源代码的情况下利用缓冲区溢出让它不跳到sum()函数,而是跳转到touch()函数。黑客行为。
实验心得:只要理解了缓冲区溢出和栈的组织,然后用gdb去调试,也是可以一步一步接近答案,和实验二一样,都是可以通过自己的尝试慢慢完成的。这里我也是用了差不多3天。
我个人建议实验二和实验三最好独立完成。其他实验有心想独立完成也不知道有没有机会了。
《深入理解计算机系统》实验三Attack Lab
《深入理解计算机系统》实验三Attack Lab下载和官方文档机翻
学习完“第4章 处理器体系结构”就可以开始Architecture Lab了。C部分建议去看完“第5章 优化程序性能”在来完成。
A部分:把C语言程序改成汇编语言。
B部分:实现iaddq指令。
C部分:用各种方式优化程序。
实验心得:经过实验二和实验三中的汇编语言,A部分不是问题了。B部分,在第四章你会看到各种指令如OPq,rrmovq…包含许多操作,取值、译码、执行、访存、写回和更新PC,你要完成iaddq指令的实现,看着自己编写的指令可以真的成为一个汇编语言的指令是一件很有意思的事情。C部分,你要优化汇编程序让其更加快的运行,你可以用调试工具看到汇编程序在流水线上各阶段是如何的?有没有把流水线的性能发挥到极致?还可以用上B部分添加的指令iaddq来优化程序。C部分建议去看完“第5章 优化程序性能”,不然拿高分是很难的。C部分也是可以经过自己的尝试慢慢使分数来一步一步接近满分,这是很有趣的。
《深入理解计算机系统》Y86-64实验四Architecture Lab环境安装
第四章有各种各样的流水线,想自己上去运行操作可以安装Y86-64环境。实验也需要用到此环境。
《深入理解计算机系统》实验四Architecture Lab
《深入理解计算机系统》实验四Architecture Lab下载和官方文档机翻
学习完“第6章 存储器层次结构”就可以开始Cache Lab了。
该实验是用C语言编写模拟缓存行为的程序。
A部分:模拟LRU高速缓存。
B部分:矩阵转置优化。
实验心得:A部分根据课本关于缓存的描述来把它代码化,去思考“数据加载”“数据存储”“数据修改”的行为对于缓存会有什么影响,实现出来,完成A部分就会对缓存的行为有了认识。写的时候因为太久没写C语言的缘故,我已经不能把所想进行代码化了,而且发现后面的实验都是用的C语言,于是我花了点时间重新扫了一遍《C和指针》觉得差不多了就开始写实验了。B部分是怎么编写一个转置矩阵的函数性能最大化?利用缓存。这部分我觉得好难想,它不像实验二和实验三可以跟着代码一步一步来。而是要想到一个新的优化。B部分后两个我是看别人的。
《深入理解计算机系统》实验五Cache Lab
《深入理解计算机系统》实验五Cache Lab下载和官方文档机翻
学习完“第8章 异常控制流”就可以开始Shell Lab了。
这个Shell就是一个小型的终端,需要自己实现它的行为。
实验心得:此实验就像是在终端上面在运行了一个终端一样。会发现在终端运行一个C程序的话,终端它就会等这个C程序运行完才能输入下一个命令,这就是前台作业,在后台的话就会可以直接输入下一个命令。其实这些都是进程启到了作用。通过信号发送给进程来进行一些操作。实验测试文件有16个,每个测试文件都是实现一点功能,文档上也建议根据文件从1到16一个一个完成,我也是这样写的。
《深入理解计算机系统》实验六Shell Lab
《深入理解计算机系统》实验六Shell Lab 下载和官方文档机翻
学习完“第9章 虚拟内存”就可以开始Malloc Lab了。
在C语言中有动态内存分配函数malloc(),还有与之配对的释放函数free()。在这个实验中我们要自己实现这些函数。
实验心得:需要关注的就是选择什么样的数据结构来区别块(分配块和空闲块)?怎样让空间利用率最好?怎么处理碎片化的空间?采用什么样的方法来查找空闲块?课本上有很多种方法可以进行组合来实现,都可以一一去尝试。
听说是可以用红黑树来完成的,分数会比其他高,快满分。
《深入理解计算机系统》实验七Molloc Lab
《深入理解计算机系统》实验七Molloc Lab 下载和官方文档机翻
学习完“第11章 网络编程”就可以完成该实验的第一部分,学习完“第12章 并发编程”就可以完成该实验的第二部分。第三部分是添加一个缓存功能,是前面学习过的缓存内容。
用C语言实现一个代理服务器。什么是代理服务器?客户端发送请求到服务器,服务器响应返回数据到客户端,有了代理服务器,客户端就发送请求到代理服务器,由代理服务器转发到服务器,服务器响应返回数据到代理服务器,代理服务器在返回到客户端。有了代理服务器我们就可以在请求和返回前进行一些操作。
实验
第一部分:实现顺序的web代理
第二部分:处理多个并发请求
第三部分:缓存web对象
实验心得:课本上挺多代码,自己添加/修改一些就可以完成第一部分和第二部分了。第三部分就是前面学的缓存的应用,客户端发送请求到服务器,如果这个请求重复了特别多次,返回的内容都是一样的,缓存就能在这种情况下派上用场,就不用发送请求到服务器了,直接从缓存里面取。
《深入理解计算机系统》实验八Proxy Lab
《深入理解计算机系统》实验八Proxy Lab 下载和官方文档机翻
学习完“第7章 链接”就可以开始Link Lab了。
该实验考察ELF文件组成与程序链接过程的不同方面知识,按照阶段的目标要求修改相应可重定位二进制目标模块phase[n].o后时程序编译后运行输出学号。
实验心得:课本上这一章都没什么实操,实验也没有对应的,刚好学校有发对应的实验,做完之后对知识更加的深刻了。你可以看到多个.o文件编译起来它们是怎么链接的,你还可以改动.o文件来改变它的数据和行为,比如课本上的弱符号和强符号这里也有体现。这个实验几个小时就可以完成了,对比起官方的实验会简单许多。
《深入理解计算机系统》实验Link Lab源文件(下载)
《深入理解计算机系统》实验Link Lab
如前面提到的。这书相当于导论,每一个章节都有可以深入的地方,还有许多要学习的知识。