C++ / a working model

OSTEP / 60 CHAPTERS

虚拟化、并发、持久化。

对《Operating Systems: Three Easy Pieces》每一章的原创导读。官方章节 PDF 仍在作者站点;本站不托管原书。

https://pages.cs.wisc.edu/~remzi/OSTEP/

01

OSTEP / C11

前言

本书以费曼讲义为灵感,围绕虚拟化、并发与持久性三大主题展开,介绍问题驱动的章节结构、时间线、对话等教学手法,并说明免费获取方式、课程安排以及面向教师和学生的实践建议。

02

OSTEP / C11

本书开篇对话

开场师生对话点明书名灵感来自物理讲座笔记,把操作系统浓缩为虚拟化、并发与持久性三大支柱,并给出听课、反复读笔记加真实编程项目的学习路径,同时说明对话段落用于跳出叙述进行主动思考。

03

OSTEP / C11

操作系统导论

本章概述操作系统如何通过虚拟化将有限的物理硬件转变为易于使用的抽象,同时充当资源管理器和标准接口提供者。

04

OSTEP / C11

关于虚拟化的对话

师生通过轻松对话揭示操作系统如何把单一物理CPU变成多个虚拟CPU,让每个程序都以为自己独占处理器。

05

OSTEP / C11

抽象:进程

本章介绍进程作为运行程序的操作系统抽象,解释CPU虚拟化、进程状态组成以及如何从程序创建进程。

06

OSTEP / C11

插曲:进程 API

本插曲介绍 UNIX 进程创建与控制的核心接口。fork 复制当前进程并让父子从同一返回点继续但返回值不同,wait 让父进程阻塞直至子进程结束,exec 族则用全新可执行映像替换当前进程。三者组合既简洁又极具表达力。

07

OSTEP / C11

机制:受限直接执行

操作系统通过受限直接执行高效虚拟化CPU:用户程序直接在处理器上运行以获得速度,同时依靠硬件模式切换和陷阱指令让内核始终掌握控制权。

08

OSTEP / C11

调度:引言

本章建立思考调度策略的基本框架,先列出一组简化工作负载假设,再引入周转时间作为核心性能指标,随后考察先进先出与最短作业优先两类早期算法及其适用边界。

09

OSTEP / C11

调度:多级反馈队列

多级反馈队列(MLFQ)根据作业在运行中表现出的行为动态调整优先级,从而在缺乏作业长度先验知识的情况下,同时改善交互作业的响应时间和长作业的周转时间。

10

OSTEP / C11

调度:比例份额

本章介绍一种按指定比例分配处理器时间的调度思路,核心是给作业发放票券并用随机抽奖决定下一次运行者,同时说明若干票券操作技巧以及为何该方法实现简单却只保证概率公平。

11

OSTEP / C11

多处理器调度(进阶)

随着多核芯片普及,操作系统必须在多个CPU间分配线程。本章用原创视角讲解缓存层次带来的一致性难题、共享数据仍需锁保护的原因,以及调度器如何利用缓存亲和性来减少迁移开销。

12

OSTEP / C11

CPU虚拟化的总结对话

本对话回顾操作系统如何通过硬件机制与谨慎策略实现CPU虚拟化,强调控制权保持、调度权衡以及实际系统中的工程现实。

13

OSTEP / C11

内存虚拟化对话

对话指出CPU虚拟化完成后,内存虚拟化才是真正的难点。用户程序发出的每个地址都是虚拟的,操作系统在硬件协助下将其映射为物理地址,从而让每个进程都以为自己拥有一块巨大、私有且连续的内存。这样做既让编程更轻松,也实现了进程间的隔离与保护。后续将从基址/界限寄存器讲起,逐步引入TLB和多级页表。

14

OSTEP / C11

抽象:地址空间

本章介绍操作系统如何将物理内存抽象为每个进程私有的地址空间,使多个程序能同时驻留内存并安全运行,同时保持对程序员透明。

15

OSTEP / C11

插曲:内存API

C程序依赖栈上的自动分配和堆上的显式请求来管理数据寿命。理解malloc与free的正确配对以及常见误用,是写出健壮软件的关键。

