索引 / 001 ZH-TW
作業系統:三個簡單部分 cover

電腦科學

電腦科學

作業系統:三個簡單部分

Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau

英文原名: Operating Systems: Three Easy Pieces

圍繞虛擬化、並行與持久化三個核心概念,介紹現代作業系統如何管理處理器、記憶體與儲存。

難度等級
高級
學術層次
大學部
作業系統虛擬化行程並行虛擬記憶體檔案系統系統程式設計

01 / 導讀

導讀

引用

Arpaci-Dusseau, R. H., & Arpaci-Dusseau, A. C. (2018–2023). Operating Systems: Three Easy Pieces (version 1.10). Arpaci-Dusseau Books. Free official edition: https://pages.cs.wisc.edu/~remzi/OSTEP/

章節概要

全書圍繞三個主題組織:虛擬化、並行和持久性。每個主題由教授與學生之間的一段簡短對話引入,隨後的各章通常以一個方框標出的「問題癥結」(crux)開頭。書的最前面是導論;三大部分之後是分散式系統部分和 Peter Reiher(加州大學洛杉磯分校)撰寫的安全章節;附錄涉及虛擬機器監控器、管程、C 語言教程和實驗構想。

第1–2章:關於本書的對話;作業系統導論

開篇對話解釋書名(向費曼的物理學講義致敬)和三個主題。第2章從馮·諾依曼模型下執行的程式出發,說明作業系統如何虛擬化 CPU 和記憶體、應對並行並持久地儲存資料。章末討論抽象、效能、保護、可靠性等設計目標,並簡述作業系統的歷史。

第3–6章:行程與受限直接執行

在虛擬化對話之後,第4章定義行程及其狀態、建立過程和相關資料結構。第5章是第一個「插曲」,講 UNIX 行程 API:fork()、wait()、exec(),以及為什麼要把它們分開。第6章解釋受限直接執行:使用者態與核心態、系統呼叫與陷入,以及時鐘中斷如何讓作業系統奪回 CPU 以進行上下文切換。

第7–11章:CPU 排程

第7章從明確的負載假設和指標(週轉時間與響應時間)出發,依次講 FIFO、最短作業優先、最短完成時間優先和輪轉,再加入 I/O。第8章分幾次嘗試逐步建立多級反饋佇列。第9章講彩票排程、步幅排程和 Linux 的完全公平排程器。第10章是關於多處理器排程的進階章節(快取親和性、單佇列與多佇列)。第11章是總結對話。

第12–17章:地址空間、地址轉換與空閒空間

第13章引入地址空間及其目標。第14章是關於 malloc() 和 free() 及常見記憶體錯誤的插曲。第15章介紹基址加界限的地址轉換,第16章將其推廣為分段,第17章討論可變大小分配所需的空閒空間管理。

第18–24章:分頁與虛擬記憶體

第18章引入分頁和頁表,第19章講 TLB,第20章講如何縮小頁表(更大的頁、混合方式、多級頁表和反向頁表)。第21、22章講交換機制和置換策略,包括 OPT、FIFO、隨機、LRU 及類似時鐘演算法的近似方法,並討論抖動。第23章描述兩個完整系統:VAX/VMS 和 Linux。第24章是總結對話。

第25–34章:並行

第26章說明執行緒的動機,並展示共享資料和不受控的排程如何產生競態。第27章是執行緒 API 插曲。第28章從硬體支援(test-and-set、compare-and-swap、load-linked/store-conditional、fetch-and-add)出發構造鎖,再加入讓出 CPU 和佇列。第29章把鎖用於並行計數器、連結串列、佇列和雜湊表。第30、31章通過生產者/消費者、讀寫鎖和哲學家就餐講條件變數和訊號量。第32章概覽非死鎖與死鎖類缺陷,第33章用 select() 和非同步 I/O 介紹基於事件的並行。第34章是總結。

第35–46章:持久性

第36章講 I/O 裝置、中斷、DMA 和裝置驅動;第37、38章講硬碟(含磁碟排程)和 RAID。第39章是檔案與目錄的插曲。第40章用 inode 和目錄構建一個簡單的檔案系統。第41章講快速檔案系統(FFS),第42章講崩潰一致性(fsck 與日誌),第43章講日誌結構檔案系統。第44章解釋基於快閃記憶體的固態硬碟,第45章講用校驗和與擦洗實現資料完整性。

第47–51章:分散式

關於分散式系統的一小組章節:通訊層與 RPC(第48章),然後是兩個分散式檔案系統案例,NFS(第49章)和 AFS(第50章)——前者圍繞無狀態伺服器和冪等操作,後者圍繞整檔案快取和回撥——以及總結對話(第51章)。

第52–57章:安全

Peter Reiher 撰寫的章節依次介紹安全目標與策略(第53章)、認證(54)、基於 ACL 與能力的訪問控制(55)、密碼學,包括公鑰方法、雜湊和靜態資料加密(56),以及用 TLS 保護分散式系統(57)。

附錄

篇幅較短的附錄講虛擬機器監控器(虛擬化 CPU 與記憶體)、作為更高層同步結構的管程(含 Java 示例)、關於編譯、除錯和構建 C 程式的教程,以及系統程式設計與 xv6 實驗的構想。

核心概念

