如果说《深入理解计算机系统》的课本是九十分的话,那么配套的实验少说得有一百五十分。完成实验的过程,也就是深入理解计算机系统的过程,真正动手去做,一是会发现『纸上得来终觉浅』,二是会意识到『知行合一』的重要性。
首先要说的是,这门课的课本,也就是《深入理解计算机系统》(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,借此学习网络编程和并行/同步
介绍了这么多,关键还是要自己动手试一试,所有的实验文档和代码都可以在这里下载。
纸上得来终觉浅,绝知此事要躬行!
系列文章
读薄部分
- 零 系列概览
- 壹 数据表示 - 不同的数据是如何存储与表示的
- 贰 机器指令与程序优化 - 控制流、过程调用、缓冲区溢出
- 叁 内存与缓存 - 内存层级与缓存机制
- 肆 链接 - 不同的代码如何协同
- 伍 异常控制流 - 不同进程间的切换与沟通
- 陆 系统输入输出 - 怎么把不同的内容发送到不同的地方
- 柒 虚拟内存与动态内存分配 - 现代计算机中内存的奥秘
- 捌 网络编程 - 从最原始套接字彻底理解网络编程
- 玖 并行与同步 - 协同工作中最重要的两个问题
读厚部分