內容介紹
內容提要本書從系統設計的角度講述UNIX作業系統技術內幕。
全書介紹了各種商用的和研究性的UNIX變體,對每一個核心部件,探究其結構和設計,然
後講述大部分的系統是如何實現這些部件的以及各種實現方案的優缺點。它使讀者以一種審視
的眼光考察系統,這種比較方法是本書的獨到之處。
全書內容共分17章。第1章~第2章追溯UNIX系統的發展,介紹傳統UNIX的進程和內
核結構。第3章~第7章介紹SVR4,4.4BSD,Solaris2.x及DigitalUNIX等現代UNIX系統的
特徵。第8章~第11章討論檔案系統。第12章~第15章介紹記憶體管理。最後兩章討論I/o系
統。本書每一章都附有練習和參考文獻,啟發讀者進一步的思考和研究,加深了解系統設計。
本書適於作為高年級本科生和研究生作業系統課教材,也可供作業系統開發人員及系統管
理員參考使用。
作品目錄
目第1章 簡介
1.1 簡介
1.1.1 簡史
1.1.2 創始之初
1.1.3 繁衍
1.1.4 BSD
1.1.5 SystemV
1.1.6 商業化
1.1.7 Mach
1.1.8 標準
1.1.9 OsF和UI
1.1.10 SVR4及其之後
1.2 演變的動力
1.2.1 功能
1.2.2 網路
1.2.3 性能
1.2.4 硬體變化
1.2.5 改進質量
1.2.6 模式變化
1.2.7 其他套用領域
1.2.8 簡潔就是美
1.2.9 靈活性
1.3 回顧與展望
1.3.1 UNIX好在哪裡
1.3.2 UNIX的誤區在哪兒
1.4 本書的範圍
1.5 參考文獻
第2章 進程與核心
2.1 簡介
2.2 模式,空間和上下文
2.3 進程抽象
2.3.1 進程狀態
2.3.2 進程上下文
2.3.3 用戶憑證
2.3.4 u區和proc結構
2.4 核心態下運行
2.4.1 系統調用接口
2.4.2 中斷處理
2.5 同步
2.5.1 阻塞操作
2.5.2 中斷
2.5.3 多處理器
2.6 進程調度
2.7 信號
2.8 新進程和程式
2.8.1 fork和exec
2.8.2 進程創建
2.8.3 fork最佳化
2.8.4 執行一個新程式
2.8.5 進程終止
2.8.6 等待進程終止
2.8.7 殭屍(Zombie)進程
2.9 小結
2.10 練習
2.11 參考文獻
第3章 執行緒和輕量級進程
3.1 簡介
3.1.1 動機
3.1.2 多執行緒和多處理器
3.1.3 並發和並行
3.2 基本抽象概念
3.2.1 核心執行緒
3.2.2 輕量級進程
3.2.3 用戶執行緒
3.3 輕量級進程設計――要考慮的問題
3.3.1 fork的語義
3.3.2 其他的系統調用
3.3.3 信號傳遞和處理
3.3.4 可視性
3.3.5 堆疊增長
3.4 用戶級執行緒庫
3.4.1 編程接口
3.4.2 執行緒庫的實現
3.5 調度器調用
3.6 Solaris和sVR4的多執行緒處理
3.6.1 核心執行緒
3.6.2 輕量級進程的實現
3.6.3 用戶執行緒
3.6.4 用戶執行緒的實現
3.6.5 中斷處理
3.6.6 系統調用處理
3.7 Mach中的執行緒
3.7.1 Mach的抽象概念――任務和執行緒
3.7.2 Mach的C-threads
3.8 DigitalUNIX
3.8.1 UNIX接口
3.8.2 系統調用和信號
3.8.3 pthreads執行緒庫
3.9 Mach3.0的續體
3.9.1 編程模型
3.9.2 使用續體
3.9.3 最佳化
3.9.4 分析
3.10 小結
3.11 練習
3.12 參考文獻
第4章 信號和會話管理
4.1 簡介
4.2 信號生成和處理
4.2.1 信號處理
4.2.2 信號生成
4.2.3 典型情景
4.2.4 睡眠和信號
4.3 不可靠信號
4.4 可靠的信號
4.4.1 主要特性
4.4.2 sVR3的實現
4.4.3 BSD信號管理
4.5 sVR4信號機制
4.6 信號機制的實現
4.6.1 信號生成
4.6.2 信號傳遞和處理
4.7 異常
4.8 Mach中的異常處理
4.8.1 異常連線埠
4.8.2 錯誤處理
4.8.3 調試器的互動
4.8.4 分析
4.9 進程組和終端管理
4.9.1 基本概念
4.9.2 SVR3模型
4.9.3 局限性
4.9.4 4.3BSD中的進程組和終端
4.9.5 缺點
4.10 sVR4會話的體系結構
4.10.1 目的(動機)
4.10.2 會話和進程組
4.10.3 數據結構
4.10.4 控制終端
4.10.5 4.4BSD中會話的實現
4.11 小結
4.12 練習
4.13 參考文獻
第5章 進程調度
5.1 簡介
5.2 時鐘中斷處理
5.2.1 調出鍊表
5.2.2 報警
5.3 調度器的目標
5.4 傳統的UNIX調度
5.4.1 進程優先權
5.4.2 調度器的實現
5.4.3 運行佇列管理
5.4.4 分析
5.5 SVR4的調度器
5.5.1 類無關層
5.5.2 調度類的接口
5.5.3 分時類
5.5.4 實時類
5.5.5 系統調用priocntl
5.5.6 分析
5.6 Solaris2.x調度的改善
5.6.1 搶占式核心
5.6.2 多處理器的支持
5.6.3 隱式調度
5.6.4 優先權逆轉
5.6.5 優先權繼承的實現
5.6.6 優先繼承的局限性
5.6.7 Turnstiles
5.6.8 分析
5.7 mach中的調度
5.7.1 多處理器的支持
5.8 DigitalUNIX的實時調度器
5.8.1 多處理器支持
5.9 其他的一些調度實現
5.9.1 fair-share調度
5.9.2 最終期限驅動調度
5.9.3 三級(ThreeLevel)調度器
5.10 小結
5.11 練習
5.12 參考文獻
第6章 進程間通信
6.1 簡介
6.2 通用IPC方法
6.2.1 信號
6.2.2 管道
6.2.3 3VR4的管道
6.2.4 進程跟蹤
6.3 SystemV的進程間通信
6.3.1 公共元素
6.3.2 信號量
6.3.3 訊息佇列
6.3.4 共享記憶體
6.3.5 討論
6.4 MachIPC
6.4.1 基本概念
6.5 訊息
6.5.1 訊息的數據結構
6.5.2 訊息傳遞接口
6.6 連線埠
6.6.1 連線埠名字空間
6.6.2 連線埠數據結構
6.6.3 連線埠變換
6.7 訊息傳遞
6.7.1 連線埠權力的傳遞
6.7.2 脫機記憶體
6.7.3 控制流
6.7.4 通知
6.8 連線埠操作
6.8.1 釋放一個連線埠
6.8.2 備份連線埠
6.8.3 連線埠集合
6.8.4 連線埠的添加
6.9 擴展性
6.10 Mach3.0的改進
6.10.1 一次傳送權
6.10.2 Mach3.0的通知
6.10.3 傳送權的用戶引用記數
6.11 討論
6.12 小結
6.13 練習
6.14 參考文獻
第7章 同步和多處理器
7.1 簡介
7.2 傳統UNIX核心中的同步
7.2.1 中斷禁止
7.2.2 睡眠和喚醒
7.2.3 傳統方法的局限性
7.3 多處理器系統
7.3.1 記憶體模型
7.3.2 同步支持
7.3.3 軟體體系結構
7.4 多處理器同步問題
7.4.1 喚醒丟失問題
7.4.2 巨群問題
7.5 信號燈
7.5.1 提供互斥訪問的信號燈
7.5.2 使用的信號燈的事件等待
7.5.3 用於控制可計數資源的信號燈
7.5.4 信號燈的缺點
7.5.5 護衛
7.6 自旋鎖
7.6.1 自旋鎖的使用
7.7 條件變數
7.7.1 實現問題
7.7.2 事件
7.7.3 阻塞鎖
7.8 讀寫鎖
7.8.1 設計考慮
7.8.2 實現
7.9 引用計數
7.10 其他考慮
7.10.1 死鎖避免
7.10.2 遞歸鎖
7.10.3 阻塞還是自旋
7.10.4 鎖什麼
7.10.5 粒度和持續時間
7.11 例子分析
7.11.1 SVR4.2/MP
7.11.2 DigitalUNIX
7.11.3 其他實現
7.12 小結
7.13 練習
7.14 參考文獻
第8章 檔案系統接口和框架
8.1 簡介
8.2 檔案的用戶接口
8.2.1 檔案和目錄
8.2.2 檔案屬性
8.2.3 檔案描述符
8.2.4 檔案I/O
8.2.5 分散聚集I/O(Scatter-GatherI/O)
8.2.6 檔案加鎖
8.3 檔案系統
8.3.1 邏輯磁碟
8.4 特殊檔案
8.4.1 符號連結
8.4.2 管道和FIFO
8.5 檔案系統框架
8.6 vnode/vfs體系結構
8.6.1 目標
8.6.2 設備I/O的經驗
8.6.3 vnode/vfs接口概述
8.7 實現概述
8.7.1 目標
8.7.2 v節點和打開檔案
8.7.3 v節點
8.7.4 v節點引用計數
8.7.5 vfs對象
8.8 檔案系統相關對象
8.8.1 每個檔案的私有數據
8.8.2 vnodeops向量
8.8.3 vfs層中的檔案系統相關部分
8.9 安裝一個檔案系統
8.9.1 虛擬檔案系統轉換
8.9.2 mount的實現
8.9.3 VFS-MOUNT處理
8.10 對檔案的操作
8.10.1 路徑名遍歷
8.10.2 目錄查找快取
8.10.3 VOP-LOOKUP操作
8.10.4 打開檔案
8.10.5 檔案I/O
8.10.6 檔案屬性
8.10.7 用戶憑證
8.11 分析
8.11.1 SVR4實現的缺點
8.11.2 4.4BSD模型
8.11.3 OSF/1方法
8.12 小結
8.13 練習
8.14 參考文獻
第9章 檔案系統實現
9.1 簡介
9.2 Systemv檔案系統(s5fs)
9.2.1 目錄
9.2.2 i節點
9.2.3 超級塊
9.3 s5fs核心組織
9.3.1 記憶體i節點
9.3.2 i節點查找
9.3.3 檔案I/O
9.3.4 i節點的分配與回收
9.4 對s55fs的分析
9.5 伯克利快速檔案系統(FFS)
9.6 硬碟結構
9.7 磁碟組織
9.7.1 塊和碎片
9.7.2 分配策略
9.8 FFS的增強功能
9.9 分析
9.10 臨時檔案系統
9.10.1 記憶體檔案系統
9.10.2 tmpfs檔案系統
9.11 特殊目的檔案系統
9.11.1 specfs檔案系統
9.11.2 /proc檔案系統
9.11.3 處理器檔案系統
9.11.4 半透明檔案系統
9.12 以往的磁碟快取
9.12.1 基本操作
9.12.2 緩衝區頭結構
9.12.3 優點
9.12.4 缺點
9.12.5 保證檔案系統的一致性
9.13 小結
9.14 練習
9.15 參考文獻
第10章 分散式檔案系統
10.1 簡介
10.2 分散式檔案系統的一般特徵
10.2.1 設計考慮
10.3 網路檔案系統(NFS)
10.3.1 用戶透視
10.3.2 設計目標
10.3.3 NFS組成
10.3.4 無狀態
10.4 協定族
10.4.1 擴展數據表示(XDR)
10.4.2 遠程過程調用(RPC)
10.5 NFS實現
10.5.1 控制流
10.5.2 檔案句柄
10.5.3 Mount操作
10.5.4 路徑名查找
10.6 UNIX語義
10.6.1 打開檔案許可權
10.6.2 刪除打開檔案
10.6.3 讀和寫
10.7 NFS性能
10.7.1 性能瓶頸
10.7.2 客戶端高速快取
10.7.3 延遲寫
10.7.4 重傳高速快取
10.8 專用NFS伺服器
10.8.1 Auspex功能性多處理器結構
10.8.2 IBM的HA-NFS伺服器
10.9 NFS安全性
10.9.1 NFS訪問控制
10.9.2 UID重新映射
10.9.3 root重新映射
10.10 NFSV3
10.11 遠程檔案共享(RFS)檔案系統
10.12 RFS結構
10.12.1 遠程訊息協定
10.12.2 有狀態操作
10.13 RFs實現
10.13.1 遠程安裝
10.13.2 RFs客戶和伺服器
10.13.3 崩潰恢復
10.13.4 其他問題
10.14 客戶端高速快取
10.14.1 高速快取一致性
10.15 Andrew檔案系統
10.15.1 可擴展的結構
10.15.2 存儲和名字空間組織
10.15.3 會話語義
10.16 AFS實現
10.16.1 快取以及一致性
10.16.2 路徑名查找
10.16.3 安全性
10.17 AFS的缺陷
10.18 DCE分散式檔案系統(DCEDFS)
10.18.1 DFS體系結構
10.18.2 高速緩衝區一致性
10.18.3 令牌管理器
10.18.4 其他DFS服務
10.18.5 分析
10.19 小結
10.20 練習
10.21 參考文獻
第11章 高級檔案系統
11.1 簡介
11.2 傳統檔案系統的局限
11.2.1 FFS磁碟布局
11.2.2 寫的主導性
11.2.3 元數據更新
11.2.4 崩潰恢復
11.3 檔案系統成簇(SunFFS)
11.4 日誌方法
11.4.1 基本特徵
11.5 日誌結構檔案系統
11.6 4.4BSD日誌檔案系統
11.6.1 寫日誌
11.6.2 數據檢索
11.6.3 崩潰恢復
11.6.4 清除進程
11.6.5 分析
11.7 元數據日誌
11.7.1 正常操作
11.7.2 日誌的一致性
11.7.3 崩潰恢復
11.7.4 分析
11.8 Episode檔案系統
11.8.1 基本抽象
11.8.2 結構
11.8.3 記日誌
11.8.4 其他特性
11.9 監視器(watchdog)
11.9.1 目錄監視器
11.9.2 訊息通道
11.9.3 套用
11.10 4.4BSD連線埠檔案系統
11.10.1 使用連線埠(portals)
11.11 堆疊式檔案系統層
11.11.1 框架和接口
11.11.2 SunSoft原型
11.12 4.4BSD檔案系統接口
11.12.1 Nullfs和UnionMount檔案系統
11.13 小結
11.14 練習
11.15 參考文獻
第12章 核心記憶體管理
12.1 簡介
12.2 功能需求
12.2.1 評估標準
12.3 資源映射圖分配器
12.3.1 分析
12.4 簡單2次冪空閒表
12.4.1 分析
12.5 McKusick-Karels分配器
12.5.1 分析
12.6 夥伴系統
12.6.1 分析
12.7 SVR4LaZy夥伴算法
12.7.1 LaZy合併
12.7.2 SVR4實現細節
12.8 Mach-OSF/1的Zone分配器
12.8.1 垃圾收集
12.8.2 分析
12.9 多處理器的分層分配器
12.9.1 分析
12.10 Solaris2.4的SLab分配器
12.10.1 對象復用
12.10.2 硬體Cache利用率
12.10.3 分配器footprint
12.10.4 設計與接口
12.10.5 實現
12.10.6 分析
12.11 小結
12.12 練習
12.13 參考文獻
第13章 虛存
13.1 簡介
13.1.1 記憶體管理的石器時代
13.2 分頁
13.2.1 功能需求
13.2.2 虛擬地址空間
13.2.3 頁面初始訪問
13.2.4 交換區
13.2.5 轉換映射圖
13.2.6 頁面替換策略
13.3 硬體需求
13.3.1 MMU快取
13.3.2 Inte!80x86
13.3.3 IBMRS/6000
13.3.4 MIPSR3000
13.4 4.3BSD實例研究
13.4.1 物理記憶體
13.4.2 地址空間
13.4.3 頁面在哪裡
13.4.4 交換區
13.5 4.3BSD記憶體管理操作
13.5.1 創建進程
13.5.2 頁面失效處理
13.5.3 空閒頁面鍊表
13.5.4 交換
13.6 分析
13.7 練習
13.8 參考文獻
第14章 SVR4VM體系結構
14.1 動機
14.2 記憶體映射檔案
14.2.1 mmap及相關係統調382用
14.3 VM設計原理
14.4 基本抽象概念
14.4.1 物理記憶體
14.4.2 地址空間
14.4.3 地址映射
14.4.4 匿名頁面
14.4.5 硬體地址轉換
14.5 段驅動程式
14.5.1 seg-vn
14.5.2 seg-map
14.5.3 seg-dev
14.5.4 segkmem
14.5.5 segkp
14.6 交換層
14.7 VM操作
14.7.1 創建一個新映射
14.7.2 匿名頁面處理
14.7.3 創建進程
14.7.4 共享匿名頁面
14.7.5 頁面失效處理
14.7.6 共享記憶體
14.7.7 其他部件
14.8 與v節點 子系統的互動
14.8.1 v節點接口變化
14.8.2 統一的檔案訪問
14.8.3 其他問題
14.9 Solaris中的虛擬交換空間
14.9.1 擴展交換空間
14.9.2 虛交換管理
14.9.3 討論
14.10 分析
14.11 性能改進
14.11.1 高失效率原因
14.11.2 SVR4對SunOSVM實現的改進
14.11.3 結果與討論
14.12 小結
14.13 練習
14.14 參考文獻
第15章 進一步關於記憶體管理的主題
15.1 簡介
15.2 Mach的記憶體管理設計
15.2.1 設計目標
15.2.2 編程接口
15.2.3 基本抽象概念
15.3 共享記憶體設施
15.3.1 copy-onwrite共享
15.3.2 讀寫共享
15.4 記憶體對象和Pager
15.4.1 記憶體對象初始化
15.4.2 核心與Pager間的接口
15.4.3 核心與pager互動
15.5 外部pager和內部pager
15.5.1 一個網路共享記憶體伺服器
15.6 頁面替換
15.7 分析
15.8 4.4BSD的記憶體管理
15.9 快表(TLB)一致性
15.9.1 單處理機上的TLB一致性
15.9.2 多處理機問題
15.10 Ma ch的TLB擊落算法
15.10.1 同步和死鎖避免
15.10.2 討論
15.11 SVR4和SVR4.2UNIX中的TLB一致性
15.11.1 SVR4/MP
15.11.2 SVR4.2/MP
15.11.3 Lazy擊落算法
15.11.4 立即擊落
15.11.5 討論
15.12 其他TLB 一致性算法
15.13 虛地址快取
15.13.1 映射變化
15.13.2 地址別名
15.13.3 DMA操作
15.13.4 維護快取一致性
15.13.5 分析
15.14 練習
15.15 參考文獻
第16章 設備驅動程式I/0
16.1 簡介
16.2 概述
16.2.1 硬體配置
16.2.2 設備中斷
16.3 設備驅動程式框架
16.3.1 設備和驅動程式分類
16.3.2 調用驅動程式代碼
16.3.3 設備開關表
16.3.4 驅動程式入口點
16.4 I/O子系統
16.4.1 主、次設備號
16.4.2 設備檔案
16.4.3 specfs檔案系統
16.4.4 公共snode
16.4.5 設備克隆
16.4.6 字元設備I/O
16.5 poll系統調用
16.5.1 poll的實現
16.5.2 4.3BsDselect系統調用
16.6 塊I/O
16.6.1 buf結構
16.6.2 與v節點的互動
16.6.3 設備訪問方法
16.6.4 到塊設備的rawI/O
16.7 DDI/DKI說明
16.7.1 建議
16.7.2 第三部分函式
16.7.3 其他部分
16.8 新的sVR4 版本
16.8.1 多處理器可靠驅動程式
16.8.2 SVR4.1/ES的變化
16.8.3 動態載入和卸載
16.9 發展趨勢
16.10 小結
16.11 練習
16.12 參考文獻
第17章 流
17.1 目的
17.2 概述
17.3 訊息和佇列
17.3.1 訊息
17.3.2 虛擬拷貝
17.3.3 訊息類型
17.3.4 佇列和模組
17.4 流I/O
17.4.1 STREAMS調度程式
17.4.2 優先帶(PriorityBands)
17.4.3 流量控制
17.4.4 驅動程式尾
17.4.5 流頭
17.5 配置和設定
17.5.1 配置一個模組或驅動程式
17.5.2 打開流
17.5.3 插入(Pushing)模組
17.5.4 克隆設備
17.6 STREAMSioctl
17.6.1 I-STRioctl處理
17.6.2 透明ioctl
17.7 記憶體分配
17.7.1 擴展sTREAMS緩衝區
17.8 多路復用
17.8.1 上部多路復用器
17.8.2 下部多路復用器
17.8.3 連結流
17.8.4 數據流
17.8.5 普通連結和持久連結
17.9 FIFO和管道
17.9.1 STREAMsFIFO
17.9.2 STREAMS管道
17.10 網路接口
17.10.1 傳輸供應者接口(TpI)
17.10.2 傳輸層接口(TLI)
17.10.3 sockets
17.10.4 SVR4Socket實現
17.11 小結
17.12 練習
17.13 參考文獻