操作系统
Operating Systems
📖这门课到底讲什么
操作系统研究如何管理硬件资源并向上提供抽象:进程与线程、CPU 调度、同步与互斥(信号量、管程、经典同步问题)、死锁的检测与避免、内存管理(虚拟内存、分页与分段、页面置换算法)、文件系统(目录结构、inode、磁盘调度与日志)、I/O 与设备管理,并涉及并发编程与系统调用接口。它把计算机组成原理、数据结构与编程语言连成一体,是全专业最核心也最难的课程之一。学完你应能解释一次系统调用的完整路径、分析并发程序的竞态与死锁、计算页面置换的缺页次数、设计并实现基于文件与进程的小型系统工具。
🎯为什么必须学好
考研 408 中操作系统约三十五分,是必考科目;面试中进程与线程的区别、线程切换的开销、死锁四个必要条件、虚拟内存与缺页中断、select/poll/epoll 的本质区别,全部出自这里。后端、基础架构、云原生、嵌入式方向都要求对操作系统有真实理解。读过源码或做过实验的人在性能调优与故障排查上有明显优势,这是能否进入系统方向的分水岭。
📌核心知识清单
- 操作系统概览与系统调用:内核态与用户态切换、中断与异常、系统调用的执行路径、 monolithic 与微内核
- 进程与线程:进程状态与上下文切换、线程模型与实现方式、进程创建 fork 与 exec、进程间通信(管道、消息队列、共享内存、信号)
- CPU 调度:先来先服务、短作业优先、时间片轮转、多级反馈队列、实时调度与优先级反转
- 同步与互斥:临界区问题、信号量与 PV 操作、管程与条件变量、生产者消费者与读者写者问题、死锁四个必要条件与银行家算法
- 内存管理基础:地址空间与地址重定位、分页、分段、段页式、空闲空间管理(位图与空闲链表)
- 虚拟内存:页表与多级页表、TLB 与地址转换、缺页中断处理、页面置换算法(FIFO/LRU/Clock)、工作集与抖动
- 文件系统:文件与目录、inode 与索引节点、连续与链接与索引分配、空闲空间管理、日志式文件系统、磁盘调度(电梯算法)
- I/O 与并发模型:中断与 DMA、缓冲与设备驱动、阻塞与非阻塞 IO、多路复用 select/poll/epoll 的演化
✍️怎么学(可执行步骤)
- 主线教材在《现代操作系统》(Tanenbaum)与《操作系统导论》(OSTEP)之间二选一为深度,再以汤小丹《计算机操作系统》应对考试风格;OSTEP 的作业必须做
- 把经典同步问题手写实现:用信号量实现生产者消费者、读者写者、哲学家就餐,用 pthread 或 Python threading 跑起来并制造死锁观察现象
- 配合 MIT 6.S081 或 xv6 实验做系统调用、页表、线程切换相关实验,读 xv6 源码(约一万行)是理解操作系统最有效的路径
- 整理一张机制与策略对照表:每个子系统解决什么问题、有哪些策略、各自的代价,考试与面试都按这个框架回答
📚推荐教材与书籍
免费英文原版与中译本,按虚拟化、并发、持久化三部分组织,配套作业质量极高,重点读虚拟化与并发部分
体系完整、案例丰富,进程与死锁、内存管理章节经典,适合系统建立理论框架
国内考研主流教材,与 408 考点契合,重点是进程同步、页面置换与文件系统章节
第8章异常控制流、第9章虚拟内存、第12章并发编程是本课最好的实践补充
🎬视频课程 / 公开课
推荐南京大学蒋炎岩或哈工大版本,实验与讲解结合紧密
用 xv6 做实验,从系统调用到文件系统逐层实现,是含金量极高的操作系统实践课
教材免费下载,配套作业(并发、页表、调度模拟器)非常适合自学
🌐网站与文档
自己动手写操作系统的百科,涉及引导、分页、中断描述符表等底层细节
查调度器、内存管理与文件系统实现的权威文档
C++ 并发原语的规范参考,做多线程实验时对照使用
🐙GitHub 开源资料
Linux 内核源码,可挑 scheduler、mm、fs 目录下的关键文件阅读,理解工业级实现
教学操作系统源码,规模小结构清晰,是理解进程、页表、文件系统的最佳读本
操作系统笔记与面试题整理,适合复习时快速定位知识点
Linux 内核学习资料汇编,含子系统学习路线与书籍推荐
🧪动手实践任务
实践 1
用 pthread 或 Java 线程实现生产者消费者与读者写者两个模型,分别用信号量与管程两种方式实现,并构造死锁场景并用工具定位
实践 2
写一个页面置换算法模拟器:实现 FIFO、LRU、Clock 三种算法,给定访问序列与内存块数,输出每种算法的缺页次数与缺页率并对比
实践 3
在 xv6 或 Linux 上完成系统调用相关实验:新增一个统计进程系统调用次数的接口,或实现一个共享内存通信的父子进程程序
实践 4
写一个简易 Shell:支持执行外部命令、内建命令(cd/exit)、管道与重定向,用 fork 与 exec 实现,这是理解进程控制的最好练习
🧾考试与面试
💼 面试会怎么考
高频:进程与线程的区别(资源、切换开销、通信方式)、线程切换与进程切换各保存了什么;线程的几种实现模型与用户态线程的意义;死锁的四个必要条件与避免策略、如何排查线上死锁(jstack、gdb);虚拟内存的作用、缺页中断的完整处理流程、为什么用多级页表;LRU 如何实现、为什么实际系统用近似算法;select、poll、epoll 的区别与 LT 与 ET 模式;IO 多路复用与异步 IO 的区别;僵尸进程与孤儿进程。
📝 期末与考研怎么过
期末题型:概念选择题、PV 操作大题(生产者消费者、前驱图同步)、调度算法计算(周转时间、带权周转时间)、页面置换计算(FIFO 与 LRU 的缺页次数)、磁盘调度计算、死锁判断与银行家算法。考研 408 中此部分计算题多且套路固定,建议把近十年真题刷两遍。目标期末八十分以上,考研争取九成以上正确率。
⚠️ 常见坑
- PV 操作只背模板不理解信号量初值与含义,遇到前驱图或复杂同步约束就写不出来
- 页面置换计算时忽略访问序列中的命中判断与写回问题,缺页次数算错;应画表逐次追踪
- 只学理论不做实验,无法解释 fork 的返回值为两次、exec 后代码段如何被替换
- 混淆阻塞 IO 与异步 IO、IO 多路复用与多线程,面试时概念混乱是明显减分项
- 忽视并发程序的可见性与原子性,认为加锁只影响性能,不知道不加锁会导致数据竞争