csapp.jpg花了大半年时间啃完了《深入理解计算机系统》(CSAPP)。CSAPP涵盖的内容相当广泛,从最基本的数据的二进制表达,到更接近应用的网络编程,帮助我们理解计算机如何完成这样的过程,对于我和一样类似的非科班出身的读者大有裨益。尽管每个章节涉及领域的内容都值得另一本黑皮书去探讨,但CSAPP能把最精华的部分浓缩成一个章节,在讲解理论的同时辅以帮助理解的习题,看完之后有种醍醐灌顶的感觉。最重要的是,CSAPP还提供了配套的实验(http://csapp.cs.cmu.edu/3e/labs.html),作为书本内容的扩展,让读者进行代码编写实践。lab与书本结合紧密,在实现lab的过程中,有很多coding细节需要翻阅书本,但最关键的部分并不在书本中,需要读者一定的思考,在coding的过程中探索答案。官方网站一共有11个lab,其中有3个被新的替代,所以我一共完成了8个lab。

  • Data Lab 对应第二章。展示了数据的二进制表示以及强大的位操作,但是某些题目太过tricky,做的时候有些无聊和折磨哈哈哈。
  • Bomb Lab 对应第三章。所有lab里最有趣,也是我最喜欢的lab。在解题的过程中,你会逐渐掌握汇编代码,过程调用,栈空间,还有非常实用的GDB调试。处理bomb的过程像是打怪升级,完成bomb的拆卸更是让人大呼过瘾。
  • Attack Lab 对应第三章。这是Bomb Lab的一个延申,同样惊艳。你将扮演一个黑客,在汇编代码中寻找突破口,实现对程序漏洞的攻击。通过实现代码注入攻击和ROP攻击,你对栈空间的理解将更加深入,明白overflow是多么严重的事情。
  • Architecture Lab 对应第四章和第五章。这一章的理论内容是最难的,书中描述一个简单的ISA,并由此设计了对应的流水线化的CPU。lab需要你优化这个ISA和一个benchmark程序来达到最佳性能。基本上我只能看懂流水线的过程,最大的帮助可能是能看懂CPU测评了hhh。benchmark程序的优化会让你了解循环展开的强大作用,也明白了编译器在背后默默的付出。
  • Cache Lab 对应第六章。在学习了cache的原理与作用后,你更能体会到cache友好的代码对程序性能的影响。这个lab需要写一个cache simulator统计cache miss的数量,并借助它优化矩阵运算的性能。我个人有一点感悟,就是明白了GPU为什么需要把内存组织成tile的而不是常用的linear方式。
  • Shell Lab 对应第八章。你需要写一个简单的shell程序,完成基本的进程控制和信号处理。这也是个很有趣的lab,让你充分理解每天都在打交道的shell、ctrl-c、ctrl-z背后的原理。
  • Malloc Lab 对应第九章。malloc是个非常常见的函数,但它背后的原理是什么?做完Malloc Lab你就能明白虚拟内存是如何被malloc/free管理的。CSAPP给出了一个隐式空闲链表的完整实现,其实已经足够完成lab了。但是这个allocator的吞吐量和内存使用率都有优化的空间。我只简单地把首次适配搜索改成了下一次适配搜索就获得了吞吐量的极大提升。
  • Proxy Lab 对应第十到十二章。这是一个比较综合的lab,需要写一个简单的能够并发的代理服务器。由于我工作不接触这部分内容,对网络编程也兴趣不大,这里只参考和阅读了网络上的答案。看到HTTP协议有些头大,不过代理的实现很有意思,最关键的UNIX I/O、描述符操作也让人印象深刻。

总结

CSAPP大而全,串联了计算机科学的各个领域,我认为很重要的一个作用是它提供了一个全面的视角,激发了读者选择某个领域深度探索的兴趣。当然它也有一些缺点,比如第七章链接那一章,看的云里雾里,讲操作系统的部分也只是浅尝辄止,这些都需要更专精的书籍来补全。