目錄
齣版者的話
譯者序
序言
前言
第1章 從頭說起1
1.1簡介1
1.1.1 UNIX簡史1
1.1.2 起源1
1.1.3 擴散2
1.1.4 BSD3
1.1.5 System V4
1.1.6 商業化5
1.1.7 Mach5
1.1.8 標準5
1.1.9 OSF和UI6
1.1.10 SVR4及其之後7
1.2 變革使命8
1.2.1 功能8
1.2.2 網絡8
1.2.3 性能9
1.2.4 硬件變化9
1.2.5 質量提升10
1.2.6 變革10
1.2.7 其他應用程序領域11
1.2.8 小即是美11
1.2.9 靈活性12
1.3 迴顧過去,展望未來13
1.3.1 UNIX係統的優點是什麼13
1.3.2 UNIX係統的缺點是什麼14
1.4 本書內容說明15
參考文獻15
第2章 進程與內核17
2.1 簡介17
2.2 模式、空間和上下文19
2.3 進程抽象21
2.3.1進程狀態21
2.3.2 進程上下文23
2.3.3 用戶憑據23
2.3.4 u區和proc結構24
2.4 執行在內核態中26
2.4.1 係統調用接口26
2.4.2 中斷處理27
2.5 同步29
2.5.1 阻塞操作29
2.5.2 中斷30
2.5.3 多處理器31
2.6 進程調度31
2.7 信號32
2.8 新的進程和程序33
2.8.1 fork和exec33
2.8.2 進程的創建34
2.8.3 fork的優化35
2.8.4 調用新的程序35
2.8.5 進程終止37
2.8.6 等待進程終止37
2.8.7 僵死進程38
2.9 小結39
2.10 練習題39
參考文獻39
第3章 綫程和輕量級進程41
3.1 簡介41
3.1.1 動機41
3.1.2 多綫程和多處理器42
3.1.3 並發和並行43
3.2 基本抽象44
3.2.1 內核綫程45
3.2.2 輕量級進程45
3.2.3 用戶綫程46
3.3 輕量級綫程設計時要考慮的問題49
3.3.1 fork的語義49
3.3.2 其他係統調用50
3.3.3 信號傳遞和處理50
3.3.4 可見性51
3.3.5 棧增長51
3.4 用戶級彆的綫程庫51
3.4.1 編程接口52
3.4.2 綫程庫的實現52
3.5 調度器激活53
3.6 Solaris和SVR4上的多綫程54
3.6.1 內核綫程54
3.6.2 輕量級進程的實現55
3.6.3 用戶綫程56
3.6.4 用戶綫程的實現56
3.6.5 中斷處理57
3.6.6 係統調用處理58
3.7 Mach的綫程58
3.7.1 Mach抽象:任務和綫程58
3.7.2 Mach的C-threads59
3.8 Digital UNIX60
3.8.1 UNIX接口60
3.8.2 係統調用和信號62
3.8.3 pthreads庫62
3.9 Mach 3.0的continuation63
3.9.1 編程模型63
3.9.2 使用continuation63
3.9.3 優化65
3.9.4 分析65
3.10 小結65
3.11 練習題66
參考文獻66
第4章 信號和會話管理68
4.1 簡介68
4.2 信號生成和處理68
4.2.1 信號處理69
4.2.2 信號的生成71
4.2.3 典型場景72
4.2.4 睡眠與信號72
4.3 不可靠的信號73
4.4 可靠的信號74
4.4.1 主要特性74
4.4.2 SVR3實現75
4.4.3 BSD信號管理75
4.5 SVR4上的信號76
4.6 信號的實現77
4.6.1 信號生成78
4.6.2 交付和處理78
4.7 異常79
4.8 Mach的異常處理79
4.8.1 異常端口80
4.8.2 錯誤處理80
4.8.3 調試器交互81
4.8.4 分析81
4.9 進程組和終端管理82
4.9.1 基本概念82
4.9.2 SVR3模型83
4.9.3 限製84
4.9.4 4.3BSD的進程組和終端84
4.9.5 缺點86
4.10 SVR4的會話體係結構86
4.10.1 動機87
4.10.2 會話和進程組87
4.10.3 數據結構88
4.10.4 控製終端89
4.10.5 4.4BSD的會話實現機製89
4.11 小結90
4.12 練習題90
參考文獻91
第5章 進程調度92
5.1 簡介92
5.2 時鍾中斷處理93
5.2.1 callout93
5.2.2 告警95
5.3 調度器目標95
5.4 傳統的UNIX調度96
5.4.1 進程優先級97
5.4.2 調度器的實現98
5.4.3 運行隊列的操作99
5.4.4 分析99
5.5 SVR4調度器100
5.5.1 類無關層100
5.5.2 調度類的接口101
5.5.3 分時類103
5.5.4 實時類104
5.5.5 priocntl係統調用105
5.5.6 分析106
5.6 Solaris 2.x調度的改善107
5.6.1 可搶占的內核107
5.6.2 多處理器的支持107
5.6.3 隱式調度108
5.6.4 優先級反轉109
5.6.5 優先級繼承的實現110
5.6.6 優先級繼承的局限性112
5.6.7 turnstile113
5.6.8 分析113
5.7 Mach上的調度113
多處理器支持114
5.8 Digital UNIX的實時調度116
多處理器支持116
5.9 其他調度實現117
5.9.1 公平調度方法117
5.9.2 最終期限驅動調度方法117
5.9.3 三級調度器118
5.10 小結119
5.11 練習題119
參考文獻120
第6章 進程間通信121
6.1 簡介121
6.2 通用的IPC方法121
6.2.1 信號122
6.2.2 管道122
6.2.3 SVR4管道124
6.2.4 進程跟蹤124
6.3 System V IPC126
6.3.1 公共元素126
6.3.2 信號量127
6.3.3 消息隊列130
6.3.4 共享內存131
6.3.5 討論133
6.4 Mach IPC133
基本概念134
6.5 消息135
6.5.1 消息數據結構135
6.5.2 消息傳遞接口136
6.6 端口137
6.6.1 端口命名空間137
6.6.2 端口數據結構138
6.6.3 端口轉換138
6.7 消息傳遞139
6.7.1 轉換端口權利140
6.7.2 out-of-line內存141
6.7.3 控製流142
6.7.4 通知143
6.8 端口操作143
6.8.1 銷毀端口143
6.8.2 備份端口144
6.8.3 端口集閤144
6.8.4 端口插補145
6.9 擴展性145
6.10 Mach 3.0的增強146
6.10.1 一次性的發送權利147
6.10.2 Mach 3.0的通知147
6.10.3 發送權利的用戶引用計數148
6.11 討論148
6.12 小結149
6.13 練習題149
參考文獻149
第7章 同步和多處理器151
7.1 簡介151
7.2 傳統UNIX內核裏的同步機製152
7.2.1 中斷屏蔽152
7.2.2 睡眠和喚醒152
7.2.3 傳統方法的局限性153
7.3 多處理器係統154
7.3.1 內存模型154
7.3.2 同步支持155
7.3.3 軟件體係架構156
7.4 多處理器的同步問題157
7.4.1 喚醒丟失問題157
7.4.2 驚群問題158
7.5 信號量158
7.5.1 信號量提供互斥操作159
7.5.2 使用信號量提供事件等待159
7.5.3 使用信號量來控製可計數的資源160
7.5.4 信號量的缺點160
7.5.5 Convoy161
7.6 自鏇鎖162
7.7 條件變量163
7.7.1 實現問題164
7.7.2 事件165
7.7.3 阻塞鎖165
7.8 讀寫鎖165
7.8.1 設計考慮165
7.8.2 實現166
7.9 引用計數167
7.10 其他考慮168
7.10.1 死鎖避免168
7.10.2 遞歸鎖169
7.10.3 阻塞還是自鏇170
7.10.4 鎖什麼170
7.10.5 粒度和持續時間170
7.11 案例研究171
7.11.1 SVR4.2/MP171
7.11.2 Digital UNIX172
7.11.3 其他實現173
7.12 小結174
7.13 練習題174
參考文獻175
第8章 文件係統接口和框架176
8.1 簡介176
8.2 文件的用戶接口176
8.2.1 文件和目錄177
8.2.2 文件屬性178
8.2.3 文件描述符179
8.2.4 文件I/O181
8.2.5 分散-聚集I/O182
8.2.6 文件鎖機製183
8.3 文件係統183
8.4 特殊文件184
8.4.1 符號鏈接184
8.4.2 管道和FIFO185
8.5文件係統框架186
8.6Vnode/Vfs架構187
8.6.1目標187
8.6.2 從設備I/O得到的注解187
8.6.3 vnode/vfs接口概覽190
8.7 實現概覽191
8.7.1 目標191
8.7.2 Vnodes以及打開文件191
8.7.3 Vnode192
8.7.4 Vnode引用計數193
8.7.5 Vfs對象194
8.8 文件係統相關對象194
8.8.1 每個文件的私有數據194
8.8.2 vnodeops結構195
8.8.3 vfs層中文件係統相關部分196
8.9 掛載文件係統196
8.9.1 虛擬文件係統轉換錶196
8.9.2 mount函數實現197
8.9.3 VFS_MOUNT過程197
8.10 文件操作197
8.10.1 路徑遍曆198
8.10.2 目錄名查找緩存199
8.10.3 VOP_LOOKUP操作199
8.10.4 打開文件200
8.10.5 文件I/O201
8.10.6 文件屬性201
8.10.7 用戶憑據201
8.11 分析202
8.11.1 SVR4係統實現的缺點202
8.11.2 4.4BSD模型203
8.11.3 OSF/1方法204
8.12 小結205
8.13 練習題205
參考文獻206
第9章 文件係統的實現207
9.1 簡介207
9.2 System V文件係統(s5fs)208
9.2.1 目錄208
9.2.2 inode209
9.2.3 超級塊210
9.3 s5fs內核組織211
9.3.1 內存inode211
9.3.2 inode查找212
9.3.3 文件I/O213
9.3.4 inode的分配和迴收214
9.4 s5fs的分析215
9.5 伯剋利快速文件係統(FFS)216
9.6 硬盤結構216
9.7 磁盤組織216
9.7.1 塊和片段217
9.7.2 分配策略218
9.8 FFS的增強功能219
9.9 分析220
9.10 臨時文件係統221
9.10.1 內存文件係統221
9.10.2 tmpfs文件係統222
9.11 特殊用途文件係統223
9.11.1 specfs文件係統223
9.11.2 /proc文件係統223
9.11.3 處理器文件係統225
9.11.4 Trans lucent文件係統225
9.12 舊的緩衝區緩存226
9.12.1 基本操作227
9.12.2 緩衝區頭結構228
9.12.3 優點228
9.12.4 缺點228
9.12.5 保證文件係統的一緻性229
9.13 小結230
9.14 練習題230
參考文獻231
第10章 分布式文件係統232
10.1 簡介232
10.2 分布式文件係統的一般特徵232
10.3 網絡文件係統233
10.3.1 用戶視角234
10.3.2 設計目標235
10.3.3 NFS的組件235
10.3.4 無狀態設計237
10.4 NFS協議集238
10.4.1 外部數據錶示238
10.4.2 遠程過程調用239
10.5 NFS實現240
10.5.1 控製流240
10.5.2 文件句柄241
10.5.3 掛載操作241
10.5.4 路徑名的查找242
10.6 UNIX語義243
10.6.1 打開文件許可243
10.6.2 已打開文件的刪除243
10.6.3 讀寫操作244
10.7 NFS性能244
10.7.1 性能瓶頸244
10.7.2 客戶端緩存244
10.7.3 延遲寫245
10.7.4 重傳緩存246
10.8 專用NFS服務器247
10.8.1 Auspex的Functional Multiprocessor 架構247
10.8.2 IBM的HA-NFS服務器 248
10.9 NFS安全249
10.9.1 NFS訪問控製249
10.9.2 UID重映射250
10.9.3 根用戶重映射250
10.10 NFS版本3251
10.11 遠程文件共享 252
10.12 RFS架構252
10.12.1 遠程消息協議 253
10.12.2 有狀態操作253
10.13 RFS實現 254
10.13.1 遠程掛載254
10.13.2 RFS客戶端和服務器 255
10.13.3 崩潰恢復255
10.13.4 其他問題256
10.14 客戶端緩存256
10.15 Andrew文件係統258
10.15.1 可伸縮架構258
10.15.2 存儲和命名空間的組織259
10.15.3 會話級語義260
10.16 AFS實現260
10.16.1 緩存與一緻性261
10.16.2 路徑名查找261
10.16.3 安全性262
10.17 AFS的不足262
10.18 DCE的分布式文件係統263
10.18.1 DFS架構263
10.18.2 緩存一緻性264
10.18.3 令牌管理器265
10.18.4 DFS的其他服務266
10.18.5 分析266
10.19 小結267
10.20 練習題267
參考文獻268
第11章 高級文件係統271
11.1 簡介271
11.2 傳統文件係統的局限271
11.2.1 FFS磁盤布局272
11.2.2 磁盤上寫操作的主導273
11.2.3 元數據更新274
11.2.4 故障修復274
11.3 文件係統簇(SUN-FFS)275
11.4 日誌方法276
11.5 日誌結構文件係統277
11.6 4.4BSD日誌結構文件係統277
11.6.1 日誌寫入278
11.6.2 數據檢索279
11.6.3 崩潰恢復279
11.6.4 cleaner進程280
11.6.5 分析280
11.7 元數據日誌281
11.7.1 正常操作282
11.7.2 日誌的一緻性283
11.7.3 崩潰恢復284
11.7.4 分析284
11.8 Episode文件係統285
11.8.1 基本抽象285
11.8.2 結構286
11.8.3 日誌記錄287
11.8.4 其他特性287
11.9 “看門狗”監視器288
11.9.1 目錄的“看門狗”進程289
11.9.2 消息通道289
11.9.3 “看門狗”進程的應用290
11.10 4.4BSD的portal文件係統290
11.11 可堆疊文件係統層次291
11.11.1 框架和接口292
11.11.2 SunSoft 原型293
11.12 4.4BSD文件係統接口294
11.13 小結295
11.14 練習題295
參考文獻296
第12章 內核內存分配298
12.1 簡介298
12.2 功能需求299
12.3 資源映射分配器301
12.4 簡單的冪空閑鏈錶分配器303
12.5 McKusick-Karels分配器305
12.6 夥伴係統307
12.7 SVR4的惰性夥伴算法308
12.7.1 惰性閤並309
12.7.2 SVR4的實現細節310
12.8 Mach和OSF/1的區塊分配器310
12.8.1 垃圾迴收311
12.8.2 分析312
12.9 一種針對多處理器係統的分層式分配器312
12.10 Solaris 2.4的Slab分配器314
12.10.1 復用對象314
12.10.2 利用硬件緩存315
12.10.3 分配器足跡315
12.10.4 設計與接口316
12.10.5 實現細節317
12.10.6 分析318
12.11 小結318
12.12 練習題319
參考文獻320
第13章 虛擬內存321
13.1 簡介321
13.2 按需分頁324
13.2.1 功能需求324
13.2.2 虛擬地址空間325
13.2.3 頁麵的首次訪問326
13.2.4 交換區326
13.2.5 轉換映射327
13.2.6 頁麵替換策略328
13.3 對硬件的需求328
13.3.1 MMU緩存330
13.3.2 Intel 80x86 331
13.3.3 IBM RS/6000 333
13.3.4 MIPS R3000 335
13.4 4.3BSD—案例研究336
13.4.1 物理內存337
13.4.2 地址空間338
13.4.3 頁在哪裏339
13.4.4 交換空間 340
13.5 4.3 BSD 內存管理操作341
13.5.1 創建進程 341
13.5.2 缺頁異常處理 342
13.5.3 空閑頁麵鏈錶 344
13.5.4 交換 345
13.6 分析 346
13.7 練習題347
參考文獻348
第14章 SVR4 VM架構349
14.1 簡介349
14.2 內存映射文件349
14.3 VM的設計理念351
14.4 基礎抽象352
14.4.1 物理內存353
14.4.2 地址空間353
14.4.3 地址映射354
14.4.4 匿名頁355
14.4.5 硬件地址轉換356
14.5 段驅動程序357
14.5.1 seg_vn357
14.5.2 seg_map 358
14.5.3 seg_dev359
14.5.4 seg_kmem359
14.5.5 seg_kp359
14.6 交換層359
14.7 VM操作361
14.7.1 創建新映射361
14.7.2 匿名頁處理361
14.7.3 創建進程363
14.7.4 共享匿名頁364
14.7.5 處理缺頁異常364
14.7.6 共享內存365
14.7.7 其他組件366
14.8 與vnode子係統的交互367
14.8.1 對vnode接口的修改367
14.8.2 統一文件訪問機製368
14.8.3 其他細節370
14.9 Solaris的虛擬交換空間370
14.9.1 交換空間擴展370
14.9.2 虛擬交換管理371
14.9.3 討論372
14.10 分析372
14.11 性能改進374
14.11.1 缺頁異常率偏高的原因374
14.11.2 SVR4對SunOS VM實現的改進375
14.11.3 結果與討論375
14.12 小結376
14.13 練習題376
參考文獻377
第15章 其他內存管理技術378
15.1 簡介378
15.2 Mach的內存管理設計378
15.2.1 設計目標378
15.2.2 對外接口379
15.2.3 基礎抽象380
15.3 內存共享機製381
15.3.1 寫時復製共享382
15.3.2 讀寫共享 383
15.4 內存對象與Pager384
15.4.1 初始化內存對象384
15.4.2 內核與pager的接口384
15.4.3 內核與Pager的交互385
15.5 外部pager和內部pager386
15.6 頁麵替換388
15.7 分析389
15.8 4.4BSD的內存管理390
15.9 旁路轉換緩衝區的一緻性391
15.9.1 單處理器上的TLB一緻性392
15.9.2 多處理器問題393
15.10 Mach中的TLB擊落算法394
15.10.1 同步與死鎖的避免395
15.10.2 討論395
15.11 SVR4和SVR4.2 UNIX中的TLB一緻性396
15.11.1 SVR4/MP396
15.11.2 SVR4.2/MP397
15.11.3 惰性擊落算法397
15.11.4 立即擊落算法398
15.11.5 討論399
15.12 其他TLB一緻性算法399
15.13 虛擬地址緩存400
15.13.1 修改映射401
15.13.2 地址彆名402
15.13.3 DMA操作402
15.13.4 維護緩存一緻性403
15.13.5 分析404
15.14 練習題404
參考文獻405
第16章 設備驅動和I/O407
16.1 簡介407
16.2 概述407
16.2.1 硬件配置408
16.2.2 設備中斷409
16.3 設備驅動程序框架410
16.3.1 設備和驅動的分類410
16.3.2 調用驅動程序代碼411
16.3.3 設備轉換錶412
16.3.4 驅動入口點函數413
16.4 輸入輸齣(I/O)子係統414
16.4.1 主設備號和從設備號415
16.4.2 設備文件416
16.4.3 specfs文件係統417
16.4.4 通用snode結構418
16.4.5 設備剋隆419
16.4.6 針對字符設備的I/O操作420
16.5 poll係統調用420
16.5.1 poll係統調用的實現421
16.5.2 BSD 4.3係統select係統調用422
16.6 塊設備I/O操作423
16.6.1 buf數據結構424
16.6.2 與vnode結構的交互425
16.6.3 設備訪問方法425
16.6.4 塊設備的裸I/O427
16.7 DDI/DKI規範428
16.7.1 一般建議429
16.7.2 Section 3函數429
16.7.3 其他種類接口430
16.8 更新的SVR4發行版431
16.8.1 多處理器安全的驅動431
16.8.2 SVR4.1/ES的變化432
16.8.3 動態加載和卸載432
16.9 未來方嚮434
16.10 小結435
16.11 練習題435
參考文獻436
第17章 STREAMS437
17.1 動機437
17.2 概述438
17.3 消息和隊列439
17.3.1 消息440
17.3.2 虛擬復製440
17.3.3 消息類型441
17.3.4 隊列和模塊442
17.4 流I/O443
17.4.1 STREAMS調度程序444
17.4.2 優先級組445
17.4.3 流量控製445
17.4.4 驅動程序尾部446
17.4.5 流頭447
17.5 配置和設置448
17.5.1 配置一個STREAMS模塊或驅動程序448
17.5.2 打開流449
17.5.3 推送一個模塊到流上451
17.5.4 剋隆設備451
17.6 STREAMS的ioctl命令452
17.6.1 帶有I_STR的ioctl命令處理452
17.6.2 透明的ioctl命令453
17.7 內存分配453
17.8 多路復用455
17.8.1 上部多路復用器455
17.8.2 下部多路復用器456
17.8.3 鏈接流456
17.8.4 數據流458
17.8.5 普通鏈接和持久鏈接458
17.9 FiFO和管道459
17.9.1 FiFO中STREAMS的應用459
17.9.2 使用STREAMS的管道460
17.10 網絡接口461
17.10.1 傳輸提供者接口461
17.10.2 傳輸層接口462
17.10.3 socket463
17.10.4 SVR4的socket實現464
17.11 小結464
17.12 練習題465
參考文獻466
· · · · · · (
收起)