【不周山之读厚 CSAPP】实验概览

如果说《深入理解计算机系统》的课本是九十分的话,那么配套的实验少说得有一百五十分。完成实验的过程,也就是深入理解计算机系统的过程,真正动手去做,一是会发现『纸上得来终觉浅』,二是会意识到『知行合一』的重要性。


首先要说的是,这门课的课本,也就是《深入理解计算机系统》(CSAPP),我是之前大致阅读过一次的,有一些笔记,但是课后的几个 lab 都没有具体实现,很多概念都属于一知半解。

这个学期在具体学习的过程中,在不断的尝试中算是彻底理解了书中的大部分概念。小至数据在内存的存放以及程序的执行机制,大到 web 服务器的编写以及并行程序的设计,都有了更加透彻的认知。

这里我们简单回顾一下整体的学习脉络:先从数据的表示开始,自然而然引出用汇编描述的计算机基本运行的方式,从控制流、过程调用到跳转等高级话题。了解了计算机运行的模式,据此给出一些程序设计的技巧作为过渡,然后开始涉及诸如内存、编译器、进程、信号、I/O、虚拟内存、动态内存分配等知识。这些东西看起来都非常吓人,但是老师很科学地把握好了『度』,让我们理解基本原理,这样以后想要深入学习可以自己去探索,却不会过早陷入无谓的复杂度。在单机的知识基本完备之后,开始涉及网络、同步、并行编程等高级话题,为后面的学习打下基础。

这些都很好,但是不是最好的,最好的部分,在我看来,是通过一门课程,去引导学生往抵抗力最大的路径走。

  • 前面几次非常底层的作业,每个人的答案都是自动生成的且不同的,除了弄清楚背后的原理,没有任何捷径可以走
  • 所有作业的设置,如果弄清楚了每个重要知识点,加上一点点自己的联想和思考,思路就会非常清晰的,不会出现因为文档或者助教质量而导致的各种问题,也就是说,你在这门课上花的时间,大部分是有价值的
  • 知识点不局限于课程大纲,深入浅出,承前启后,无论之后想往哪个方向发展,都可以从中受益

下面大致介绍下主要知识点和不同的 lab 的重点

程序和数据

  • 学习目标
    • 位操作,数学计算,汇编程序
    • C 控制流程的表示以及数据结构
    • 体系架构和编译器
  • 实验介绍
    • L1(datalab):操作 bits
    • L2(bomblab):拆除一个二进制炸弹
    • L3(attacklab):基本的代码注入攻击

存储体系

  • 学习目标
    • 内存技术,内存层级,缓存,磁盘,局部性原理
    • 体系架构和操作系统
  • 实验介绍
    • L4(cachelab):做一个缓存模拟器并且进行优化,与此同时学习如何在程序中利用局部性

异常控制流

  • 学习目标
    • 硬件异常,进程,进程控制,Unix 信号,非本地跳转(nonlocal jumps)
    • 编译器,操作系统和提及架构
  • 实验介绍
    • L5(tshlab):写一个自己的 Unix shell

虚拟内存

  • 学习目标
    • 虚拟内存,地址翻译,动态存储分配
    • 体系架构和操作系统
  • 实验介绍
    • L6(malloclab):自己实现 malloc 功能,借此了解系统层次编程

网络与并行

  • 主题
    • 高层和底层 IO,网络编程
    • Internet 服务,Web 服务器
    • IO 复用
    • 网络,操作系统和体系架构
  • 作业
    • L7(proxylab):写一个 web proxy,借此学习网络编程和并行/同步

介绍了这么多,关键还是要自己动手试一试,所有的实验文档和代码都可以在这里下载。

纸上得来终觉浅,绝知此事要躬行!

系列文章

读薄部分

读厚部分

捧个钱场?