CS111 操作系统原理 · 开篇与课程概览
数据来源:斯坦福大学 CS111(Spring 2026),讲师 Mendel Rosenblum。 本笔记基于课程公开网站(https://web.stanford.edu/class/cs111/ 及归档站点 cs111.1266)上的公告、课程大纲(Syllabus)、FAQ、考试信息页、全部 9 个作业页面,以及全部 28 讲公开讲义 PDF(Lecture1–Lecture28.pdf)整理编写。 推荐教材:《Operating Systems: Principles and Practice》(2nd Edition),Thomas Anderson & Michael Dahlin。 本文档为个人学习笔记,内容版权归斯坦福大学及其作者所有,仅用于个人学习目的。
课程概览(Course Overview)
1. 课程目标与范围
CS111 是斯坦福大学的操作系统入门课,目标是让学生理解现代操作系统提供的基本设施,并学会”充分利用操作系统与硬件”。课程按主题分为三大板块,最后以若干小主题收尾:
| 板块 | 内容 | 对应作业 |
|---|---|---|
| 并发(Concurrency) | 进程与线程、上下文切换、同步、调度、死锁 | Assign1–Assign4 |
| 内存管理(Memory Management) | 链接、动态存储分配、动态地址翻译、虚拟内存、请求调页 | Assign5–Assign6 |
| 文件系统(File Systems) | 存储设备、磁盘管理与调度、目录、保护、崩溃恢复 | Assign7–Assign8 |
| 补充主题 | 闪存(Flash Memory)、虚拟机(Virtual Machines) | — |
课程的核心思想(Lecture 28 总结):
- 虚拟化(Virtualization):把一样东西变成另一样东西,或变成许多个——CPU→线程、存储→文件、主存→地址空间。
- 并发管理(Managing Concurrency):同步是系统中最难的部分之一。
- 原子性(Atomicity):让一组操作看起来像一个不可分割的操作——同步、文件系统一致性都依赖它。
- 局部性(Locality):过去往往能预测未来——调度、TLB、分页、文件缓存都建立在这一假设上。
- 分层(Layering):用高层抽象隐藏底层复杂细节。
2. 课程结构
- 授课:周一/周三/周五 11:30AM–12:20PM,Nvidia Auditorium(课程录像通过 Canvas 提供)。
- Section(习题课):每周 50 分钟,由 CA 带领 10–15 名学生做练习;需在课程网站报名。
- 作业:9 个个人作业,在 myth 集群(ssh 远程 Linux 工作站)上完成,使用 gcc/g++、make、gdb、valgrind 等工具;作业通常周四 11:59PM 截止。
- 评分:作业 35% + Section 参与 5% + 课堂参与 5% + 期中 20% + 期末 35%。
- 考试:
- 期中:5 月 7 日(周四)19:00–21:00,Cemex Auditorium,允许带 2 张双面笔记纸。
- 期末:6 月 10 日(周三)8:30–11:30,Nvidia Auditorium,允许带 3 张双面笔记纸。
- 均为闭卷纸笔考试,按座位就座(Academic Integrity Working Group 监考试点)。
3. 课程作业总览(全部有公开页面)
| 作业 | 主题 | 要点 |
|---|---|---|
| Assign0 | Welcome to CS111! | 熟悉 myth 环境、gdb、sanitycheck/submit 工具;复习 C/C++、STL;读代码 + 写少量代码。无迟交。 |
| Assign1 | Lambdas, Threads, and Processes | 用 λ 表达式创建匿名函数;创建线程(同进程内)与进程(fork);实验原子操作对并发行为的影响。 |
| Assign2 | Synchronization | 用 monitor 模式实现两个同步问题:Caltrain 乘客上车、派对宾客分组;识别竞态与死锁。 |
| Assign3 | Thread Dispatcher | 在用户态用 C++ 实现线程机制:在单个系统线程上调度任意多个用户级线程(各自独立栈、定时器中断实现 round-robin)。 |
| Assign4 | Locks & Condition Variables + Trust | 在 Assign3 基础上实现 Mutex 和 Condition(单核系统);并回答关于信任的伦理问题。 |
| Assign5 | Memory-Mapped Encrypted Files | 把加密文件映射进虚拟地址空间:请求调页——捕获 page fault、按需读页、记录脏页、关闭时回写;用 mprotect 模拟硬件特性。 |
| Assign6 | Page Replacement with the Clock Algorithm | 扩展 Assign5,让映射文件可以大于物理内存:实现 Clock 页面置换算法。 |
| Assign7 | Reading Unix V6 Filesystems | 用 C 语言实现 Unix V6(1975 年)文件系统读取器:块层 → inode 层 → 文件层。 |
| Assign8 | Journaling File System | 用 FUSE 挂载 V6 文件系统:为元数据更新加预写日志(write-ahead log)、用位图替代链表管理空闲块、崩溃后重放日志恢复一致性。无迟交。 |