16

OSTEP / C11

机制:地址转换

本章介绍硬件地址转换如何让操作系统高效灵活地虚拟化内存。通过在每次访存时由硬件将虚拟地址映射到物理地址,进程获得从零开始的私有连续空间假象,同时操作系统保持隔离与保护。

17

OSTEP / C11

分段

分段用多组独立的基址与界限寄存器把代码、堆、栈分别放到物理内存的不同位置,从而避免稀疏地址空间中的空洞浪费物理页。

18

OSTEP / C11

空闲空间管理

本章讲解内存分配器面对可变大小空闲区域时的核心难题,重点分析外部碎片成因以及分割、合并、头部记录等基础机制如何帮助维持可用连续空间。

19

OSTEP / C11

分页:引言

分页将虚拟地址空间和物理内存都切成固定大小的页与页框,彻底避开分段的外部碎片。每个进程用私有页表记录映射,硬件仅需把虚拟页号换成物理框号即可完成转换。

20

OSTEP / C11

分页:更快的转换(TLB)

没有硬件转换缓存,分页会太慢。TLB利用局部性,使大多数地址转换在几个周期内完成,而不是需要内存访问。

21

OSTEP / C11

分页:缩小页表

线性页表会吞噬大量内存。本章用全新表述探讨增大页、分页与分段混合等压缩方法,并指出由此引入的内部碎片与硬件检查代价。

22

OSTEP / C11

超越物理内存:机制

操作系统借助较慢的辅助存储作为交换区,并在页表项中增加存在位,从而在物理内存不足时仍为多个大地址空间进程提供透明的虚拟内存假象。缺页由软件处理程序完成调入。

23

OSTEP / C11

超越物理内存:策略

物理内存不够用时,操作系统必须挑选页面换出到磁盘。本章介绍如何设计置换策略以降低缺页次数,并以无法实现的最优算法作为比较基准,同时分析简单的FIFO方法及其局限。

24

OSTEP / C11

完整虚拟内存系统

本章通过VAX/VMS和Linux两个实例,说明如何将页表设计、TLB管理、页面替换以及其他性能、安全与功能特性组合成一个能在从嵌入式设备到超级计算机上运行的完整虚拟内存系统。

25

OSTEP / C11

内存虚拟化总结对话

师生对话梳理虚拟内存核心心智模型:用户程序只接触虚拟地址,TLB让转换变得可行,页表结构需灵活适配稀疏空间,交换机制揭示真实硬件约束。目标是能独立诊断系统异常行为。

26

OSTEP / C11

关于并发的对话

教授与学生通过多人争抢桌上桃子的日常场景引入并发思想,指出无协调的同时抓取会造成冲突,而排队虽能保证人人有份却牺牲了速度。理想方案必须同时满足正确与高效。随后将类比映射到多线程程序:线程如同独立行动者,共享内存位置就像那些桃子,必须加以协调。操作系统课程关注此主题,是因为内核既要向应用提供锁等同步原语,其自身作为最早的并发程序也必须极其小心地管理内部数据。

27

OSTEP / C11

并发:简介

本章用全新视角介绍线程:同一进程内部可以同时存在多条独立执行流,它们共享整块地址空间。每条线程自带程序计数器和寄存器,切换时不必更换页表。每个线程还拥有私有栈。引入线程主要是为了利用多核真正并行,以及在部分线程等待I/O时让其余线程继续前进。

28

OSTEP / C11

插曲:线程 API

本插曲概述 POSIX 线程库的核心调用,用于启动新执行流、等待它们结束以及用互斥锁保护共享数据。接口设计兼顾易用性与灵活性,后续章节会用大量例子展开锁与条件变量。

29

OSTEP / C11

锁允许程序员保护临界区,确保共享数据的更新以原子方式发生,从而避免并发线程之间的竞态条件。

30

OSTEP / C11

基于锁的并发数据结构

本章探讨如何向常见数据结构添加锁以实现线程安全,同时分析简单锁定方案的性能局限以及通过近似技术提升可扩展性的方法,重点以计数器为例。

