OSTEP / 60 CHAPTERS
虚拟化、并发、持久化。
对《Operating Systems: Three Easy Pieces》每一章的原创导读。官方章节 PDF 仍在作者站点;本站不托管原书。
OSTEP / C11
本书开篇对话
开场师生对话点明书名灵感来自物理讲座笔记,把操作系统浓缩为虚拟化、并发与持久性三大支柱,并给出听课、反复读笔记加真实编程项目的学习路径,同时说明对话段落用于跳出叙述进行主动思考。
OSTEP / C11
插曲:进程 API
本插曲介绍 UNIX 进程创建与控制的核心接口。fork 复制当前进程并让父子从同一返回点继续但返回值不同,wait 让父进程阻塞直至子进程结束,exec 族则用全新可执行映像替换当前进程。三者组合既简洁又极具表达力。
OSTEP / C11
多处理器调度(进阶)
随着多核芯片普及,操作系统必须在多个CPU间分配线程。本章用原创视角讲解缓存层次带来的一致性难题、共享数据仍需锁保护的原因,以及调度器如何利用缓存亲和性来减少迁移开销。
OSTEP / C11
内存虚拟化对话
对话指出CPU虚拟化完成后,内存虚拟化才是真正的难点。用户程序发出的每个地址都是虚拟的,操作系统在硬件协助下将其映射为物理地址,从而让每个进程都以为自己拥有一块巨大、私有且连续的内存。这样做既让编程更轻松,也实现了进程间的隔离与保护。后续将从基址/界限寄存器讲起,逐步引入TLB和多级页表。
OSTEP / C11
机制:地址转换
本章介绍硬件地址转换如何让操作系统高效灵活地虚拟化内存。通过在每次访存时由硬件将虚拟地址映射到物理地址,进程获得从零开始的私有连续空间假象,同时操作系统保持隔离与保护。
OSTEP / C11
超越物理内存:策略
物理内存不够用时,操作系统必须挑选页面换出到磁盘。本章介绍如何设计置换策略以降低缺页次数,并以无法实现的最优算法作为比较基准,同时分析简单的FIFO方法及其局限。
OSTEP / C11
完整虚拟内存系统
本章通过VAX/VMS和Linux两个实例,说明如何将页表设计、TLB管理、页面替换以及其他性能、安全与功能特性组合成一个能在从嵌入式设备到超级计算机上运行的完整虚拟内存系统。
OSTEP / C11
内存虚拟化总结对话
师生对话梳理虚拟内存核心心智模型:用户程序只接触虚拟地址,TLB让转换变得可行,页表结构需灵活适配稀疏空间,交换机制揭示真实硬件约束。目标是能独立诊断系统异常行为。
OSTEP / C11
关于并发的对话
教授与学生通过多人争抢桌上桃子的日常场景引入并发思想,指出无协调的同时抓取会造成冲突,而排队虽能保证人人有份却牺牲了速度。理想方案必须同时满足正确与高效。随后将类比映射到多线程程序:线程如同独立行动者,共享内存位置就像那些桃子,必须加以协调。操作系统课程关注此主题,是因为内核既要向应用提供锁等同步原语,其自身作为最早的并发程序也必须极其小心地管理内部数据。
OSTEP / C11
并发:简介
本章用全新视角介绍线程:同一进程内部可以同时存在多条独立执行流,它们共享整块地址空间。每条线程自带程序计数器和寄存器,切换时不必更换页表。每个线程还拥有私有栈。引入线程主要是为了利用多核真正并行,以及在部分线程等待I/O时让其余线程继续前进。
OSTEP / C11
插曲:线程 API
本插曲概述 POSIX 线程库的核心调用,用于启动新执行流、等待它们结束以及用互斥锁保护共享数据。接口设计兼顾易用性与灵活性,后续章节会用大量例子展开锁与条件变量。
OSTEP / C11
条件变量
条件变量让线程能够高效地休眠直到某个共享条件变为真,从而避免无意义的自旋。它必须与互斥锁配合,通过wait原子释放锁并睡眠、signal唤醒等待者,并依靠显式状态变量防止信号丢失。
OSTEP / C11
信号量
信号量用一个整数计数器加上阻塞与唤醒原语来协调线程。初始化值决定它充当互斥锁还是事件通知器。本章用独立示例说明 wait/post 语义、二元用法以及父子线程排序,并给出可编译的 C 演示。
OSTEP / C11
基于事件的并发(进阶)
本章介绍不依赖线程构建并发服务器的方法。程序围绕事件循环运行,一次只处理一个到达的事件,从而获得对调度的完全控制并消除锁的需求。关键限制是处理程序绝不能执行会阻塞的操作。
OSTEP / C11
廉价磁盘冗余阵列(RAID)
RAID通过将多块廉价磁盘组织成阵列,在保持对主机系统完全透明的前提下同时提升容量、吞吐和容错能力。本章介绍其对外接口、故障假设、三维评估方法以及最基础的条带化组织。
OSTEP / C11
文件系统实现
本章通过一个极简的 vsfs 示例展示如何在纯软件层面设计磁盘上的核心结构来管理文件,重点讲解超级块、位图、inode 表与数据区的分工,以及系统调用如何映射到这些结构上。
OSTEP / C11
局部性与快速文件系统
原始UNIX文件系统把磁盘当成随机存储器来用,inode远离数据、空闲空间碎片化、块太小,实际带宽只有磁盘能力的百分之几。快速文件系统通过柱面组(块组)和局部性启发式,把相关文件和元数据放在一起,让寻道变短、顺序传输变长,性能因此大幅提升。
OSTEP / C11
崩溃一致性:FSCK 与日志
文件系统在磁盘上维护 inode、位图和数据块,一次操作常需多次写入。崩溃可能使状态只部分更新,产生不一致。本章用原创讲解介绍 fsck 事后扫描修复,以及日志(预写日志)如何用少量开销实现快速恢复。
OSTEP / C11
数据完整性与保护
本章探讨在硬件不可靠时如何保证写入存储的数据日后能原样读回。内容涵盖局部磁盘故障(潜在扇区错误与静默损坏)、冗余恢复手段以及校验和检测技术,并强调空间与时间开销的权衡。
OSTEP / C11
持久性总结对话
本对话回顾了操作系统持久性存储的核心难点:崩溃后数据必须存活、更新过程需要可靠恢复,以及磁盘调度、RAID、校验和与设备感知文件系统设计。这些思想在闪存时代依然适用。
OSTEP / C11
网络文件系统(NFS)
本章介绍早期成功的分布式文件系统 NFS,重点讲解客户端-服务器模型如何实现数据共享与透明访问,以及 NFSv2 如何通过完全无状态的协议实现服务器崩溃后的瞬间恢复。
OSTEP / C11
安德鲁文件系统(AFS)
本章探讨AFS如何借助客户端本地磁盘上的全文件缓存以及服务器主动回调,显著降低服务器负担并实现高可扩展性,同时对比其与NFS轮询模型的差异以及两个版本协议的演进。
OSTEP / C11
分布式系统总结对话
本总结以轻松对话形式回顾分布式系统的核心思想。组件故障不可避免,但通过部署大量磁盘或机器可以掩盖许多故障。重试等简单机制对瞬时问题非常有效。协议中交换的精确位串决定了系统如何应对故障以及能否良好扩展。对话以幽默方式结束,强调持续学习的重要性。
OSTEP / C11
访问控制
本章介绍操作系统如何将既定安全策略转化为对每次资源请求的允许或拒绝判定,重点讨论参考监视器的职责、主体与客体模型,以及访问控制列表和能力两种实现路径在效率与灵活性上的差异。
OSTEP / C11
密码学
操作系统无法保护已经离开其硬件管辖范围的数据。密码学借助密钥把明文变成密文,使未授权者即便拿到比特也无法还原含义或进行可控篡改。本章用原创讲解介绍对称加密模型、密钥保密的决定性作用,以及哈希如何提供完整性检测。
OSTEP / C11
分布式系统安全
本章探讨分布式系统特有的安全挑战:单机操作系统无法管辖远程主机,也无法完全信任中间网络。密码或公钥认证加上证书颁发机构签发的证书,是在不可信环境中建立身份并保护通信的核心手段。