內容簡介
本書是面向作業系統導論課程的經典書籍,從第1版至今被國內外眾多高校選作教材。全書共六部分,不僅詳細講解了進程管理、記憶體管理、存儲管理、保護與安全等概念,而且涵蓋重要的理論結果和案例研究,並且給出了供讀者深入學習的推薦讀物。這一版新增了多核系統和移動計算的內容,每一章都融入了新的技術進展,並且更新了習題和編程項目。本書既適合高等院校計算機相關專業的學生學習,也是專業技術人員的有益參考。
圖書目錄
出版者的話
譯者序
前言
第一部分 概論
第1章 導論 2
1.1 作業系統的功能 2
1.1.1 用戶視角 2
1.1.2 系統視角 3
1.1.3 作業系統的定義 4
1.2 計算機系統的組成 4
1.2.1 計算機系統的運行 5
1.2.2 存儲結構 6
1.2.3 I/O結構 8
1.3 計算機系統的體系結構 9
1.3.1 單處理器系統 9
1.3.2 多處理器系統 10
1.3.3 集群系統 12
1.4 作業系統的結構 13
1.5 作業系統的執行 14
1.5.1 雙重模式與多重模式的執行 15
1.5.2 定時器 16
1.6 進程管理 17
1.7 記憶體管理 18
1.8 存儲管理 18
1.8.1 檔案系統管理 18
1.8.2 大容量存儲器管理 19
1.8.3 高速快取 19
1.8.4 I/O系統 21
1.9 保護與安全 21
1.10 核心數據結構 22
1.10.1 列表、堆疊及佇列 22
1.10.2 樹 23
1.10.3 哈希函式與哈希表 23
1.10.4 點陣圖 24
1.11 計算環境 24
1.11.1 傳統計算 24
1.11.2 移動計算 25
1.11.3 分布計算 26
1.11.4 客戶機-伺服器計算 26
1.11.5 對等計算 27
1.11.6 虛擬化 28
1.11.7 雲計算 29
1.11.8 實時嵌入式系統 30
1.12 開源作業系統 31
1.12.1 歷史 31
1.12.2 Linux 31
1.12.3 BSD UNIX 32
1.12.4 Solaris 32
1.12.5 用作學習的開源作業系統 33
1.13 小結 33
習題 35
推薦讀物 36
參考文獻 36
第2章 作業系統結構 38
2.1 作業系統的服務 38
2.2 用戶與作業系統的界面 40
2.2.1 命令解釋程式 40
2.2.2 圖形用戶界面 41
2.2.3 界面的選擇 42
2.3 系統調用 43
2.4 系統調用的類型 46
2.4.1 進程控制 46
2.4.2 檔案管理 49
2.4.3 設備管理 50
2.4.4 信息維護 50
2.4.5 通信 50
2.4.6 保護 51
2.5 系統程式 51
2.6 作業系統的設計與實現 52
2.6.1 設計目標 52
2.6.2 機制與策略 53
2.6.3 實現 53
2.7 作業系統的結構 54
2.7.1 簡單結構 54
2.7.2 分層方法 55
2.7.3 微核心 56
2.7.4 模組 57
2.7.5 混合系統 58
2.8 作業系統的調試 60
2.8.1 故障分析 60
2.8.2 性能最佳化 60
2.8.3 DTrace 61
2.9 作業系統的生成 63
2.10 系統引導 64
2.11 小結 64
習題 65
編程題 66
編程項目 66
推薦讀物 69
參考文獻 69
第二部分 進程管理
第3章 進程 72
3.1 進程概念 72
3.1.1 進程 72
3.1.2 進程狀態 73
3.1.3 進程控制塊 73
3.1.4 執行緒 74
3.2 進程調度 75
3.2.1 調度佇列 75
3.2.2 調度程式 77
3.2.3 上下文切換 78
3.3 進程運行 79
3.3.1 進程創建 79
3.3.2 進程終止 82
3.4 進程間通信 83
3.4.1 共享記憶體系統 85
3.4.2 訊息傳遞系統 86
3.5 IPC系統例子 89
3.5.1 例子:POSIX共享記憶體 89
3.5.2 例子:Mach 91
3.5.3 例子:Windows 92
3.6 客戶機/伺服器通信 93
3.6.1 套接字 93
3.6.2 遠程過程調用 96
3.6.3 管道 98
3.7 小結 102
習題 103
編程題 105
編程項目 107
推薦讀物 110
參考文獻 110
第4章 多執行緒編程 112
4.1 概述 112
4.1.1 動機 112
4.1.2 優點 113
4.2 多核編程 114
4.2.1 編程挑戰 115
4.2.2 並行類型 115
4.3 多執行緒模型 116
4.3.1 多對一模型 116
4.3.2 一對一模型 116
4.3.3 多對多模型 116
4.4 執行緒庫 117
4.4.1 Pthreads 118
4.4.2 Windows執行緒 119
4.4.3 Java執行緒 121
4.5 隱式多執行緒 122
4.5.1 執行緒池 123
4.5.2 OpenMP 124
4.5.3 大中央調度 125
4.5.4 其他方法 125
4.6 多執行緒問題 125
4.6.1 系統調用fork()和exec() 125
4.6.2 信號處理 126
4.6.3 執行緒撤銷 127
4.6.4 執行緒本地存儲 128
4.6.5 調度程式激活 128
4.7 作業系統例子 129
4.7.1 Windows執行緒 129
4.7.2 Linux執行緒 130
4.8 小結 131
習題 131
編程題 133
編程項目 134
推薦讀物 136
參考文獻 136
第5章 進程調度 138
5.1 基本概念 138
5.1.1 CPU-I/O執行周期 138
5.1.2 CPU調度程式 139
5.1.3 搶占調度 139
5.1.4 調度程式 140
5.2 調度準則 140
5.3 調度算法 141
5.3.1 先到先服務調度 141
5.3.2 最短作業優先調度 142
5.3.3 優先權調度 144
5.3.4 輪轉調度 145
5.3.5 多級佇列調度 147
5.3.6 多級反饋佇列調度 148
5.4 執行緒調度 149
5.4.1 競爭範圍 149
5.4.2 Pthreads調度 149
5.5 多處理器調度 151
5.5.1 多處理器調度的方法 151
5.5.2 處理器親和性 151
5.5.3 負載平衡 152
5.5.4 多核處理器 152
5.6 實時CPU調度 154
5.6.1 最小化延遲 154
5.6.2 優先權調度 155
5.6.3 單調速率調度 156
5.6.4 最早截止期限優先調度 157
5.6.5 比例分享調度 158
5.6.6 POSIX實時調度 158
5.7 作業系統例子 160
5.7.1 例子:Linux調度 160
5.7.2 例子:Windows調度 162
5.7.3 例子:Solaris調度 164
5.8 算法評估 165
5.8.1 確定性模型 166
5.8.2 排隊模型 167
5.8.3 仿真 167
5.8.4 實現 168
5.9 小結 169
習題 170
推薦讀物 172
參考文獻 173
第6章 同步 175
6.1 背景 175
6.2 臨界區問題 177
6.3 Peterson解決方案 178
6.4 硬體同步 179
6.5 互斥鎖 181
6.6 信號量 181
6.6.1 信號量的使用 182
6.6.2 信號量的實現 182
6.6.3 死鎖與飢餓 184
6.6.4 優先權的反轉 184
6.7 經典同步問題 185
6.7.1 有界緩衝問題 185
6.7.2 讀者-作者問題 186
6.7.3 哲學家就餐問題 187
6.8 管程 188
6.8.1 使用方法 189
6.8.2 哲學家就餐問題的管程解決方案 190
6.8.3 採用信號量的管程實現 191
6.8.4 管程內的進程重啟 192
6.9 同步例子 193
6.9.1 Windows同步 193
6.9.2 Linux同步 194
6.9.3 Solaris同步 195
6.9.4 Pthreads同步 196
6.10 替代方法 197
6.10.1 事務記憶體 198
6.10.2 OpenMP 199
6.10.3 函式式程式語言 199
6.11 小結 200
習題 200
編程題 204
編程項目 205
推薦讀物 209
參考文獻 210
第7章 死鎖 212
7.1 系統模型 212
7.2 死鎖特徵 213
7.2.1 必要條件 214
7.2.2 資源分配圖 215
7.3 死鎖處理方法 216
7.4 死鎖預防 217
7.4.1 互斥 217
7.4.2 持有且等待 217
7.4.3 無搶占 218
7.4.4 循環等待 218
7.5 死鎖避免 220
7.5.1 安全狀態 220
7.5.2 資源分配圖算法 221
7.5.3 銀行家算法 222
7.6 死鎖檢測 224
7.6.1 每種資源類型只有單個實例 224
7.6.2 每種資源類型可有多個實例 225
7.6.3 套用檢測算法 226
7.7 死鎖恢復 227
7.7.1 進程終止 227
7.7.2 資源搶占 227
7.8 小結 228
習題 228
編程題 230
編程項目 230
推薦讀物 231
參考文獻 232
第三部分 記憶體管理
第8章 記憶體管理策略 234
8.1 背景 234
8.1.1 基本硬體 234
8.1.2 地址綁定 236
8.1.3 邏輯地址空間與物理地址空間 236
8.1.4 動態載入 237
8.1.5 動態連結與共享庫 238
8.2 交換 238
8.2.1 標準交換 238
8.2.2 移動系統的交換 239
8.3 連續記憶體分配 240
8.3.1 記憶體保護 240
8.3.2 記憶體分配 241
8.3.3 碎片 242
8.4 分段 242
8.4.1 基本方法 243
8.4.2 分段硬體 243
8.5 分頁 244
8.5.1 基本方法 245
8.5.2 硬體支持 247
8.5.3 保護 250
8.5.4 共享頁 251
8.6 頁表結構 252
8.6.1 分層分頁 252
8.6.2 哈希頁表 254
8.6.3 倒置頁表 254
8.6.4 Oracle SPARC Solaris 255
8.7 例子:Intel 32位與64位體系結構 256
8.7.1 IA-32架構 256
8.7.2 x86-64 258
8.8 例子:ARM架構 259
8.9 小結 259
習題 260
編程題 262
推薦讀物 262
參考文獻 263
第9章 虛擬記憶體管理 264
9.1 背景 264
9.2 請求調頁 266
9.2.1 基本概念 266
9.2.2 請求調頁的性能 269
9.3 寫時複製 271
9.4 頁面置換 272
9.4.1 基本頁面置換 273
9.4.2 FIFO頁面置換 275
9.4.3 最優頁面置換 276
9.4.4 LRU頁面置換 276
9.4.5 近似LRU頁面置換 278
9.4.6 基於計數的頁面置換 279
9.4.7 頁面緩衝算法 280
9.4.8 應用程式與頁面置換 280
9.5 幀分配 280
9.5.1 幀的最小數 281
9.5.2 分配算法 282
9.5.3 全局分配與局部分配 282
9.5.4 非均勻記憶體訪問 283
9.6 系統抖動 283
9.6.1 系統抖動的原因 284
9.6.2 工作集模型 285
9.6.3 缺頁錯誤頻率 286
9.6.4 結束語 287
9.7 記憶體映射檔案 287
9.7.1 基本機制 287
9.7.2 共享記憶體Windows API 288
9.7.3 記憶體映射I/O 290
9.8 分配核心記憶體 291
9.8.1 夥伴系統 291
9.8.2 slab分配 292
9.9 其他注意事項 293
9.9.1 預調頁面 293
9.9.2 頁面大小 293
9.9.3 TLB範圍 294
9.9.4 倒置頁表 295
9.9.5 程式結構 295
9.9.6 I/O聯鎖與頁面鎖定 296
9.10 作業系統例子 297
9.10.1 Windows 297
9.10.2 Solaris 298
9.11 小結 299
習題 300
編程題 303
編程項目 304
推薦讀物 306
參考文獻 306
第四部分 存儲管理
第10章 檔案系統 310
10.1 檔案概念 310
10.1.1 檔案屬性 310
10.1.2 檔案操作 311
10.1.3 檔案類型 315
10.1.4 檔案結構 316
10.1.5 內部檔案結構 316
10.2 訪問方法 316
10.2.1 順序訪問 317
10.2.2 直接訪問 317
10.2.3 其他訪問方法 318
10.3 與磁碟的結構 319
10.3.1 存儲結構 319
10.3.2 概述 320
10.3.3 單級 320
10.3.4 兩級 321
10.3.5 樹形 322
10.3.6 無環圖 323
10.3.7 通用圖 325
10.4 檔案系統安裝 326
10.5 檔案共享 327
10.5.1 多用戶 327
10.5.2 遠程檔案系統 328
10.5.3 一致性語義 330
10.6 保護 331
10.6.1 訪問類型 331
10.6.2 訪問控制 331
10.6.3 其他保護方式 333
10.7 小結 334
習題 334
推薦讀物 335
參考文獻 335
第11章 檔案系統實現 337
11.1 檔案系統結構 337
11.2 檔案系統實現 338
11.2.1 概述 338
11.2.2 分區與安裝 341
11.2.3 虛擬檔案系統 341
11.3 實現 343
11.3.1 線性列表 343
11.3.2 哈希表 343
11.4 分配方法 344
11.4.1 連續分配 344
11.4.2 連結分配 345
11.4.3 索引分配 347
11.4.4 性能 348
11.5 空閒空間管理 349
11.5.1 位向量 349
11.5.2 鍊表 350
11.5.3 組 350
11.5.4 計數 350
11.5.5 空間圖 351
11.6 效率與性能 351
11.6.1 效率 351
11.6.2 性能 352
11.7 恢復 354
11.7.1 一致性檢查 354
11.7.2 基於日誌的檔案系統 354
11.7.3 其他解決方法 355
11.7.4 備份和恢復 356
11.8 NFS 356
11.8.1 概述 357
11.8.2 安裝協定 358
11.8.3 NFS協定 358
11.8.4 路徑名稱轉換 359
11.8.5 遠程操作 360
11.9 例子:WAFL檔案系統 360
11.10 小結 362
習題 363
編程題 364
推薦讀物 365
參考文獻 365
第12章 大容量存儲結構 367
12.1 大容量存儲結構概述 367
12.1.1 磁碟 367
12.1.2 固態磁碟 368
12.1.3 磁帶 368
12.2 磁碟結構 369
12.3 磁碟連線 369
12.3.1 主機連線存儲 369
12.3.2 網路連線存儲 370
12.3.3 存儲區域網路 370
12.4 磁碟調度 371
12.4.1 FCFS調度 371
12.4.2 SSTF調度 371
12.4.3 SCAN調度 372
12.4.4 C-SCAN調度 373
12.4.5 LOOK調度 373
12.4.6 磁碟調度算法的選擇 373
12.5 磁碟管理 374
12.5.1 磁碟格式化 374
12.5.2 引導塊 375
12.5.3 壞塊 376
12.6 交換空間管理 377
12.6.1 交換空間的使用 377
12.6.2 交換空間位置 377
12.6.3 交換空間管理:例子 378
12.7 RAID結構 378
12.7.1 通過冗餘提高可靠性 379
12.7.2 通過並行處理提高性能 380
12.7.3 RAID級別 380
12.7.4 RAID級別的選擇 383
12.7.5 擴展 384
12.7.6 RAID的問題 384
12.8 穩定存儲實現 385
12.9 小結 386
習題 387
編程題 388
推薦讀物 388
參考文獻 389
第13章 I/O系統 390
13.1 概述 390
13.2 I/O硬體 390
13.2.1 輪詢 392
13.2.2 中斷 393
13.2.3 直接記憶體訪問 396
13.2.4 I/O硬體小結 397
13.3 應用程式I/O接口 397
13.3.1 塊與字元設備 399
13.3.2 網路設備 400
13.3.3 時鐘與定時器 400
13.3.4 非阻塞與異步I/O 401
13.3.5 向量I/O 402
13.4 核心I/O子系統 402
13.4.1 I/O調度 402
13.4.2 緩衝 403
13.4.3 快取 404
13.4.4 假脫機與設備預留 405
13.4.5 錯誤處理 405
13.4.6 I/O保護 405
13.4.7 核心數據結構 406
13.4.8 核心I/O子系統小結 406
13.5 I/O請求轉成硬體操作 407
13.6 流 409
13.7 性能 410
13.8 小結 412
習題 413
推薦讀物 414
參考文獻 414
第五部分 保護與安全
第14章 系統保護 416
14.1 保護目標 416
14.2 保護原則 417
14.3 保護域 417
14.3.1 域結構 418
14.3.2 例子:UNIX 419
14.3.3 例子:MULTICS 420
14.4 訪問矩陣 421
14.5 訪問矩陣的實現 423
14.5.1 全局表 423
14.5.2 對象的訪問列表 423
14.5.3 域的能力列表 424
14.5.4 鎖-鑰匙機制 424
14.5.5 比較 424
14.6 訪問控制 425
14.7 訪問許可權的撤回 426
14.8 基於能力的系統 427
14.8.1 例子:Hydra 427
14.8.2 例子:劍橋CAP系統 428
14.9 基於語言的保護 428
14.9.1 基於編譯程式的實現 429
14.9.2 Java的保護 430
14.10 小結 432
習題 432
推薦讀物 433
參考文獻 433
第15章 系統安全 436
15.1 安全問題 436
15.2 程式威脅 438
15.2.1 特洛伊木馬 438
15.2.2 後門 439
15.2.3 邏輯炸彈 440
15.2.4 堆疊和緩衝區溢出 440
15.2.5 病毒 442
15.3 系統和網路的威脅 444
15.3.1 蠕蟲 445
15.3.2 連線埠掃描 447
15.3.3 拒絕服務 448
15.4 作為安全工具的密碼術 448
15.4.1 加密 449
15.4.2 密碼術的實現 454
15.4.3 例子:SSL 454
15.5 用戶認證 456
15.5.1 密碼 456
15.5.2 密碼漏洞 456
15.5.3 密碼安全 457
15.5.4 一次性密碼 458
15.5.5 生物識別技術 458
15.6 實現安全防禦 459
15.6.1 安全策略 459
15.6.2 漏洞評估 459
15.6.3 入侵檢測 460
15.6.4 病毒防護 462
15.6.5 審計、記賬和日誌 464
15.7 保護系統和網路的防火牆 464
15.8 計算機安全等級 465
15.9 例子:Windows 7 466
15.10 小結 468
習題 468
推薦讀物 469
參考文獻 470
第六部分 案例研究
第16章 Linux系統 474
16.1 Linux歷史 474
16.1.1 Linux核心 475
16.1.2 Linux系統 476
16.1.3 Linux發行 476
16.1.4 Linux許可 477
16.2 設計原則 477
16.3 核心模組 479
16.3.1 模組管理 480
16.3.2 驅動程式註冊 480
16.3.3 衝突解決 481
16.4 進程管理 481
16.4.1 fork()/exec()進程模型 481
16.4.2 進程與執行緒 483
16.5 調度 484
16.5.1 進程調度 484
16.5.2 實時調度 485
16.5.3 核心同步 486
16.5.4 對稱多處理 487
16.6 記憶體管理 488
16.6.1 物理記憶體管理 488
16.6.2 虛擬記憶體 490
16.6.3 執行與載入用戶程式 492
16.7 檔案系統 494
16.7.1 虛擬檔案系統 494
16.7.2 Linux ext3檔案系統 495
16.7.3 日誌 497
16.7.4 Linux進程檔案系統 497
16.8 輸入與輸出 498
16.8.1 塊設備 499
16.8.2 字元設備 500
16.9 進程間通信 500
16.9.1 同步與信號 500
16.9.2 進程間的數據傳遞 501
16.10 網路結構 501
16.11 安全 503
16.11.1 認證 503
16.11.2 訪問控制 503
16.12 小結 504
習題 505
推薦讀物 506
參考文獻 506
第17章 Windows 7 507
17.1 歷史 507
17.2 設計原則 509
17.2.1 安全性 509
17.2.2 可靠性 509
17.2.3 Windows和POSIX應用程式兼容性 510
17.2.4 高性能 511
17.2.5 可擴展性 512
17.2.6 可移植性 512
17.2.7 國際化支持 513
17.2.8 電源效率 513
17.2.9 動態設備支持 513
17.3 系統組件 513
17.3.1 硬體抽象層 514
17.3.2 核心 514
17.3.3 執行體 518
17.4 終端服務與快速用戶切換 531
17.5 檔案系統 532
17.5.1 NTFS內部布局 532
17.5.2 恢復 534
17.5.3 安全 535
17.5.4 卷管理和容錯 535
17.5.5 壓縮 536
17.5.6 安裝點、符號連結和硬連結 536
17.5.7 變更日誌 537
17.5.8 卷的影子副本 537
17.6 網路 537
17.6.1 網路接口 537
17.6.2 協定 537
17.6.3 重定向器與伺服器 539
17.6.4 域 540
17.6.5 活動 540
17.7 程式設計師接口 540
17.7.1 訪問核心對象 541
17.7.2 進程間共享對象 541
17.7.3 進程管理 542
17.7.4 使用Windows訊息傳遞的進程間通信 545
17.7.5 記憶體管理 546
17.8 小結 547
習題 548
推薦讀物 548
參考文獻 549
第18章 有影響的作業系統 550
18.1 特徵遷移 550
18.2 早期系統 551
18.2.1 專用計算機系統 551
18.2.2 共享計算機系統 552
18.2.3 重疊I/O 554
18.3 Atlas 555
18.4 XDS-940 556
18.5 THE 556
18.6 RC 4000 557
18.7 CTSS 558
18.8 MULTICS 558
18.9 IBM OS/360 558
18.10 TOPS-20 559
18.11 CP/M與MS/DOS 560
18.12 Macintosh OS與Windows 560
18.13 Mach 561
18.14 其他系統 562
習題 562
推薦讀物 562
參考文獻 563
索引 565