31

OSTEP / C11

条件变量

条件变量让线程能够高效地休眠直到某个共享条件变为真,从而避免无意义的自旋。它必须与互斥锁配合,通过wait原子释放锁并睡眠、signal唤醒等待者,并依靠显式状态变量防止信号丢失。

32

OSTEP / C11

信号量

信号量用一个整数计数器加上阻塞与唤醒原语来协调线程。初始化值决定它充当互斥锁还是事件通知器。本章用独立示例说明 wait/post 语义、二元用法以及父子线程排序,并给出可编译的 C 演示。

33

OSTEP / C11

常见并发问题

本章分析并发软件中反复出现的缺陷模式,重点区分死锁与非死锁问题,后者主要包括原子性假设失败和执行顺序颠倒。通过同步原语可有效缓解这些风险,提升多线程代码的可靠性。

34

OSTEP / C11

基于事件的并发(进阶)

本章介绍不依赖线程构建并发服务器的方法。程序围绕事件循环运行,一次只处理一个到达的事件,从而获得对调度的完全控制并消除锁的需求。关键限制是处理程序绝不能执行会阻塞的操作。

35

OSTEP / C11

并发编程总结对话

本总结探讨并发执行带来的思维挑战,并强调通过简化设计和成熟模式来编写可靠的并发程序。

36

OSTEP / C11

持久性主题对话

本原创对话通过新鲜类比阐述操作系统如何确保信息在关机或故障后依然存在,揭示持久存储背后的额外工作与设计趣味。

37

OSTEP / C11

I/O 设备

本章讲解操作系统如何将输入输出设备融入整体系统,涵盖层次化总线架构、设备对外接口与内部实现、基于寄存器的轮询协议,以及用中断实现计算与I/O重叠的方法。

38

OSTEP / C11

硬盘驱动器

本章讲解硬盘如何以扇区数组形式持久保存数据,盘片磁道磁头的几何布局,以及寻道与旋转延迟如何决定访问成本。调度策略通过重排请求显著提升吞吐。

39

OSTEP / C11

廉价磁盘冗余阵列(RAID)

RAID通过将多块廉价磁盘组织成阵列,在保持对主机系统完全透明的前提下同时提升容量、吞吐和容错能力。本章介绍其对外接口、故障假设、三维评估方法以及最基础的条带化组织。

40

OSTEP / C11

插曲:文件与目录

本章用原创视角讲解操作系统如何把持久设备虚拟成文件与目录两层抽象,并展示UNIX风格的创建、读写与删除接口如何把内部inode编号隐藏在人类可读路径之后。

41

OSTEP / C11

文件系统实现

本章通过一个极简的 vsfs 示例展示如何在纯软件层面设计磁盘上的核心结构来管理文件,重点讲解超级块、位图、inode 表与数据区的分工,以及系统调用如何映射到这些结构上。

42

OSTEP / C11

局部性与快速文件系统

原始UNIX文件系统把磁盘当成随机存储器来用,inode远离数据、空闲空间碎片化、块太小,实际带宽只有磁盘能力的百分之几。快速文件系统通过柱面组(块组)和局部性启发式,把相关文件和元数据放在一起,让寻道变短、顺序传输变长,性能因此大幅提升。

43

OSTEP / C11

崩溃一致性:FSCK 与日志

文件系统在磁盘上维护 inode、位图和数据块,一次操作常需多次写入。崩溃可能使状态只部分更新,产生不一致。本章用原创讲解介绍 fsck 事后扫描修复,以及日志(预写日志)如何用少量开销实现快速恢复。

44

OSTEP / C11

日志结构文件系统

日志结构文件系统通过内存缓冲全部更新(含元数据)并以大段顺序写入空闲磁盘区域,应对缓存增大后的写主导流量,逼近峰值带宽并缓解RAID小写惩罚。

45

OSTEP / C11

基于闪存的固态硬盘

本章介绍NAND闪存如何构成现代固态硬盘,重点讲解页编程前必须整块擦除的物理限制、单元磨损问题,以及这些特性如何影响存储系统的设计与实现。

