README · operating-systems
操作系统
操作系统研究的是:如何把有限、复杂、危险的硬件资源,包装成多个程序都能安全使用的抽象。
对 CS 学生来说,任何程序只要运行在真实机器上,就绕不开 OS:进程、线程、内存、文件、Socket、设备、CPU 调度、IO 阻塞、上下文切换,都由 OS 参与管理。
本模块适合写成的博客问题
| 问题 | 对应章节 |
|---|---|
| 为什么程序没有崩溃,却像停住了一样? | 01 进程、线程与 CPU 调度 |
| 用户程序为什么不能直接操作所有硬件? | 02 系统调用 |
| 为什么内存看起来够,程序仍然会抖动或被终止? | 03 内存管理 |
| 为什么并发 bug 只在某些时序下出现? | 04 并发与同步 |
| 为什么 write 成功不等于数据已经安全落盘? | 05 文件系统 |
| 为什么同样是 IO,阻塞、非阻塞、多路复用体验差很多? | 06 IO 模型 |
学习路线
| 顺序 | 章节 | 核心问题 |
|---|---|---|
| 00 | 从 0 开始理解操作系统 | OS 为什么存在 |
| 01 | 进程、线程与 CPU 调度 | 程序如何并发运行 |
| 02 | 系统调用 | 用户程序如何请求内核服务 |
| 03 | 内存管理 | 虚拟内存、页表、堆栈、缺页 |
| 04 | 并发与同步 | 锁、信号量、条件变量、死锁 |
| 05 | 文件系统 | 文件、目录、inode、页缓存、崩溃一致性 |
| 06 | IO 模型 | 阻塞、非阻塞、多路复用、异步 |
| 07 | 设备、驱动与中断 | 硬件事件如何通知 CPU,驱动如何管理设备 |
| 08 | Socket 与内核网络栈 | 连接、端口、缓冲区、协议栈在 OS 里如何工作 |
| 09 | 进程间通信与信号 | 进程如何交换数据和事件 |
| 10 | 虚拟化、容器与资源隔离 | OS 如何把机器切成多个隔离环境 |
| 11 | 性能与排障 | CPU、内存、IO、上下文切换怎么查 |
本模块固定观察点
- OS 提供了什么抽象。
- 这个抽象隐藏了哪些硬件细节。
- 内核态和用户态如何切换。
- 编程语言运行时和应用程序如何建立在这些抽象上。
本模块读法
操作系统要一直按“资源 -> 抽象 -> 代价 -> 故障现象”来读:
CPU 资源 -> 进程/线程/调度 -> 上下文切换/饥饿 -> CPU 高或任务卡住
内存资源 -> 虚拟内存/页表 -> 缺页/swap/OOM -> 延迟抖动或进程被杀
存储资源 -> 文件系统/页缓存 -> 刷盘/一致性 -> 文件慢或数据丢失
设备资源 -> 中断/DMA/驱动 -> 中断风暴/队列 -> IO 慢或 CPU 忙
网络资源 -> Socket/缓冲区 -> 阻塞/排队/超时 -> 连接慢或吞吐低
不要只背概念名。每章都要能回答:OS 管了什么资源,提供了什么抽象,隐藏了什么硬件细节,什么时候抽象会泄漏成性能或可靠性问题。