基本介紹
- 書名:現代作業系統(英文版·第4版)
- 作者:(荷)安德魯 S. 塔嫩鮑姆(Andrew S. Tanenbaum) 赫伯特·博斯(Herbert Bos) 著
- ISBN:978-7-111-58165-9
- 出版時間:2017-10
基本信息,內容簡介,目錄,
基本信息
作者:(荷)安德魯 S. 塔嫩鮑姆(Andrew S. Tanenbaum) 赫伯特·博斯(Herbert Bos) 著 |
ISBN(書號):978-7-111-58165-9 |
叢書名:經典原版書庫 |
出版日期:2017-10 |
版次:1/1 |
開本:16 |
定價:¥139.00 |
內容簡介
本書是作業系統的經典教材。在這一版中,Tanenbaum教授力邀來自谷歌和微軟的技術專家撰寫關於Android和Windows 8的新章節,此外,還添加了雲、虛擬化和安全等新技術的介紹。書中處處融會著作者對於設計與實現作業系統的各種技術的思考,他們的深刻洞察與清晰闡釋使得本書脫穎而出且經久不衰。
第4版重要更新
新增一章討論虛擬化和雲,新增一節講解Android作業系統,新增研究實例Windows 8。此外,安全方面還引入了攻擊和防禦技術的新知識。
習題更加豐富和靈活,這些題目不僅能考查讀者對基本原理的理解,提高動手能力,更重要的是啟發思考,在問題中挖掘作業系統的精髓。
每章的相關研究一節全部重寫,參考文獻收錄了上一版推出後的233篇新論文,這些對於在該領域進行深入探索的讀者而言非常有益
第4版重要更新
新增一章討論虛擬化和雲,新增一節講解Android作業系統,新增研究實例Windows 8。此外,安全方面還引入了攻擊和防禦技術的新知識。
習題更加豐富和靈活,這些題目不僅能考查讀者對基本原理的理解,提高動手能力,更重要的是啟發思考,在問題中挖掘作業系統的精髓。
每章的相關研究一節全部重寫,參考文獻收錄了上一版推出後的233篇新論文,這些對於在該領域進行深入探索的讀者而言非常有益
目錄
第1章 引論 1
1.1 什麼是作業系統 3
1.1.1 作為擴展機器的作業系統 4
1.1.2 作為資源管理者的作業系統 5
1.2 作業系統的歷史 6
1.2.1 第一代(1945~1955):真空管和穿孔卡片 7
1.2.2 第二代(1955~1965):電晶體和批處理系統 8
1.2.3 第三代(1965~1980):積體電路和多道程式設計 9
1.2.4 第四代(1980年至今):個人計算機 14
1.2.5 第五代(1990年至今):移動計算機 19
1.3 計算機硬體簡介 20
1.3.1 處理器 21
1.3.2 存儲器 24
1.3.3 磁碟 27
1.3.4 I/O設備 28
1.3.5 匯流排 31
1.3.6 啟動計算機 34
1.4 作業系統大觀園 35
1.4.1 大型機作業系統 35
1.4.2 伺服器作業系統 35
1.4.3 多處理器作業系統 36
1.4.4 個人計算機作業系統 36
1.4.5 掌上計算機作業系統 36
1.4.6 嵌入式作業系統 36
1.4.7 感測器節點作業系統 37
1.4.8 實時作業系統 37
1.4.9 智慧卡作業系統 38
1.5 作業系統概念 38
1.5.1 進程 39
1.5.2 地址空間 41
1.5.3 檔案 41
1.5.4 輸入/輸出 45
1.5.5 保護 45
1.5.6 shell 45
1.5.7 個體重複系統發育 46
1.6 系統調用 50
1.6.1 用於進程管理的系統調用 53
1.6.2 用於檔案管理的系統調用 56
1.6.3 用於目錄管理的系統調用 57
1.6.4 各種系統調用 59
1.6.5 Windows Win32 API 60
1.7 作業系統結構 62
1.7.1 單體系統 62
1.7.2 層次式系統 63
1.7.3 微核心 65
1.7.4 客戶端–伺服器模式 68
1.7.5 虛擬機 68
1.7.6 外核 72
1.8 依靠C的世界 73
1.8.1 C語言 73
1.8.2 頭檔案 74
1.8.3 大型編程項目 75
1.8.4 運行模型 76
1.9 有關作業系統的研究 77
1.10 本書其他部分概要 78
1.11 公制單位 79
1.12 小結 80
第2章 進程與執行緒 85
2.1 進程 85
2.1.1 進程模型 86
2.1.2 進程的創建 88
2.1.3 進程的終止 90
2.1.4 進程的層次結構 91
2.1.5 進程的狀態 92
2.1.6 進程的實現 94
2.1.7 多道程式設計模型 95
2.2 執行緒 97
2.2.1 執行緒的使用 97
2.2.2 經典的執行緒模型 102
2.2.3 POSIX執行緒 106
2.2.4 在用戶空間中實現執行緒 108
2.2.5 在核心中實現執行緒 111
2.2.6 混合實現 112
2.2.7 調度程式激活機制 113
2.2.8 彈出式執行緒 114
2.2.9 使單執行緒代碼多執行緒化 115
2.3 進程間通信 119
2.3.1 競爭條件 119
2.3.2 臨界區 121
2.3.3 忙等待的互斥 121
2.3.4 睡眠與喚醒 127
2.3.5 信號量 130
2.3.6 互斥量 132
2.3.7 管程 137
2.3.8 訊息傳遞 144
2.3.9 屏障 146
2.3.10 避免鎖:讀–複製–
更新 148
2.4 調度 148
2.4.1 調度簡介 149
2.4.2 批處理系統中的調度 156
2.4.3 互動式系統中的調度 158
2.4.4 實時系統中的調度 164
2.4.5 策略和機制 165
2.4.6 執行緒調度 165
2.5 經典的IPC問題 167
2.5.1 哲學家就餐問題 167
2.5.2 讀者–寫者問題 169
2.6 有關進程與執行緒的研究 172
2.7 小結 173
第3章 記憶體管理 181
3.1 無存儲器抽象 182
3.2 一種存儲器抽象:地址空間 185
3.2.1 地址空間的概念 185
3.2.2 交換技術 187
3.2.3 空閒記憶體管理 190
3.3 虛擬記憶體 194
3.3.1 分頁 195
3.3.2 頁表 198
3.3.3 加速分頁過程 201
3.3.4 針對大記憶體的頁表 205
3.4 頁面置換算法 209
3.4.1 最優頁面置換算法 209
3.4.2 最近未使用頁面置換算法 210
3.4.3 先進先出頁面置換算法 211
3.4.4 第二次機會頁面置換算法 211
3.4.5 時鐘頁面置換算法 212
3.4.6 最近最少使用頁面置換算法 213
3.4.7 用軟體模擬LRU 214
3.4.8 工作集頁面置換算法 215
3.4.9 工作集時鐘頁面置換算法 219
3.4.10 頁面置換算法小結 221
3.5 分頁系統中的設計問題 222
3.5.1 局部分配策略與全局分配策略 222
3.5.2 負載控制 225
3.5.3 頁面大小 225
3.5.4 分離的指令空間和數據空間 227
3.5.5 共享頁面 228
3.5.6 共享庫 229
3.5.7 記憶體映射檔案 231
3.5.8 清除策略 232
3.5.9 虛擬記憶體接口 232
3.6 有關實現的問題 233
3.6.1 與分頁有關的工作 233
3.6.2 缺頁中斷處理 234
3.6.3 指令備份 235
3.6.4 鎖定記憶體中的頁面 236
3.6.5 後備存儲 237
3.6.6 策略和機制的分離 239
3.7 分段 240
3.7.1 純分段的實現 243
3.7.2 分段和分頁結合:MULTICS 243
3.7.3 分段和分頁結合:Intel x86 247
3.8 有關記憶體管理的研究 252
3.9 小結 253
第4章 檔案系統 263
4.1 檔案 265
4.1.1 檔案命名 265
4.1.2 檔案結構 267
4.1.3 檔案類型 268
4.1.4 檔案訪問 269
4.1.5 檔案屬性 271
4.1.6 檔案操作 271
4.1.7 使用檔案系統調用的一個示例程式 273
4.2 目錄 276
4.2.1 一級目錄系統 276
4.2.2 層次目錄系統 276
4.2.3 路徑名 277
4.2.4 目錄操作 280
4.3 檔案系統的實現 281
4.3.1 檔案系統布局 281
4.3.2 檔案的實現 282
4.3.3 目錄的實現 287
4.3.4 已分享檔案 290
4.3.5 日誌結構檔案系統 293
4.3.6 日誌檔案系統 294
4.3.7 虛擬檔案系統 296
4.4 檔案系統管理和最佳化 299
4.4.1 磁碟空間管理 299
4.4.2 檔案系統備份 306
4.4.3 檔案系統的一致性 312
4.4.4 檔案系統性能 314
4.4.5 磁碟碎片整理 319
4.5 檔案系統實例 320
4.5.1 MS-DOS檔案系統 320
4.5.2 UNIX V7檔案系統 323
4.5.3 CD-ROM檔案系統 325
4.6 有關檔案系統的研究 331
4.7 小結 332
第5章 輸入/輸出 337
5.1 I/O硬體原理 337
5.1.1 I/O設備 338
5.1.2 設備控制器 339
5.1.3 記憶體映射I/O 340
5.1.4 直接存儲器存取 344
5.1.5 重溫中斷 347
5.2 I/O軟體原理 351
5.2.1 I/O軟體的目標 351
5.2.2 程式控制I/O 352
5.2.3 中斷驅動I/O 354
5.2.4 使用DMA的I/O 355
5.3 I/O軟體層次 356
5.3.1 中斷處理程式 356
5.3.2 設備驅動程式 357
5.3.3 與設備無關的I/O軟體 361
5.3.4 用戶空間的I/O軟體 367
5.4 盤 369
5.4.1 盤的硬體 369
5.4.2 磁碟格式化 375
5.4.3 磁碟臂調度算法 379
5.4.4 錯誤處理 382
5.4.5 穩定存儲器 385
5.5 時鐘 388
5.5.1 時鐘硬體 388
5.5.2 時鐘軟體 389
5.5.3 軟定時器 392
5.6 用戶界面:鍵盤、滑鼠和監視器 394
5.6.1 輸入軟體 394
5.6.2 輸出軟體 399
5.7 瘦客戶機 416
5.8 電源管理 417
5.8.1 硬體問題 418
5.8.2 作業系統問題 419
5.8.3 應用程式問題 425
5.9 有關輸入/輸出的研究 426
5.10 小結 428
第6章 死鎖 435
6.1 資源 436
6.1.1 可搶占資源和不可搶占資源 436
6.1.2 資源獲取 437
6.2 死鎖簡介 438
6.2.1 資源死鎖的條件 439
6.2.2 死鎖建模 440
6.3 鴕鳥算法 443
6.4 死鎖檢測和死鎖恢復 443
6.4.1 每種類型一個資源的死鎖檢測 444
6.4.2 每種類型多個資源的死鎖檢測 446
6.4.3 從死鎖中恢復 448
6.5 死鎖避免 450
6.5.1 資源軌跡圖 450
6.5.2 安全狀態和不安全狀態 452
6.5.3 單個資源的銀行家算法 453
6.5.4 多個資源的銀行家算法 454
6.6 死鎖預防 456
6.6.1 破壞互斥條件 456
6.6.2 破壞占有並等待條件 456
6.6.3 破壞不可搶占條件 457
6.6.4 破壞環路等待條件 457
6.7 其他問題 458
6.7.1 兩階段加鎖 458
6.7.2 通信死鎖 459
6.7.3 活鎖 461
6.7.4 飢餓 463
6.8 有關死鎖的研究 464
6.9 小結 464
第7章 虛擬化和雲 471
7.1 歷史 473
7.2 虛擬化的必要條件 474
7.3 第一類和第二類虛擬機管理程式 477
7.4 高效虛擬化技術 478
7.4.1 在不支持虛擬化的平台上實現虛擬化 479
7.4.2 虛擬化的開銷 482
7.5 虛擬機管理程式是正確的微核心嗎 483
7.6 記憶體虛擬化 486
7.7 I/O虛擬化 490
7.8 虛擬裝置 493
7.9 多核CPU上的虛擬機 494
7.10 授權問題 494
7.11 雲 495
7.11.1 雲即服務 496
7.11.2 虛擬機遷移 496
7.11.3 檢查點 497
7.12 案例研究:VMware 498
7.12.1 VMware的早期歷史 498
7.12.2 VMware Workstation 499
7.12.3 將虛擬化引入x86的挑戰 500
7.12.4 VMware Workstation解決方案概覽 502
7.12.5 VMware Workstation的演變 511
7.12.6 VMware的第一類虛擬機管理程式ESX Server 512
7.13 有關虛擬化和雲的研究 514
第8章 多處理機系統 517
8.1 多處理機 520
8.1.1 多處理機硬體 520
8.1.2 多處理機作業系統類型 530
8.1.3 多處理機同步 534
8.1.4 多處理機調度 539
8.2 多計算機 544
8.2.1 多計算機硬體 545
8.2.2 低層通信軟體 550
8.2.3 用戶層通信軟體 552
8.2.4 遠程過程調用 556
8.2.5 分散式共享存儲器 558
8.2.6 多計算機調度 563
8.2.7 負載平衡 563
8.3 分散式系統 566
8.3.1 網路硬體 568
8.3.2 網路服務和協定 571
8.3.3 基於文檔的中間件 576
8.3.4 基於檔案系統的中間件 577
8.3.5 基於對象的中間件 582
8.3.6 基於協作的中間件 584
8.4 有關多處理機系統的研究 587
8.5 小結 588
第9章 安全 593
9.1 環境安全 595
9.1.1 威脅 596
9.1.2 入侵者 598
9.2 作業系統完全 599
9.2.1 可信系統 600
9.2.2 可信計算基 601
9.3 保護機制 602
9.3.1 保護域 602
9.3.2 訪問控制列表 605
9.3.3 權能字 608
9.4 安全系統的形式化模型 611
9.4.1 多級安全 612
9.4.2 隱蔽信道 615
9.5 密碼學原理 619
9.5.1 私鑰加密技術 620
9.5.2 公鑰加密技術 621
9.5.3 單向函式 622
9.5.4 數字簽名 622
9.5.5 可信平台模組 624
9.6 認證 626
9.6.1 使用物理識別的認證方式 633
9.6.2 使用生物識別的認證方式 636
9.7 軟體漏洞 639
9.7.1 緩衝區溢出攻擊 640
9.7.2 格式化字元串攻擊 649
9.7.3 懸垂指針 652
9.7.4 空指針間接引用攻擊 653
9.7.5 整數溢出攻擊 654
9.7.6 命令注入攻擊 655
9.7.7 檢查時間/使用時間攻擊 656
9.8 內部攻擊 657
9.8.1 邏輯炸彈 657
9.8.2 後門陷阱 658
9.8.3 登錄欺騙 659
9.9 惡意軟體 660
9.9.1 特洛伊木馬 662
9.9.2 病毒 664
9.9.3 蠕蟲 674
9.9.4 間諜軟體 676
9.9.5 rootkit 680
9.10 防禦 684
9.10.1 防火牆 685
9.10.2 反病毒和抑制反病毒技術 687
9.10.3 代碼簽名 693
9.10.4 囚禁 694
9.10.5 基於模型的入侵檢測 695
9.10.6 封裝移動代碼 697
9.10.7 Java安全性 701
9.11 有關安全的研究 703
9.12 小結 704
第10章 實例研究1:UNIX、Linux和Android 713
10.1 UNIX與Linux的歷史 714
10.1.1 UNICS 714
10.1.2 PDP-11 UNIX 715
10.1.3 可移植的UNIX 716
10.1.4 Berkeley UNIX 717
10.1.5 標準UNIX 718
10.1.6 MINIX 719
10.1.7 Linux 720
10.2 Linux簡介 723
10.2.1 Linux的設計目標 723
10.2.2 到Linux的接口 724
10.2.3 shell 725
10.2.4 Linux應用程式 728
10.2.5 核心結構 730
10.3 Linux中的進程 733
10.3.1 基本概念 733
10.3.2 Linux中進程管理相關的系統調用 735
10.3.3 Linux中進程與執行緒的實現 739
10.3.4 Linux中的調度 746
10.3.5 啟動Linux系統 751
10.4 Linux中的記憶體管理 753
10.4.1 基本概念 753
10.4.2 Linux中的記憶體管理系統調用 756
10.4.3 Linux中記憶體管理的實現 758
10.4.4 Linux中的分頁 764
10.5 Linux中的I/O系統 767
10.5.1 基本概念 767
10.5.2 網路 769
10.5.3 Linux中的I/O系統調用 770
10.5.4 I/O在Linux中的實現 771
10.5.5 Linux中的模組 774
10.6 Linux檔案系統 775
10.6.1 基本概念 775
10.6.2 Linux中的檔案系統調用 780
10.6.3 Linux檔案系統的實現 783
10.6.4 NFS:網路檔案系統 792
10.7 Linux的安全性 798
10.7.1 基本概念 798
10.7.2 Linux中安全相關的系統調用 800
10.7.3 Linux中的安全實現 801
10.8 Android 802
10.8.1 Android與Google 803
10.8.2 Android的歷史 803
10.8.3 設計目標 807
10.8.4 Android體系結構 809
10.8.5 Linux擴展 810
10.8.6 Dalvik 814
10.8.7 Binder IPC 815
10.8.8 Android套用 824
10.8.9 意圖 836
10.8.10 應用程式沙箱 837
10.8.11 安全性 838
10.8.12 進程模型 844
10.9 小結 848
第11章 實例研究2:Windows 8 857
11.1 Windows 8.1的歷史 857
11.1.1 20世紀80年代:MS-DOS 857
11.1.2 20世紀90年代:基於MS-DOS的Windows 859
11.1.3 21世紀00年代:基於NT的Windows 859
11.1.4 Windows Vista 862
11.1.5 21世紀10年代:現代Windows 863
11.2 Windows 編程 864
11.2.1 原生NT套用編程接口 867
11.2.2 Win32套用編程接口 871
11.2.3 Windows註冊表 875
11.3 系統結構 877
11.3.1 作業系統結構 877
11.3.2 啟動Windows 893
11.3.3 對象管理器的實現 894
11.3.4 子系統、DLL和用戶態服務 905
11.4 Windows中的進程和執行緒 908
11.4.1 基本概念 908
11.4.2 作業、進程、執行緒和纖程管理API調用 914
11.4.3 進程和執行緒的實現 919
11.5 記憶體管理 927
11.5.1 基本概念 927
11.5.2 記憶體管理系統調用 931
11.5.3 存儲管理的實現 932
11.6 Windows的高速快取 942
11.7 Windows的I/O 943
11.7.1 基本概念 944
11.7.2 I/O的API調用 945
11.7.3 I/O實現 948
11.8 Windows NT檔案系統 952
11.8.1 基本概念 953
11.8.2 NTFS檔案系統的實現 954
11.9 Windows電源管理 964
11.10 Windows 8中的安全 966
11.10.1 基本概念 967
11.10.2 安全相關的API調用 969
11.10.3 安全實現 970
11.10.4 安全緩解技術 972
11.11 小結 975
第12章 作業系統設計 981
12.1 設計問題的本質 982
12.1.1 目標 982
12.1.2 設計作業系統為什麼困難 983
12.2 接口設計 985
12.2.1 指導原則 985
12.2.2 范型 987
12.2.3 系統調用接口 991
12.3 實現 993
12.3.1 系統結構 993
12.3.2 機制與策略 997
12.3.3 正交性 998
12.3.4 命名 999
12.3.5 綁定的時機 1001
12.3.6 靜態與動態結構 1001
12.3.7 自頂向下與自底向上的實現 1003
12.3.8 同步通信與異步通信 1004
12.3.9 實用技術 1005
12.4 性能 1010
12.4.1 作業系統為什麼運行緩慢 1010
12.4.2 什麼應該最佳化 1011
12.4.3 空間–時間的權衡 1012
12.4.4 快取 1015
12.4.5 線索 1016
12.4.6 利用局部性 1016
12.4.7 最佳化常見的情況 1017
12.5 項目管理 1018
12.5.1 人月神話 1018
12.5.2 團隊結構 1019
12.5.3 經驗的作用 1021
12.5.4 沒有銀彈 1021
12.6 作業系統設計的趨勢 1022
12.6.1 虛擬化與雲 1023
12.6.2 眾核晶片 1023
12.6.3 大型地址空間作業系統 1024
12.6.4 無縫的數據訪問 1025
12.6.5 電池供電的計算機 1025
12.6.6 嵌入式系統 1026
12.7 小結 1027
第13章 參考書目與文獻 1031
13.1 進行深入閱讀的建議 1031
13.1.1 引論 1031
13.1.2 進程與執行緒 1032
13.1.3 記憶體管理 1033
13.1.4 檔案系統 1033
13.1.5 輸入/輸出 1034
13.1.6 死鎖 1035
13.1.7 虛擬化和雲 1035
13.1.8 多處理機系統 1036
13.1.9 安全 1037
13.1.10 實例研究1:UNIX、Linux和Android 1039
13.1.11 實例研究2:Windows 8 1040
13.1.12 作業系統設計 1040
13.2 按字母順序排序的參考文獻 1041
1.1 什麼是作業系統 3
1.1.1 作為擴展機器的作業系統 4
1.1.2 作為資源管理者的作業系統 5
1.2 作業系統的歷史 6
1.2.1 第一代(1945~1955):真空管和穿孔卡片 7
1.2.2 第二代(1955~1965):電晶體和批處理系統 8
1.2.3 第三代(1965~1980):積體電路和多道程式設計 9
1.2.4 第四代(1980年至今):個人計算機 14
1.2.5 第五代(1990年至今):移動計算機 19
1.3 計算機硬體簡介 20
1.3.1 處理器 21
1.3.2 存儲器 24
1.3.3 磁碟 27
1.3.4 I/O設備 28
1.3.5 匯流排 31
1.3.6 啟動計算機 34
1.4 作業系統大觀園 35
1.4.1 大型機作業系統 35
1.4.2 伺服器作業系統 35
1.4.3 多處理器作業系統 36
1.4.4 個人計算機作業系統 36
1.4.5 掌上計算機作業系統 36
1.4.6 嵌入式作業系統 36
1.4.7 感測器節點作業系統 37
1.4.8 實時作業系統 37
1.4.9 智慧卡作業系統 38
1.5 作業系統概念 38
1.5.1 進程 39
1.5.2 地址空間 41
1.5.3 檔案 41
1.5.4 輸入/輸出 45
1.5.5 保護 45
1.5.6 shell 45
1.5.7 個體重複系統發育 46
1.6 系統調用 50
1.6.1 用於進程管理的系統調用 53
1.6.2 用於檔案管理的系統調用 56
1.6.3 用於目錄管理的系統調用 57
1.6.4 各種系統調用 59
1.6.5 Windows Win32 API 60
1.7 作業系統結構 62
1.7.1 單體系統 62
1.7.2 層次式系統 63
1.7.3 微核心 65
1.7.4 客戶端–伺服器模式 68
1.7.5 虛擬機 68
1.7.6 外核 72
1.8 依靠C的世界 73
1.8.1 C語言 73
1.8.2 頭檔案 74
1.8.3 大型編程項目 75
1.8.4 運行模型 76
1.9 有關作業系統的研究 77
1.10 本書其他部分概要 78
1.11 公制單位 79
1.12 小結 80
第2章 進程與執行緒 85
2.1 進程 85
2.1.1 進程模型 86
2.1.2 進程的創建 88
2.1.3 進程的終止 90
2.1.4 進程的層次結構 91
2.1.5 進程的狀態 92
2.1.6 進程的實現 94
2.1.7 多道程式設計模型 95
2.2 執行緒 97
2.2.1 執行緒的使用 97
2.2.2 經典的執行緒模型 102
2.2.3 POSIX執行緒 106
2.2.4 在用戶空間中實現執行緒 108
2.2.5 在核心中實現執行緒 111
2.2.6 混合實現 112
2.2.7 調度程式激活機制 113
2.2.8 彈出式執行緒 114
2.2.9 使單執行緒代碼多執行緒化 115
2.3 進程間通信 119
2.3.1 競爭條件 119
2.3.2 臨界區 121
2.3.3 忙等待的互斥 121
2.3.4 睡眠與喚醒 127
2.3.5 信號量 130
2.3.6 互斥量 132
2.3.7 管程 137
2.3.8 訊息傳遞 144
2.3.9 屏障 146
2.3.10 避免鎖:讀–複製–
更新 148
2.4 調度 148
2.4.1 調度簡介 149
2.4.2 批處理系統中的調度 156
2.4.3 互動式系統中的調度 158
2.4.4 實時系統中的調度 164
2.4.5 策略和機制 165
2.4.6 執行緒調度 165
2.5 經典的IPC問題 167
2.5.1 哲學家就餐問題 167
2.5.2 讀者–寫者問題 169
2.6 有關進程與執行緒的研究 172
2.7 小結 173
第3章 記憶體管理 181
3.1 無存儲器抽象 182
3.2 一種存儲器抽象:地址空間 185
3.2.1 地址空間的概念 185
3.2.2 交換技術 187
3.2.3 空閒記憶體管理 190
3.3 虛擬記憶體 194
3.3.1 分頁 195
3.3.2 頁表 198
3.3.3 加速分頁過程 201
3.3.4 針對大記憶體的頁表 205
3.4 頁面置換算法 209
3.4.1 最優頁面置換算法 209
3.4.2 最近未使用頁面置換算法 210
3.4.3 先進先出頁面置換算法 211
3.4.4 第二次機會頁面置換算法 211
3.4.5 時鐘頁面置換算法 212
3.4.6 最近最少使用頁面置換算法 213
3.4.7 用軟體模擬LRU 214
3.4.8 工作集頁面置換算法 215
3.4.9 工作集時鐘頁面置換算法 219
3.4.10 頁面置換算法小結 221
3.5 分頁系統中的設計問題 222
3.5.1 局部分配策略與全局分配策略 222
3.5.2 負載控制 225
3.5.3 頁面大小 225
3.5.4 分離的指令空間和數據空間 227
3.5.5 共享頁面 228
3.5.6 共享庫 229
3.5.7 記憶體映射檔案 231
3.5.8 清除策略 232
3.5.9 虛擬記憶體接口 232
3.6 有關實現的問題 233
3.6.1 與分頁有關的工作 233
3.6.2 缺頁中斷處理 234
3.6.3 指令備份 235
3.6.4 鎖定記憶體中的頁面 236
3.6.5 後備存儲 237
3.6.6 策略和機制的分離 239
3.7 分段 240
3.7.1 純分段的實現 243
3.7.2 分段和分頁結合:MULTICS 243
3.7.3 分段和分頁結合:Intel x86 247
3.8 有關記憶體管理的研究 252
3.9 小結 253
第4章 檔案系統 263
4.1 檔案 265
4.1.1 檔案命名 265
4.1.2 檔案結構 267
4.1.3 檔案類型 268
4.1.4 檔案訪問 269
4.1.5 檔案屬性 271
4.1.6 檔案操作 271
4.1.7 使用檔案系統調用的一個示例程式 273
4.2 目錄 276
4.2.1 一級目錄系統 276
4.2.2 層次目錄系統 276
4.2.3 路徑名 277
4.2.4 目錄操作 280
4.3 檔案系統的實現 281
4.3.1 檔案系統布局 281
4.3.2 檔案的實現 282
4.3.3 目錄的實現 287
4.3.4 已分享檔案 290
4.3.5 日誌結構檔案系統 293
4.3.6 日誌檔案系統 294
4.3.7 虛擬檔案系統 296
4.4 檔案系統管理和最佳化 299
4.4.1 磁碟空間管理 299
4.4.2 檔案系統備份 306
4.4.3 檔案系統的一致性 312
4.4.4 檔案系統性能 314
4.4.5 磁碟碎片整理 319
4.5 檔案系統實例 320
4.5.1 MS-DOS檔案系統 320
4.5.2 UNIX V7檔案系統 323
4.5.3 CD-ROM檔案系統 325
4.6 有關檔案系統的研究 331
4.7 小結 332
第5章 輸入/輸出 337
5.1 I/O硬體原理 337
5.1.1 I/O設備 338
5.1.2 設備控制器 339
5.1.3 記憶體映射I/O 340
5.1.4 直接存儲器存取 344
5.1.5 重溫中斷 347
5.2 I/O軟體原理 351
5.2.1 I/O軟體的目標 351
5.2.2 程式控制I/O 352
5.2.3 中斷驅動I/O 354
5.2.4 使用DMA的I/O 355
5.3 I/O軟體層次 356
5.3.1 中斷處理程式 356
5.3.2 設備驅動程式 357
5.3.3 與設備無關的I/O軟體 361
5.3.4 用戶空間的I/O軟體 367
5.4 盤 369
5.4.1 盤的硬體 369
5.4.2 磁碟格式化 375
5.4.3 磁碟臂調度算法 379
5.4.4 錯誤處理 382
5.4.5 穩定存儲器 385
5.5 時鐘 388
5.5.1 時鐘硬體 388
5.5.2 時鐘軟體 389
5.5.3 軟定時器 392
5.6 用戶界面:鍵盤、滑鼠和監視器 394
5.6.1 輸入軟體 394
5.6.2 輸出軟體 399
5.7 瘦客戶機 416
5.8 電源管理 417
5.8.1 硬體問題 418
5.8.2 作業系統問題 419
5.8.3 應用程式問題 425
5.9 有關輸入/輸出的研究 426
5.10 小結 428
第6章 死鎖 435
6.1 資源 436
6.1.1 可搶占資源和不可搶占資源 436
6.1.2 資源獲取 437
6.2 死鎖簡介 438
6.2.1 資源死鎖的條件 439
6.2.2 死鎖建模 440
6.3 鴕鳥算法 443
6.4 死鎖檢測和死鎖恢復 443
6.4.1 每種類型一個資源的死鎖檢測 444
6.4.2 每種類型多個資源的死鎖檢測 446
6.4.3 從死鎖中恢復 448
6.5 死鎖避免 450
6.5.1 資源軌跡圖 450
6.5.2 安全狀態和不安全狀態 452
6.5.3 單個資源的銀行家算法 453
6.5.4 多個資源的銀行家算法 454
6.6 死鎖預防 456
6.6.1 破壞互斥條件 456
6.6.2 破壞占有並等待條件 456
6.6.3 破壞不可搶占條件 457
6.6.4 破壞環路等待條件 457
6.7 其他問題 458
6.7.1 兩階段加鎖 458
6.7.2 通信死鎖 459
6.7.3 活鎖 461
6.7.4 飢餓 463
6.8 有關死鎖的研究 464
6.9 小結 464
第7章 虛擬化和雲 471
7.1 歷史 473
7.2 虛擬化的必要條件 474
7.3 第一類和第二類虛擬機管理程式 477
7.4 高效虛擬化技術 478
7.4.1 在不支持虛擬化的平台上實現虛擬化 479
7.4.2 虛擬化的開銷 482
7.5 虛擬機管理程式是正確的微核心嗎 483
7.6 記憶體虛擬化 486
7.7 I/O虛擬化 490
7.8 虛擬裝置 493
7.9 多核CPU上的虛擬機 494
7.10 授權問題 494
7.11 雲 495
7.11.1 雲即服務 496
7.11.2 虛擬機遷移 496
7.11.3 檢查點 497
7.12 案例研究:VMware 498
7.12.1 VMware的早期歷史 498
7.12.2 VMware Workstation 499
7.12.3 將虛擬化引入x86的挑戰 500
7.12.4 VMware Workstation解決方案概覽 502
7.12.5 VMware Workstation的演變 511
7.12.6 VMware的第一類虛擬機管理程式ESX Server 512
7.13 有關虛擬化和雲的研究 514
第8章 多處理機系統 517
8.1 多處理機 520
8.1.1 多處理機硬體 520
8.1.2 多處理機作業系統類型 530
8.1.3 多處理機同步 534
8.1.4 多處理機調度 539
8.2 多計算機 544
8.2.1 多計算機硬體 545
8.2.2 低層通信軟體 550
8.2.3 用戶層通信軟體 552
8.2.4 遠程過程調用 556
8.2.5 分散式共享存儲器 558
8.2.6 多計算機調度 563
8.2.7 負載平衡 563
8.3 分散式系統 566
8.3.1 網路硬體 568
8.3.2 網路服務和協定 571
8.3.3 基於文檔的中間件 576
8.3.4 基於檔案系統的中間件 577
8.3.5 基於對象的中間件 582
8.3.6 基於協作的中間件 584
8.4 有關多處理機系統的研究 587
8.5 小結 588
第9章 安全 593
9.1 環境安全 595
9.1.1 威脅 596
9.1.2 入侵者 598
9.2 作業系統完全 599
9.2.1 可信系統 600
9.2.2 可信計算基 601
9.3 保護機制 602
9.3.1 保護域 602
9.3.2 訪問控制列表 605
9.3.3 權能字 608
9.4 安全系統的形式化模型 611
9.4.1 多級安全 612
9.4.2 隱蔽信道 615
9.5 密碼學原理 619
9.5.1 私鑰加密技術 620
9.5.2 公鑰加密技術 621
9.5.3 單向函式 622
9.5.4 數字簽名 622
9.5.5 可信平台模組 624
9.6 認證 626
9.6.1 使用物理識別的認證方式 633
9.6.2 使用生物識別的認證方式 636
9.7 軟體漏洞 639
9.7.1 緩衝區溢出攻擊 640
9.7.2 格式化字元串攻擊 649
9.7.3 懸垂指針 652
9.7.4 空指針間接引用攻擊 653
9.7.5 整數溢出攻擊 654
9.7.6 命令注入攻擊 655
9.7.7 檢查時間/使用時間攻擊 656
9.8 內部攻擊 657
9.8.1 邏輯炸彈 657
9.8.2 後門陷阱 658
9.8.3 登錄欺騙 659
9.9 惡意軟體 660
9.9.1 特洛伊木馬 662
9.9.2 病毒 664
9.9.3 蠕蟲 674
9.9.4 間諜軟體 676
9.9.5 rootkit 680
9.10 防禦 684
9.10.1 防火牆 685
9.10.2 反病毒和抑制反病毒技術 687
9.10.3 代碼簽名 693
9.10.4 囚禁 694
9.10.5 基於模型的入侵檢測 695
9.10.6 封裝移動代碼 697
9.10.7 Java安全性 701
9.11 有關安全的研究 703
9.12 小結 704
第10章 實例研究1:UNIX、Linux和Android 713
10.1 UNIX與Linux的歷史 714
10.1.1 UNICS 714
10.1.2 PDP-11 UNIX 715
10.1.3 可移植的UNIX 716
10.1.4 Berkeley UNIX 717
10.1.5 標準UNIX 718
10.1.6 MINIX 719
10.1.7 Linux 720
10.2 Linux簡介 723
10.2.1 Linux的設計目標 723
10.2.2 到Linux的接口 724
10.2.3 shell 725
10.2.4 Linux應用程式 728
10.2.5 核心結構 730
10.3 Linux中的進程 733
10.3.1 基本概念 733
10.3.2 Linux中進程管理相關的系統調用 735
10.3.3 Linux中進程與執行緒的實現 739
10.3.4 Linux中的調度 746
10.3.5 啟動Linux系統 751
10.4 Linux中的記憶體管理 753
10.4.1 基本概念 753
10.4.2 Linux中的記憶體管理系統調用 756
10.4.3 Linux中記憶體管理的實現 758
10.4.4 Linux中的分頁 764
10.5 Linux中的I/O系統 767
10.5.1 基本概念 767
10.5.2 網路 769
10.5.3 Linux中的I/O系統調用 770
10.5.4 I/O在Linux中的實現 771
10.5.5 Linux中的模組 774
10.6 Linux檔案系統 775
10.6.1 基本概念 775
10.6.2 Linux中的檔案系統調用 780
10.6.3 Linux檔案系統的實現 783
10.6.4 NFS:網路檔案系統 792
10.7 Linux的安全性 798
10.7.1 基本概念 798
10.7.2 Linux中安全相關的系統調用 800
10.7.3 Linux中的安全實現 801
10.8 Android 802
10.8.1 Android與Google 803
10.8.2 Android的歷史 803
10.8.3 設計目標 807
10.8.4 Android體系結構 809
10.8.5 Linux擴展 810
10.8.6 Dalvik 814
10.8.7 Binder IPC 815
10.8.8 Android套用 824
10.8.9 意圖 836
10.8.10 應用程式沙箱 837
10.8.11 安全性 838
10.8.12 進程模型 844
10.9 小結 848
第11章 實例研究2:Windows 8 857
11.1 Windows 8.1的歷史 857
11.1.1 20世紀80年代:MS-DOS 857
11.1.2 20世紀90年代:基於MS-DOS的Windows 859
11.1.3 21世紀00年代:基於NT的Windows 859
11.1.4 Windows Vista 862
11.1.5 21世紀10年代:現代Windows 863
11.2 Windows 編程 864
11.2.1 原生NT套用編程接口 867
11.2.2 Win32套用編程接口 871
11.2.3 Windows註冊表 875
11.3 系統結構 877
11.3.1 作業系統結構 877
11.3.2 啟動Windows 893
11.3.3 對象管理器的實現 894
11.3.4 子系統、DLL和用戶態服務 905
11.4 Windows中的進程和執行緒 908
11.4.1 基本概念 908
11.4.2 作業、進程、執行緒和纖程管理API調用 914
11.4.3 進程和執行緒的實現 919
11.5 記憶體管理 927
11.5.1 基本概念 927
11.5.2 記憶體管理系統調用 931
11.5.3 存儲管理的實現 932
11.6 Windows的高速快取 942
11.7 Windows的I/O 943
11.7.1 基本概念 944
11.7.2 I/O的API調用 945
11.7.3 I/O實現 948
11.8 Windows NT檔案系統 952
11.8.1 基本概念 953
11.8.2 NTFS檔案系統的實現 954
11.9 Windows電源管理 964
11.10 Windows 8中的安全 966
11.10.1 基本概念 967
11.10.2 安全相關的API調用 969
11.10.3 安全實現 970
11.10.4 安全緩解技術 972
11.11 小結 975
第12章 作業系統設計 981
12.1 設計問題的本質 982
12.1.1 目標 982
12.1.2 設計作業系統為什麼困難 983
12.2 接口設計 985
12.2.1 指導原則 985
12.2.2 范型 987
12.2.3 系統調用接口 991
12.3 實現 993
12.3.1 系統結構 993
12.3.2 機制與策略 997
12.3.3 正交性 998
12.3.4 命名 999
12.3.5 綁定的時機 1001
12.3.6 靜態與動態結構 1001
12.3.7 自頂向下與自底向上的實現 1003
12.3.8 同步通信與異步通信 1004
12.3.9 實用技術 1005
12.4 性能 1010
12.4.1 作業系統為什麼運行緩慢 1010
12.4.2 什麼應該最佳化 1011
12.4.3 空間–時間的權衡 1012
12.4.4 快取 1015
12.4.5 線索 1016
12.4.6 利用局部性 1016
12.4.7 最佳化常見的情況 1017
12.5 項目管理 1018
12.5.1 人月神話 1018
12.5.2 團隊結構 1019
12.5.3 經驗的作用 1021
12.5.4 沒有銀彈 1021
12.6 作業系統設計的趨勢 1022
12.6.1 虛擬化與雲 1023
12.6.2 眾核晶片 1023
12.6.3 大型地址空間作業系統 1024
12.6.4 無縫的數據訪問 1025
12.6.5 電池供電的計算機 1025
12.6.6 嵌入式系統 1026
12.7 小結 1027
第13章 參考書目與文獻 1031
13.1 進行深入閱讀的建議 1031
13.1.1 引論 1031
13.1.2 進程與執行緒 1032
13.1.3 記憶體管理 1033
13.1.4 檔案系統 1033
13.1.5 輸入/輸出 1034
13.1.6 死鎖 1035
13.1.7 虛擬化和雲 1035
13.1.8 多處理機系統 1036
13.1.9 安全 1037
13.1.10 實例研究1:UNIX、Linux和Android 1039
13.1.11 實例研究2:Windows 8 1040
13.1.12 作業系統設計 1040
13.2 按字母順序排序的參考文獻 1041