46

OSTEP / C11

数据完整性与保护

本章探讨在硬件不可靠时如何保证写入存储的数据日后能原样读回。内容涵盖局部磁盘故障(潜在扇区错误与静默损坏)、冗余恢复手段以及校验和检测技术,并强调空间与时间开销的权衡。

47

OSTEP / C11

持久性总结对话

本对话回顾了操作系统持久性存储的核心难点:崩溃后数据必须存活、更新过程需要可靠恢复,以及磁盘调度、RAID、校验和与设备感知文件系统设计。这些思想在闪存时代依然适用。

48

OSTEP / C11

分布式系统对话

师生对话引入分布式系统的基本概念,说明多机协作的不可靠性以及复制与重试等应对手段,为后续分布式文件系统章节做铺垫。

49

OSTEP / C11

分布式系统

分布式系统把多台机器经网络连成整体服务。单机、磁盘和链路会故障,但冗余能让用户感觉系统几乎永不中断。通信本质不可靠,必须依靠校验和、确认与重传来构建可用协议。

50

OSTEP / C11

网络文件系统(NFS)

本章介绍早期成功的分布式文件系统 NFS,重点讲解客户端-服务器模型如何实现数据共享与透明访问,以及 NFSv2 如何通过完全无状态的协议实现服务器崩溃后的瞬间恢复。

51

OSTEP / C11

安德鲁文件系统(AFS)

本章探讨AFS如何借助客户端本地磁盘上的全文件缓存以及服务器主动回调,显著降低服务器负担并实现高可扩展性,同时对比其与NFS轮询模型的差异以及两个版本协议的演进。

52

OSTEP / C11

分布式系统总结对话

本总结以轻松对话形式回顾分布式系统的核心思想。组件故障不可避免,但通过部署大量磁盘或机器可以掩盖许多故障。重试等简单机制对瞬时问题非常有效。协议中交换的精确位串决定了系统如何应对故障以及能否良好扩展。对话以幽默方式结束,强调持续学习的重要性。

53

OSTEP / C11

关于安全的对话

本对话介绍操作系统安全,强调与可靠性的不同,因为存在故意的对手。它涵盖保护机密、完整和可用资源的需求,以及应对聪明持久攻击者的挑战。

54

OSTEP / C11

操作系统安全简介

本章介绍操作系统安全的重要性,解释为何操作系统作为所有计算的基础必须受到保护,并讨论实现安全所面临的挑战。

55

OSTEP / C11

身份认证

操作系统必须可靠识别每个进程背后的主体才能正确执行安全策略。本章讨论身份如何通过进程继承以及登录时的初始绑定附加到进程上。

56

OSTEP / C11

访问控制

本章介绍操作系统如何将既定安全策略转化为对每次资源请求的允许或拒绝判定,重点讨论参考监视器的职责、主体与客体模型,以及访问控制列表和能力两种实现路径在效率与灵活性上的差异。

57

OSTEP / C11

密码学

操作系统无法保护已经离开其硬件管辖范围的数据。密码学借助密钥把明文变成密文,使未授权者即便拿到比特也无法还原含义或进行可控篡改。本章用原创讲解介绍对称加密模型、密钥保密的决定性作用,以及哈希如何提供完整性检测。

58

OSTEP / C11

分布式系统安全

本章探讨分布式系统特有的安全挑战:单机操作系统无法管辖远程主机,也无法完全信任中间网络。密码或公钥认证加上证书颁发机构签发的证书,是在不可信环境中建立身份并保护通信的核心手段。

59

OSTEP / C11

虚拟机

虚拟机监视器在硬件与操作系统之间插入透明抽象层,让多个客户操作系统同时运行并各自以为独占机器。本附录讲解其历史背景、当代用途以及CPU虚拟化的关键机制。

60

OSTEP / C11

管程

本附录介绍管程如何将共享数据与访问操作封装为单一模块并自动提供互斥,同时通过条件变量实现等待与唤醒,并对比Hoare与Mesa两种语义在实际系统中的差异。