写给指导教师们:经过课堂验证的实验练习

写给指导教师们:经过课堂验证的实验练习

ICS+ 课程在卡内基-梅隆大学得到了学生很高的评价。学生对这门课程的评价,中值分数一般为5.0/5.0,平均分数一般为4.6/5.0。学生们说这门课非常有趣,令人兴奋,主要就是因为相关的实验练习。这些实验练习可以从 CS:APP 的主页上获得。下面是本书提供的一些实验的示例。

  • 数据实验。这个实验要求学生实现简单的逻辑和算术运算函数,但是只能使用一个非常有限的 C 语言子集。比如,只能用位级操作来计算一个数字的绝对值。这个实验可帮助学生了解 C 语言数据类型的位级表示,以及数据操作的位级行为。
  • 二进制炸弹实验。二进制炸弹是一个作为目标代码文件提供给学生的程序。运行时,它提示用户输入6个不同的字符串。如果其中的任何一个不正确,炸弹就会“爆炸”,打印出一条错误消息,并且在一个打分服务器上记录事件日志。学生必须通过对程序反汇编和逆向工程来测定应该是哪6个串,从而解除各自炸弹的雷管。该实验能教会学生理解汇编语言,并且强制他们学习怎样使用调试器。
  • 缓冲区溢出实验。它要求学生通过利用一个缓冲区溢出漏洞,来修改一个二进制可执行文件的运行时行为。这个实验可教会学生栈的原理,并让他们了解写那种易于遭受缓冲区溢出攻击的代码的危险性。
  • 体系结构实验。第4章的几个家庭作业能够组合成一个实验作业,在实验中,学生修改处理器的 HCL 描述,增加新的指令,修改分支预测策略,或者增加、删除旁路路径和寄存器端口。修改后的处理器能够被模拟,并通过运行自动化测试检测出大多数可能的错误。这个实验使学生能够体验处理器设计中令人激动的部分,而不需要掌握逻辑设计和硬件描述语言的完整知识。
  • 性能实验。学生必须优化应用程序的核心函数(比如卷积积分或矩阵转置)的性能。这个实验可非常清晰地表明高速缓存的特性,并带给学生低级程序优化的经验。
  • cache 实验。这个实验类似于性能实验,学生编写一个通用高速缓存模拟器,并优化小型矩阵转置核心函数,以最小化对模拟的高速缓存的不命中次数。我们使用 Valgrind 为矩阵转置核心函数生成真实的地址访问记录。
  • shell 实验。学生实现他们自己的带有作业控制的 Unix shell 程序,包括 Ctrl+C 和 Ctrl+Z 按键,fgbgjobs 命令。这是学生第一次接触并发,并且让他们对 Unix 的进程控制、信号和信号处理有清晰的了解。
  • malloc 实验。学生实现他们自己的 mallocfreerealloc(可选)版本。这个实验可让学生们清晰地理解数据的布局和组织,并且要求他们评估时间和空间效率的各种权衡及折中。
  • 代理实验。实现一个位于浏览器和万维网其他部分之间的并行 Web 代理。这个实验向学生们揭示了 Web 客户端和服务器这样的主题,并且把课程中的许多概念联系起来,比如字节排序、文件 I/O、进程控制、信号、信号处理、内存映射、套接字和并发。学生很高兴能够看到他们的程序在真实的 Web 浏览器和 Web 服务器之间起到的作用。

CS:APP 的教师手册中有对实验的详细讨论,还有关于下载支持软件的说明。