拓冰建站拓冰建站
首页 / 资讯中心 / 正文

威斯康星CS537操作系统课程资源与OSTEP三件套学习指南

这份课程资料我帮大家整理过一遍CS537 是威斯康星大学麦迪逊分校的操作系统核心课Fall 2019 版本用 OSTEP 当教材配套实验、作业、考试原题全部能拿到。如果你正在自学操作系统、准备考研复试或者在刷 OSTEP 想找配套练习这套资源值得认真过一遍。这次我们直接看威斯康星 CS537Fall 2019的完整课程体系以及配套的 OSTEP 三件套到底怎么配合使用。先说结论这不是一门“泛泛讲概念”的课整门课围绕 OSTEP 教材展开配了三个 C 语言实验项目覆盖 xv6 内核修改、并发编程和文件系统实现适合有一定 C 语言基础、想动手写内核代码的读者。先给一份核心信息速览再往下讲课程内容、实验安排、学习路径和常见问题。1. 核心能力速览能力项说明课程名称University of Wisconsin-Madison CS537: Introduction to Operating Systems开课学期Fall 2019主讲人Andrea Arpaci-Dusseau 与 Remzi Arpaci-Dusseau使用教材OSTEPOperating Systems: Three Easy Pieces配套资源OSTEP 教材 OSTEP 课后作业 CS537 实验项目实验平台xv6 教学操作系统基于 Linux 环境编程语言C 语言实验数量3 个大型实验项目P1/P2/P3资源形式课程主页、教材 PDF、投影片、作业题、实验说明、考试题目适合人群自学者、学生党、备考考研复试、刷 OSTEP 的读者是否免费是课程官网和 OSTEP 官网均可访问API/代码库非软件项目无 API但实验代码是真实 C 工程这个课程的设计思路和很多学校“纯讲 PPT”的操作系统课完全不同。CS537 的作业分为两大部分一部分是 OSTEP 书中每章后面的“Homework”作业另一部分是三个贯穿学期的实验项目。前者用来巩固概念后者用来检验代码能力。2. 适用场景与学习价值2.1 适合什么人学自学操作系统的同学已经看完 OSTEP 前几章但缺少练习CS537 的作业和实验正好补齐。准备考研复试的考生操作系统是计算机考研复试高频科目CS537 的覆盖范围贴近国内专业课大纲而且实验题能展示真实项目能力。代码基础一般但想挑战内核开发xv6 是专为教学设计的操作系统代码量只有一万行左右比 Linux 内核容易上手得多。想在简历里加“操作系统实验”项目的人三个实验做完能写出清晰的项目描述和代码仓库。2.2 能解决什么问题很多人读 OSTEP 会有一个困惑书看懂了但不会写代码也不知道内核里一个系统调用到底怎么从用户态走到内核态。CS537 的实验就是来解决这个问题的。P1 会让你修改 xv6 的调度器P2 会让你实现并发数据结构P3 会让你改动文件系统相关逻辑。做完之后你对“进程调度”“并发同步”“文件系统布局”的理解会从“知道概念”变成“能写代码”。2.3 不适合什么场景完全没学过 C 语言不建议直接开始。只想看概念、不打算动手写代码这套资源的效果会打折扣。时间紧张、只想考前突击知识点直接刷 OSTEP 和课程投影片更快实验项目短期内做不完。2.4 学习边界与合规提醒这套课程资料是公开的教学资源用于学习和研究没问题。实验代码需要自己完成不要直接复制他人仓库提交到课程系统。另外xv6 本身是 MIT 开源的教学系统CS537 基于它做二次开发实验说明也会标注来源。如果你把实验代码放到 GitHub建议注明课程出处和参考来源保持学术诚信。3. 课程完整体系拆解CS537 的课程体系设计思路很清晰教材提供理论知识投影片便于复习作业检验理解实验检验动手能力。3.1 课程大纲覆盖范围从 Fall 2019 的课程结构来看核心模块包括进程与线程进程抽象、线程模型、上下文切换。调度算法MLFQ多级反馈队列、轮转调度、比例份额调度。同步原语锁、条件变量、信号量、自旋锁。死锁死锁条件、银行家算法、实际系统中的死锁处理。地址空间与虚拟内存分页、页表、TLB、多级页表。内存分配buddy allocator、slab allocator、malloc 实现实验可能涉及。文件系统inode、目录结构、崩溃一致性、日志文件系统。I/O 与磁盘调度设备驱动、DMA、调度算法。虚拟化与容器基础部分内容会涉及。这些模块和 OSTEP 的章节一一对应复习时可以按章节检索投影片。3.2 课程主页与资源布局课程主页结构通常包含Syllabus课程安排、评分标准、截止日期。Lectures按日期排列的投影片。Readings对应 OSTEP 章节。Homework书后作业题目。Projects三份实验说明。Exams期中/期末试卷含答案。建议把课程主页完整下载到本地尤其是投影片和实验说明。有些同学在复习时会发现课程主页偶尔打不开提前备份更稳妥。3.3 OSTEP 教材版本说明OSTEP 目前有两个常见版本免费在线版和印刷版。Fall 2019 使用的章节以在线版为准。书的核心部分分为三大块虚拟化Virtualization、并发Concurrency、持久性Persistence也就是“Three Easy Pieces”这个名字的来源。读这本书时要注意它和很多国内教材的知识点编排顺序不同。OSTEP 先用大量篇幅讲虚拟化再进入并发最后讲文件系统。建议跟着课程顺序读而不是按自己过去的习惯重新排序这样和作业、实验的衔接更顺。4. OSTEP 三件套怎么配合使用所谓“三件套”是指 OSTEP 教材、OSTEP 课后作业、OSTEP 对应代码实验。三者是一个整体。4.1 第一件教材正文读取方式是“先看问题再看解答”。每章开头会抛出真实问题比如“如何让一个程序看起来独占 CPU”然后逐步推导解决方案。这也是 CS537 上课的习惯先给场景再给机制。示例读调度器章节时可以带着几个问题去读为什么需要抢占式调度MLFQ 如何解决“只知道局部信息”的调度问题各调度算法的时间复杂度是多少读完后去看对应的投影片重点看老师怎么把书里的机制画成图。4.2 第二件课后作业OSTEP 官网为每章准备了 Homework很多是模拟程序。比如调度章节的scheduler.py是 Python 脚本可以模拟各种调度算法的执行过程分页章节的paging-policy.py可以模拟不同页面置换策略。作业形式举例# 以 MLFQ 调度作业为例 python scheduler.py --sched mlfq --jlist 0,100,20,200,30,300 -q 10 -j 3 -n 3自己动手改参数、观察结果、和理论预测对比能加深理解。CS537 的评分里Homework 也占一定比重要求提交答案和简短分析。4.3 第三件实验项目ProjectsCS537 的实验项目是整套资源里最有价值的部分。Fall 2019 共有三个 Project全部围绕 xv6 系统进行开发。5. 三个实验项目解析这是整套课程的重头戏。三个项目难度梯度明显P1 偏简单P2 进入并发编程P3 深入到文件系统。5.1 P1xv6 系统调用与调度器第一个项目通常会涉及给 xv6 增加系统调用并实现一种新的调度策略。主要锻炼的是阅读内核代码的能力。用户态和内核态的切换路径。进程结构体struct proc的字段含义。调度器的基本结构。常见的实现目标包括增加一个系统调用比如getpid_count()或其他自定义调用。修改调度器把默认的轮转调度改为优先级调度或者实现 lottery scheduling彩票调度。通过测试程序验证调度结果。这部分的基础是理解 xv6 启动过程中main()如何初始化第一个进程以及scheduler()如何在进程间切换。调试时可以加cprintf输出观察执行顺序。5.2 P2并发编程第二个项目是纯用户态并发编程不涉及内核修改。常用的题目形式是实现一个并发哈希表concurrent hash table。实现一个并发队列或并发计数器。使用 pthread 库和信号量/条件变量解决生产者消费者问题。实现一个简单的读写锁。这部分主要考察锁的粒度粗粒度锁和细粒度锁的性能差异。条件变量的使用。无锁编程的基础部分年份可能涉及。使用-fsanitizethread或 valgrind 排查数据竞争。性能测试是关键。提交报告时通常要给出不同线程数下的吞吐量分析锁竞争瓶颈。5.3 P3文件系统第三个项目通常是文件系统相关。常见形式有在用户态模拟一个文件系统FUSE 或独立模拟。修改 xv6 的文件系统代码比如支持更大的文件、实现日志机制等。实现磁盘块分配策略顺序分配、索引分配等的模拟。这一部分要求理解 inode、目录项、超级块、块位图等概念。调试文件系统代码很容易“跑一遍就崩”建议提前写好单元测试并在修改关键数据结构时先画清楚磁盘布局。5.4 实验评分标准参考CS537 通常有一套自动评分脚本测试程序会覆盖边界情况。比如调度实验会测试短任务和长任务混杂、进程退出、多核并发等场景。所以提交前一定要跑通官方提供的测试程序。用自己的测试用例补充边界测试。做性能和正确性的回归对比。6. 学习路线与进度建议根据课程安排一般是 15 周可以给自己排一个 12-16 周的复习计划。6.1 第一阶段OS 基础与 C 语言复习第 1 周复习 C 语言指针、结构体、链表。熟悉 Linux 命令行、gcc、gdb、make。阅读 xv6 源码中的proc.c、syscall.c、trap.c不要求全部看懂先建立整体结构印象。# 克隆 xv6 源码以 xv6-public 为例 git clone https://github.com/mit-pdos/xv6-public.git cd xv6-public make make qemu如果make qemu能进入 xv6 的 shell说明环境已经准备好。6.2 第二阶段系统调用与调度第 2-5 周对应 OSTEP 的虚拟化章节和 P1 实验。具体节奏读 OSTEP 第 4-7 章进程、API、机制、调度。完成课后作业中的调度模拟。通读 xv6 的proc.c和syscall.c。完成 P1。注意P1 是最适合“建立信心”的实验。它的代码量不大但能让你掌握实验环境的调试方法。6.3 第三阶段并发与同步第 6-9 周对应 OSTEP 并发章节和 P2 实验。读 OSTEP 第 26-31 章。写几个小的并发程序比如并发计数器、并发队列。用helgrind或 TSAN 找数据竞争。完成 P2。这个阶段最容易踩的坑是死锁和条件变量丢失唤醒。建议给每个并发结构画清楚锁的顺序。6.4 第四阶段地址空间与文件系统第 10-14 周对应 OSTEP 的虚拟内存和持久性章节以及 P3 实验。读 OSTEP 第 13-25 章虚拟化部分。读 OSTEP 第 36-42 章文件系统。做地址翻译模拟作业。完成 P3。P3 逻辑复杂调试时间要预留充足至少留两周以上。7. 使用环境与工具链虽然这不是软件产品但做实验需要完整的环境配置。7.1 推荐环境项目推荐配置操作系统LinuxUbuntu 20.04/22.04 或 DebianCPU任意 x86_64 架构均可内存4GB 以上磁盘10GB 空闲空间编译器gcc、gdb、make虚拟机QEMU其他工具git、python3用于部分作业模拟脚本7.2 xv6 环境搭建xv6 的经典版本基于 x86新版本基于 RISC-V。CS537 Fall 2019 使用的是早期的 x86 版本构建相对简单sudo apt-get update sudo apt-get install -y build-essential gdb qemu-system-x86 git python3 git clone https://github.com/mit-pdos/xv6-public.git cd xv6-public make make qemu如果启动 QEMU 时提示缺少图形界面可以改成make qemu-nox这样会以纯终端模式启动 xv6适合 SSH 环境。7.3 调试工具使用xv6 的调试通常依赖 gdb 和 QEMU 的调试端口。启动调试模式make qemu-gdb然后在另一个终端进入 gdbgdb kernel target remote localhost:26000 break scheduler continue这个调试方式对 P1 调度器实验特别有用。8. 资源获取与备份建议获取整套课程资源时建议采用分层策略课程主页直接下载所有投影片 PDF。OSTEP 官网下载教材 PDF 和 Homework 说明。实验代码模板如果有官方模板直接克隆仓库。笔记与复习资料自己整理或参考 GitHub 上公开的笔记。注意不要直接把别人的实验代码提交到课程系统这会涉及学术诚信问题。自己的学习笔记和代码仓库可以公开但要标注出处。9. 常见问题与排查方法问题现象可能原因排查方式解决方案make qemu启动后黑屏图形界面不支持改用make qemu-nox以纯终端模式运行编译报错undefined reference to ...系统调用未添加到syscall.h或sysproc.c检查系统调用注册流程补充函数声明和系统调用号调度器运行后进程卡死没有正确调用yield()加cprintf跟踪检查调度循环里的进程状态切换并发程序偶尔出现错误结果数据竞争用 TSAN 或 helgrind 检测调整锁粒度或增加同步P3 文件系统测试崩溃磁盘块分配逻辑错误打印 inode 和块位图先画出磁盘布局再改代码课程主页无法访问网络问题或原页面调整使用 Wayback Machine 或本地备份提前保存 PDF作业模拟脚本无法运行Python 版本不兼容查看脚本头部注释安装对应 Python 版本并安装依赖实验报告提交格式不对没有按说明命名查看提交说明重新命名打包10. 最佳实践与学习建议结合自学的实际经验整理几条实用建议10.1 第一周先跑通 xv6不要急着写代码先把 xv6 跑起来随便用 shell 执行几个命令感受一下教学操作系统的结构。然后花一天时间通读README、Makefile和kernel/proc.c或对应目录。这一步能省下后面大量排错时间。10.2 每个实验先画图再写代码P1 画进程状态机P2 画锁顺序图P3 画磁盘布局图。画图的过程就是理清逻辑的过程大部分调试困难都来自“没想清楚就动手”。10.3 建立自己的测试清单自动评分脚本测试的是边界比如进程数量为 0 或 1 的情况。高并发下同步结构是否稳定。文件系统写入大量小文件。建议在写正式代码前先列一份测试清单每个功能点对应至少一个测试用例。10.4 用 Git 管理实验代码每个实验单独建仓库每个关键节点打 commit。碰到实验改了代码不工作可以快速回退再对比差异定位问题。10.5 保留一份实验报告模板CS537 的实验报告通常要求包含设计思路、关键代码说明、测试结果、遇到的问题。提前写报告比最后一天补要轻松得多。报告本身就是面试时可以展示的项目材料。11. 总结与下一步CS537 Fall 2019 是一套质量很高的操作系统学习资源。它的价值不在于投影片多华丽而在于“教材—作业—实验—考试”形成了一个完整闭环。按 OSTEP 章节顺序学知识点用 Homework 做验证再用 xv6 实验把能力落到实处这条路径比单纯刷书更能建立真实的操作系统工程能力。最先应该做的三件事下载 OSTEP 教材 PDF 和课程投影片并通读前五章。搭建 xv6 环境跑通make qemu-nox。做完第一个课后作业调度模拟感受一下 OSTEP 作业的形式。最容易踩的三个坑跳过 C 语言复习直接写实验代码能力跟不上。只读教材不动手遇到实验完全没思路。不做测试就直接提交被自动评分脚本扣分。如果你已经完成了 CS537 的 P1 实验下一步可以尝试把 P2、P3 一并做完然后对比 MIT 6.S081 的实验题两者侧重点不同CS537 偏传统 OS 机制6.S081 偏现代 OS 工程。两个都做一遍操作系统这关基本就稳了。建议收藏这篇文章需要时照着搭建环境、规划学习节奏。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门