For the complete documentation index, see llms.txt. This page is also available as Markdown.

教 BSD

作者:George V. Neville-Neil 与 Benedict Reuschling

2016 年 8 月第二周,George Neville-Neil 访问了我在德国达姆施塔特应用科学大学计算机科学系。George 与剑桥大学的 Robert Watson 合作多年,开发了一门硕士级课程。

这门课程用 DTrace 分析并探索运行中的 FreeBSD 操作系统。我邀请 George 来我校,在学期假期为一批有兴趣的本科生上本科版本的课程。此举目标众多:我们想了解课程材料(在 teachbsd.org 在线可得)对本科生、尤其是未修过操作系统课程的人效果如何;另一目标是改编课程减少论文写作(在硕士版本中较强调),仍聚焦实践内容;最后,我们想看看德国学生能否理解英语授课的课程,是否愿意提问与参与课堂。

令人欣喜的是,英语对学生并非障碍,他们很快开始提问。

课程分为上午与下午两段,中间午休。上午是典型讲座,George 讲解不同内核子系统如何工作,既给出理解概念所需的理论背景,也概述现代操作系统 FreeBSD 中的实现。午餐后,学生拿到实验题,用 DTrace 在虚拟机上完成。实验覆盖上午讲座的话题。因这些客座讲座安排在学期假期,参与学生不多。小班使我们能在整周给予学生更多个别帮助,这通常在大班里难以做到。

周一是课程内容概览,包括一点计算机史。引言与概览部分向学生介绍操作系统开发的起源、演变,以及部分当前操作系统实现的原因。现代操作系统的许多部分源于软硬件进步的相互作用,一方影响另一方。明显例子是现代 RISC 处理器受 UNIX 与 C 语言的兴起影响;这类张力驱动着我们向学生展示的许多课程。周一实验的目标是让学生搭好虚拟机并熟悉 DTrace 工具,让他们动手做最初的基本追踪。

周二上午以小测验开场,了解学生当前水平并检验周一话题理解程度。随后讲解进程如何工作、什么是虚拟内存、进程与线程如何在操作系统中调度。锁定话题与挑战(包括死锁与锁序倒置)受到重点关注。不理解并发与锁定,学生就无法真正体会现代硬件与软件的许多微妙之处——不论在操作系统中还是多线程用户程序中。实验覆盖追踪进程及其各种状态,让学生解释 UNIX 进程生命周期。第二天课程的反馈转化为更新后的幻灯片。不止一次,课程之夜用于修订或全新创作整套幻灯片,以阐释学生白天难以理解的概念。

讲完进程、虚拟内存与并发基础后,我们转向操作系统中的通信。从基本进程间通信(IPC)开始,讲解信号及其在程序与操作系统间通信中的用法。从基本 IPC 转到套接字与网络通信。网络话题涵盖 DNS、UDP、TCP,重点在操作系统如何实现 TCP——连接建立、数据传输、滑动窗口、连接拆除。由于所有学生都已修过本科网络课程,他们能迅速体会操作系统为正确实现 TCP 软件所需做什么。因这份熟悉,学生提问深入到操作系统内部,比之前几节更深。当天通信实验让学生用本地 nginx 实例提供静态网页,追踪 TCP 连接建立过程。我们也让他们用 graphviz 包将推导出的状态机可视化,这部分是我教学生的。

周四讲座主题是数据存储与文件系统。讲了 namecache、虚拟文件系统层(VFS)以及数据读写等内容。namecache 总是需要大量讲解,因为缓存否定结果的概念多数本科生尚未接触。实验中学生进一步探索 namecache 及其与 nginx 在请求某个网页 URL 时的交互。周四下午课程提前结束,给学生时间准备次日考试。

周五我们给学生完整系统视角,把一周讨论的话题全部串联。这场讲座既是笔试前的复习,也把一切串联起来。具体而言,我们探索 nginx 这类 Web 服务器提供页面时操作系统各层发生什么。学生接触到哪些 worker 进程在运行、做了哪些缓存查找、创建了哪些 TCP 状态等。

期末是 90 分钟考试,覆盖一周所有话题,问题聚焦操作系统实现细节与几道 DTrace 单行脚本。考试期间允许学生使用笔记本,以便在交卷前测试并验证 DTrace 脚本。考试决定课程成绩。评分后我们对结果非常满意,并已在讨论如何基于这首次试运行进一步完善课程。

George 不上课时(他非常享受上课),我带他参观达姆施塔特的校园、城市与不错的餐厅。我也把他介绍给那周未放假的几位教授。George 不仅在系统层面擅长联网,人际层面也很在行。我们就教学到教育中的文化多样性、将从业者工作融入大学课程等话题有过良好讨论。

课程中较有趣的一些时刻与学校所有时钟走时不准有关。要么电池没电,要么走得太慢,要么完全说不通(“现在世界上没有哪个地方是 16:00”)。对 George 这样的计时狂人,这成了贯穿整周的反复笑话。

总体而言,这一周非常富有成效。我们为面向本科生的 teachbsd 课程获得了宝贵反馈,学生也上到了一堂生动的操作系统内核课。我打算把其中部分讲座融入我自己的整学期课程,George 也计划重返达姆施塔特,讲授更新、扩展版的课程。


GEORGE V. NEVILLE-NEIL 出于兴趣和生计从事网络与操作系统代码工作,也教授与编程相关的各类课程。他的兴趣领域包括代码探秘、操作系统、网络和时间协议。他与 Marshall Kirk McKusick 和 Robert N. M. Watson 合著了《FreeBSD 操作系统设计与实现》。十余年来,他以 Kode Vicious 之名撰写专栏。他在马萨诸塞州波士顿的东北大学获得计算机科学学士学位,是 ACM、USENIX 协会和 IEEE 的会员。他热爱骑行和旅行,现居纽约市。

BENEDICT REUSCHLING 于 2009 年加入 FreeBSD 项目。2010 年获得完整文档提交权限后,他积极指导他人成为 FreeBSD 提交者。他是 BSD 认证小组的监考人,并于 2015 年加入 FreeBSD 基金会,现任副总裁。Benedict 拥有计算机科学理学硕士学位,在德国达姆施塔特应用技术大学教授面向软件开发者的 UNIX 课程。

最后更新于