第1–11章:CPU 虛擬化

  • 行程:正在執行的程式,其狀態由作業系統儲存和恢復。
  • 受限直接執行:讓程式直接在 CPU 上執行,同時作業系統通過特權模式、陷入和時鐘中斷保持控制。
  • 排程指標:週轉時間與響應時間,不同的策略分別最佳化其中之一。
  • 多級反饋佇列:根據歷史推斷作業行為的排程器。

第12–24章:記憶體虛擬化

  • 地址空間:每個行程私有的記憶體檢視。
  • 分頁與 TLB:固定大小的轉換單位,以及使之變快的硬體快取。
  • 多級頁表:避免為未使用的地址空間儲存轉換項的結構。
  • 頁面置換:記憶體已滿時決定淘汰什麼的策略。

第25–34章:並行

  • 競態條件與臨界區:缺陷的模式,以及鎖所保護的程式碼區域。
  • 條件變數與訊號量:等待並通知狀態變化的原語。
  • 死鎖:由一圈相互等待構成,書中用其四個條件加以分析。

第35–46章:持久性

  • inode:UNIX 式檔案系統核心的每檔案結構。
  • 崩潰一致性與日誌:先寫日誌,使後設資料在崩潰後依然完好。
  • 日誌結構檔案系統:把所有寫入變為順序寫入。
  • 校驗和:發現靜默損壞的基本手段。

第47–57章:分散式與安全

  • 冪等操作與無狀態伺服器:NFS 為便於崩潰恢復而採用的設計。
  • 訪問控制列表與能力:記錄「誰可以做什麼」的兩種方式。
  • 公鑰密碼學與 TLS:保護機器之間通訊的工具。

評析

優點

  • 短小、以問題為驅動的章節。 幾乎每章都先提出癥結,分階段構建解決方案(如多級反饋佇列的三次嘗試和一步步改進的鎖設計),並以總結收尾。章節足夠短,可以一次讀完。
  • 先講虛擬化,後講並行。 作者為把執行緒推遲到理解了地址空間、行程和上下文切換之後作了辯護;這一順序使競態的來源一目瞭然。
  • 真實程式碼與可執行的作業。 示例用 C 而非虛擬碼,程式碼託管在 GitHub。許多章末有基於模擬器的作業,更換隨機種子就能產生新題,部分章節還有測量或程式設計任務。
  • 歷史與出處。 各章指向原始論文並點出提出這些想法的人,適合接下來要讀研究文獻的讀者。
  • 免費閱讀。 各章以 PDF 免費提供,用作教材或自學都沒有費用負擔。

侷限

  • 預設前置知識。 導論預期讀者知道程式執行時發生什麼(推薦以 Patt 和 Patel,或 Bryant 和 O’Hallaron 的書作為背景),程式碼使用 C。
  • 示例偏重 UNIX。 行程、檔案和執行緒 API 屬於 UNIX/POSIX,完整系統案例涉及 VAX/VMS 和 Linux 的虛擬記憶體。
  • 覆蓋有所取捨。 本書遵循一種課程設計。網路協議棧、圖形、移動與嵌入式系統等主題不在其中;分散式系統與安全部分與三大主題相比較為簡短。
  • 對話與幽默見仁見智。 對話可有可無,有些讀者認為可以略過。

在課程中的定位

這是通讀一門完整作業系統課程的一條精簡路徑:三個主題、短小的章節,配有相應的程式碼與作業。《Operating System Concepts》是篇幅較長、覆蓋較廣的教材,有來自多種商用系統的例子和程式設計專案;《Modern Operating Systems》是標準教材,含 Linux、Android 和 Windows 的擴充套件案例。二者對同一內容覆蓋更廣,而本書更側重以敘述方式解釋這些機制如何運作及其原因。

《How Linux Works》是一本面向真實 Linux 系統的實用指南,可作為在實機上觀察這些概念的配套讀物。《Principles of Computer System Design》並非嚴格意義上的作業系統教材,而是講貫穿作業系統、網路和容錯的設計原則;適合讀完本書後希望做概括提升的讀者。

如何使用本書

本書適合會用 C 程式設計、大致瞭解程式如何在處理器上執行的讀者,通常用於二、三年級的作業系統課程或自學。

實用安排:

  • 核心: 第2章、第4–9章(CPU 虛擬化)、第13–22章(記憶體)、第26–32章(並行),以及第36–40、42章(裝置、檔案系統與崩潰一致性)。作者指出,這門課程大致可以分配到 15 周的學期中。
  • 選讀或進階: 第10章(多處理器排程)、第23章、第33章(基於事件的並行)、SSD、LFS 和資料完整性各章,以及分散式系統和安全部分。
  • 對話: 可用來把握方向,也可以跳過。

建議把插曲中的程式碼敲進去執行,每章之後做模擬器作業,換新的隨機種子,直到能穩定答對。想要更深入的練習,可以選做附錄中列出的系統程式設計或 xv6 專案構想。對想深入研究的主題,回頭閱讀所引用的論文。

版本與來源

本導讀依據 https://pages.cs.wisc.edu/~remzi/OSTEP/ 上的免費線上版本。作者給出的版本為 1.00(2018 年 8 月)、1.01(2019 年 7 月)和 1.10(2023 年 10 月);所讀章節檔案的頁首標註為 1.10 和 1.20。內容基於免費文本:前言、目錄、對話、每章的開頭與癥結,以及所有章節(含安全章節和附錄)的小節標題。