第一部分 概述 3
第1章 导论 3
1.1 操作系统做什么 3
1.1.1 用户视角 4
1.1.2 系统视角 5
1.1.3 定义操作系统 5
1.2 计算机系统组织 6
1.2.1 计算机系统操作 6
1.2.2 存储结构 7
1.2.3 I/O结构 9
1.3 计算机系统体系结构 10
1.3.1 单处理器系统 11
1.3.2 多处理器系统 11
1.3.3 集群系统 13
1.4 操作系统结构 14
1.5 操作系统操作 16
1.5.1 双重模式操作 16
1.5.2 定时器 18
1.6 进程管理 18
1.7 内存管理 19
1.8 存储管理 20
1.8.1 文件系统管理 20
1.8.2 大容量存储器管理 21
1.8.3 高速缓存 21
1.8.4 I/O系统 23
1.9 保护和安全 23
1.10 分布式系统 25
1.11 专用系统 26
1.11.1 实时嵌入式系统 26
1.11.2 多媒体系统 27
1.11.3 手持系统 27
1.12 计算环境 28
1.12.1 传统计算 28
1.12.2 客户机-服务器计算 29
1.12.3 对等计算 29
1.12.4 基于Web的计算 30
1.13 小结 30
习题 32
文献注记 33
第2章 操作系统结构 34
2.1 操作系统服务 34
2.2 操作系统的用户界面 36
2.2.1 命令解释程序 36
2.2.2 图形用户界面 36
2.3 系统调用 37
2.4 系统调用类型 41
2.4.1 进程控制 41
2.4.2 文件管理 45
2.4.3 设备管理 46
2.4.4 信息维护 46
2.4.5 通信 46
2.5 系统程序 47
2.6 操作系统设计和实现 48
2.6.1 设计目标 48
2.6.2 机制与策略 49
2.6.3 实现 49
2.7 操作系统结构 50
2.7.1 简单结构 50
2.7.2 分层方法 52
2.7.3 微内核 53
2.7.4 模块 54
2.8 虚拟机 55
2.8.1 实现 56
2.8.2 优点 57
2.8.3 实例 57
2.9 系统生成 60
2.10 系统启动 61
2.11 小结 62
习题 63
项目:向Linux内核增加一个系统调用 64
文献注记 67
第二部分 进程管理 71
第3章 进程 71
3.1 进程概念 71
3.1.1 进程 71
3.1.2 进程状态 72
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 进程终止 84
3.4 进程间通信 84
3.4.1 共享内存系统 86
3.4.2 消息传递系统 87
3.5 IPC系统的实例 90
3.5.1 实例:POSIX共享内存 90
3.5.2 实例:Mach 91
3.5.3 实例:Windows XP 94
3.6 客户机-服务器系统通信 95
3.6.1 Socket 95
3.6.2 远程过程调用 98
3.6.3 远程方法调用 101
3.7 小结 102
习题 103
项目:UNIX Shell和历史特点 106
文献注记 110
第4章 线程 111
4.1 概述 111
4.1.1 动机 112
4.1.2 优点 112
4.2 多线程模型 113
4.2.1 多对一模型 113
4.2.2 一对一模型 114
4.2.3 多对多模型 114
4.3 线程库 115
4.3.1 Pthread 116
4.3.2 Win32线程 117
4.3.3 Java线程 119
4.4 多线程问题 121
4.4.1 系统调用fork()和exec() 121
4.4.2 取消 122
4.4.3 信号处理 122
4.4.4 线程池 123
4.4.5 线程特定数据 125
4.4.6 调度程序激活 125
4.5 操作系统实例 126
4.5.1 Windows XP线程 126
4.5.2 Linux线程 127
4.6 小结 128
习题 129
项目:矩阵乘法 130
文献注记 133
第5章 CPU调度 134
5.1 基本概念 134
5.1.1 CPU-I/O区间周期 134
5.1.2 CPU调度程序 135
5.1.3 抢占调度 135
5.1.4 分派程序 136
5.2 调度准则 137
5.3 调度算法 138
5.3.1 先到先服务调度 138
5.3.2 最短作业优先调度 139
5.3.3 优先级调度 141
5.3.4 轮转法调度 142
5.3.5 多级队列调度 145
5.3.6 多级反馈队列调度 146
5.4 多处理器调度 147
5.4.1 多处理器调度的方法 148
5.4.2 处理器亲和性 148
5.4.3 负载平衡 148
5.4.4 对称多线程 149
5.5 线程调度 150
5.5.1 竞争范围 150
5.5.2 Pthread调度 150
5.6 操作系统实例 152
5.6.1 实例:Solaris调度 152
5.6.2 实例:Windows XP调度 154
5.6.3 实例:Linux调度 156
5.7 算法评估 158
5.7.1 确定模型 158
5.7.2 排队模型 160
5.7.3 模拟 160
5.7.4 实现 161
5.8 小结 162
习题 163
文献注记 165
第6章 进程同步 166
6.1 背景 166
6.2 临界区问题 168
6.3 Peterson算法 169
6.4 硬件同步 170
6.5 信号量 173
6.5.1 用法 173
6.5.2 实现 174
6.5.3 死锁与饥饿 176
6.6 经典同步问题 176
6.6.1 有限缓冲问题 177
6.6.2 读者-写者问题 177
6.6.3 哲学家进餐问题 179
6.7 管程 180
6.7.1 使用 181
6.7.2 哲学家进餐问题的管程解决方案 183
6.7.3 基于信号量的管程实现 183
6.7.4 管程内的进程重启 185
6.8 同步实例 187
6.8.1 Solaris同步 187
6.8.2 Windows XP同步 189
6.8.3 Linux同步 190
6.8.4 Pthread同步 191
6.9 原子事务 191
6.9.1 系统模型 192
6.9.2 基于日志的恢复 192
6.9.3 检查点 193
6.9.4 并发原子操作 194
6.10 小结 198
习题 198
项目:生产者-消费者问题 202
文献注记 207
第7章 死锁 209
7.1 系统模型 209
7.2 死锁特征 210
7.2.1 必要条件 211
7.2.2 资源分配图 212
7.3 死锁处理方法 214
7.4 死锁预防 215
7.4.1 互斥 216
7.4.2 占有并等待 216
7.4.3 非抢占 216
7.4.4 循环等待 217
7.5 死锁避免 218
7.5.1 安全状态 218
7.5.2 资源分配图算法 220
7.5.3 银行家算法 220
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
习题 229
文献注记 231
第三部分 内存管理 235
第8章 内存管理 235
8.1 背景 235
8.1.1 基本硬件 235
8.1.2 地址绑定 237
8.1.3 逻辑地址空间与物理地址空间 239
8.1.4 动态加载 240
8.1.5 动态链接与共享库 240
8.2 交换 241
8.3 连续内存分配 243
8.3.1 内存映射与保护 243
8.3.2 内存分配 244
8.3.3 碎片 245
8.4 分页 246
8.4.1 基本方法 246
8.4.2 硬件支持 250
8.4.3 保护 252
8.4.4 共享页 254
8.5 页表结构 255
8.5.1 层次页表 255
8.5.2 哈希页表 257
8.5.3 反向页表 258
8.6 分段 260
8.6.1 基本方法 260
8.6.2 硬件 261
8.7 实例:Intel Pentium 263
8.7.1 Pentium分段 263
8.7.2 Pentium分页 264
8.7.3 Pentium系统上的Linux 264
8.8 小结 266
习题 267
文献注记 269
第9章 虚拟内存 270
9.1 背景 270
9.2 按需调页 272
9.2.1 基本概念 273
9.2.2 按需调页的性能 276
9.3 写时复制 278
9.4 页面置换 280
9.4.1 基本页置换 281
9.4.2 FIFO页置换 284
9.4.3 最优置换 285
9.4.4 LRU页置换 286
9.4.5 近似LRU页置换 287
9.4.6 基于计数的页置换 289
9.4.7 页缓冲算法 290
9.4.8 应用程序与页置换 290
9.5 帧分配 291
9.5.1 帧的最少数量 291
9.5.2 分配算法 292
9.5.3 全局分配与局部分配 293
9.6 系统颠簸 293
9.6.1 系统颠簸的原因 294
9.6.2 工作集合模型 296
9.6.3 页错误频率 297
9.7 内存映射文件 298
9.7.1 基本机制 299
9.7.2 Win32 API中的共享内存 300
9.7.3 内存映射I/O 303
9.8 内核内存的分配 303
9.8.1 Buddy系统 303
9.8.2 slab分配 304
9.9 其他考虑 306
9.9.1 预调页 306
9.9.2 页大小 306
9.9.3 TLB范围 308
9.9.4 反向页表 308
9.9.5 程序结构 309
9.9.6 I/O互锁 310
9.10 操作系统实例 311
9.10.1 Windows XP 311
9.10.2 Solaris 312
9.11 小结 313
习题 314
文献注记 317
第四部分 存储管理 321
第10章 文件系统接口 321
10.1 文件概念 321
10.1.1 文件属性 322
10.1.2 文件操作 322
10.1.3 文件类型 326
10.1.4 文件结构 327
10.1.5 内部文件结构 328
10.2 访问方法 329
10.2.1 顺序访问 329
10.2.2 直接访问 329
10.2.3 其他访问方式 330
10.3 目录结构 331
10.3.1 存储结构 332
10.3.2 目录概述 332
10.3.3 单层结构目录 333
10.3.4 双层结构目录 333
10.3.5 树状结构目录 335
10.3.6 无环图目录 337
10.3.7 通用图目录 339
10.4 文件系统安装 340
10.5 文件共享 342
10.5.1 多用户 342
10.5.2 远程文件系统 342
10.5.3 一致性语义 345
10.6 保护 346
10.6.1 访问类型 346
10.6.2 访问控制 347
10.6.3 其他保护方式 349
10.7 小结 350
习题 351
文献注记 352
第11章 文件系统实现 353
11.1 文件系统结构 353
11.2 文件系统实现 355
11.2.1 概述 355
11.2.2 分区与安装 357
11.2.3 虚拟文件系统 358
11.3 目录实现 360
11.3.1 线性列表 360
11.3.2 哈希表 361
11.4 分配方法 361
11.4.1 连续分配 361
11.4.2 链接分配 363
11.4.3 索引分配 366
11.4.4 性能 368
11.5 空闲空间管理 369
11.5.1 位向量 369
11.5.2 链表 370
11.5.3 组 370
11.5.4 计数 371
11.6 效率与性能 371
11.6.1 效率 371
11.6.2 性能 372
11.7 恢复 374
11.7.1 一致性检查 374
11.7.2 备份和恢复 375
11.8 基于日志结构的文件系统 376
11.9 NFS 377
11.9.1 概述 377
11.9.2 安装协议 379
11.9.3 NFS协议 379
11.9.4 路径名转换 380
11.9.5 远程操作 381
11.10 实例:WAFL文件系统 382
11.11 小结 384
习题 384
文献注记 385
第12章 大容量存储器的结构 387
12.1 大容量存储器结构简介 387
12.1.1 磁盘 387
12.1.2 磁带 389
12.2 磁盘结构 389
12.3 磁盘附属 390
12.3.1 主机附属存储 390
12.3.2 网络附属存储 391
12.3.3 存储区域网络 391
12.4 磁盘调度 392
12.4.1 FCFS调度 393
12.4.2 SSTF调度 393
12.4.3 SCAN调度 394
12.4.4 C-SCAN调度 395
12.4.5 LOOK调度 396
12.4.6 磁盘调度算法的选择 396
12.5 磁盘管理 397
12.5.1 磁盘格式化 397
12.5.2 引导块 398
12.5.3 坏块 400
12.6 交换空间管理 401
12.6.1 交换空间的使用 401
12.6.2 交换空间位置 401
12.6.3 实例:交换空间管理 402
12.7 RAID结构 403
12.7.1 通过冗余改善可靠性 403
12.7.2 通过并行处理改善性能 404
12.7.3 RAID级别 405
12.7.4 RAID级别的选择 409
12.7.5 扩展 409
12.7.6 RAID的问题 410
12.8 稳定存储实现 410
12.9 三级存储结构 411
12.9.1 三级存储设备 411
12.9.2 操作系统支持 413
12.9.3 性能 416
12.10 小结 419
习题 421
文献注记 423
第13章 I/O输入系统 425
13.1 概述 425
13.2 I/O硬件 426
13.2.1 轮询 428
13.2.2 中断 429
13.2.3 直接内存访问 432
13.2.4 I/O硬件小结 434
13.3 I/O应用接口 434
13.3.1 块与字符设备 436
13.3.2 网络设备 437
13.3.3 时钟与定时器 437
13.3.4 阻塞与非阻塞I/O 438
13.4 I/O内核子系统 439
13.4.1 I/O调度 439
13.4.2 缓冲 440
13.4.3 高速缓存 442
13.4.4 假脱机与设备预留 442
13.4.5 错误处理 443
13.4.6 I/O保护 443
13.4.7 内核数据结构 444
13.4.8 内核I/O子系统小结 445
13.5 把I/O操作转换成硬件操作 445
13.6 流 448
13.7 性能 449
13.8 小结 452
习题 453
文献注记 453
第五部分 保护与安全 457
第14章 保护 457
14.1 保护目标 457
14.2 保护原则 458
14.3 保护域 459
14.3.1 域结构 459
14.3.2 实例:UNIX 461
14.3.3 实例:MULTICS 462
14.4 访问矩阵 463
14.5 访问矩阵的实现 467
14.5.1 全局表 467
14.5.2 对象的访问列表 467
14.5.3 域的权限列表 467
14.5.4 锁-钥匙机制 468
14.5.5 比较 468
14.6 访问控制 469
14.7 访问权限的撤回 470
14.8 面向权限的系统 472
14.8.1 实例:Hydra 472
14.8.2 实例:剑桥CAP系统 473
14.9 基于语言的保护 474
14.9.1 基于编译程序的强制 474
14.9.2 Java的保护 476
14.10 小结 478
习题 479
文献注记 480
第15章 安全 481
15.1 安全问题 481
15.2 程序威胁 484
15.2.1 特洛伊木马 484
15.2.2 后门 485
15.2.3 逻辑炸弹 486
15.2.4 栈和缓冲区溢出 486
15.2.5 病毒 489
15.3 系统和网络威胁 492
15.3.1 蠕虫 492
15.3.2 端口扫描 495
15.3.3 拒绝服务 495
15.4 作为安全工具的密码术 496
15.4.1 加密 497
15.4.2 密码术的实现 503
15.4.3 实例:SSL 504
15.5 用户验证 506
15.5.1 密码 506
15.5.2 密码脆弱的一面 506
15.5.3 密码加密 508
15.5.4 一次性密码 508
15.5.5 生物测定学 509
15.6 实现安全防御 510
15.6.1 安全策略 510
15.6.2 脆弱性评估 510
15.6.3 入侵检测 512
15.6.4 病毒防护 514
15.6.5 审计、会计和日志 516
15.7 保护系统和网络的防火墙 516
15.8 计算机安全分类 518
15.9 实例:Windows XP 519
15.10 小结 521
习题 521
文献注记 522
第六部分 分布式系统 527
第16章 分布式系统结构 527
16.1 动机 527
16.1.1 资源共享 527
16.1.2 加快计算速度 528
16.1.3 可靠性 528
16.1.4 通信 529
16.2 分布式操作系统的类型 529
16.2.1 网络操作系统 529
16.2.2 分布式操作系统 531
16.3 网络结构 533
16.3.1 局域网 533
16.3.2 广域网 534
16.4 网络拓扑结构 535
16.5 通信结构 537
16.5.1 命名和名字解析 537
16.5.2 路由策略 539
16.5.3 包策略 540
16.5.4 连接策略 541
16.5.5 竞争 541
16.6 通信协议 542
16.7 健壮性 545
16.7.1 故障检测 545
16.7.2 重构 545
16.7.3 故障恢复 546
16.8 设计事项 546
16.9 实例:连网 548
16.10 小结 550
习题 550
文献注记 551
第17章 分布式文件系统 552
17.1 背景 552
17.2 命名和透明性 553
17.2.1 命名结构 554
17.2.2 命名方案 555
17.2.3 实现技术 556
17.3 远程文件访问 556
17.3.1 基本的缓存设计 557
17.3.2 缓存位置 557
17.3.3 缓存更新策略 558
17.3.4 一致性 559
17.3.5 高速缓存和远程服务的比较 560
17.4 有状态服务和无状态服务 561
17.5 文件复制 563
17.6 实例:AFS 563
17.6.1 概述 564
17.6.2 共享名称空间 565
17.6.3 文件操作和一致性语义 566
17.6.4 实现 567
17.7 小结 568
习题 569
文献注记 569
第18章 分布式协调 571
18.1 事件排序 571
18.1.1 事前关系 571
18.1.2 实现 572
18.2 互斥 573
18.2.1 集中式算法 573
18.2.2 完全分布式的算法 574
18.2.3 令牌传递算法 575
18.3 原子性 575
18.3.1 两阶段提交协议 576
18.3.2 2PC中的错误处理 577
18.4 并发控制 578
18.4.1 加锁协议 578
18.4.2 时间戳 580
18.5 死锁处理 582
18.5.1 死锁预防和避免 582
18.5.2 死锁检测 583
18.6 选举算法 587
18.6.1 Bully算法 588
18.6.2 环算法 589
18.7 达成一致 590
18.7.1 不可靠通信 590
18.7.2 出错进程 591
18.8 小结 591
习题 592
文献注记 593
第七部分 特殊用途系统 597
第19章 实时系统 597
19.1 概述 597
19.2 系统特性 598
19.3 实时内核特性 599
19.4 实现实时操作系统 601
19.4.1 基于优先级的调度 602
19.4.2 抢占式内核 602
19.4.3 最小化延迟 602
19.5 实时CPU调度 605
19.5.1 单调速率调度 605
19.5.2 最早截止期限优先调度算法 607
19.5.3 按比例分享调度 608
19.5.4 Pthread调度 608
19.6 VxWorks 5.x 610
19.7 小结 612
习题 613
文献注记 613
第20章 多媒体系统 614
20.1 什么是多媒体 614
20.1.1 媒体传送 614
20.1.2 多媒体系统的特点 616
20.1.3 操作系统问题 616
20.2 压缩 616
20.3 多媒体内核的要求 618
20.4 CPU调度 620
20.5 磁盘调度 620
20.5.1 最早期限优先调度 621
20.5.2 SCAN-EDF调度 621
20.6 网络管理 622
20.6.1 单播和多播 623
20.6.2 实时流协议 623
20.7 实例:CineBlitz 626
20.7.1 磁盘调度 626
20.7.2 接纳控制 626
20.8 小结 628
习题 628
文献注记 629
第八部分 案例研究 633
第21章 Linux系统 633
21.1 Linux发展历程 633
21.1.1 Linux内核 634
21.1.2 Linux系统 636
21.1.3 Linux发行版 636
21.1.4 Linux许可 637
21.2 设计原则 637
21.3 内核模块 640
21.3.1 模块管理 640
21.3.2 驱动程序注册 641
21.3.3 冲突解决 642
21.4 进程管理 642
21.4.1 fork()和exec()进程模式 642
21.4.2 进程与线程 644
21.5 调度 645
21.5.1 进程调度 645
21.5.2 内核同步 647
21.5.3 对称多处理技术 649
21.6 内存管理 650
21.6.1 物理内存管理 650
21.6.2 虚拟内存 653
21.6.3 执行与装入用户程序 655
21.7 文件系统 657
21.7.1 虚拟文件系统 658
21.7.2 Linux ext2fs文件系统 659
21.7.3 日志 661
21.7.4 Linux进程文件系统 662
21.8 输入与输出 663
21.8.1 块设备 664
21.8.2 字符设备 665
21.9 进程间通信 665
21.9.1 同步与信号 665
21.9.2 进程间数据传输 666
21.10 网络结构 666
21.11 安全 668
21.11.1 认证 669
21.11.2 访问控制 669
21.12 小结 670
习题 671
文献注记 672
第22章 Windows XP 673
22.1 历史 673
22.2 设计原则 674
22.2.1 安全性 675
22.2.2 可靠性 675
22.2.3 Windows和POSIX应用程序的兼容性 675
22.2.4 高性能 676
22.2.5 可扩展性 676
22.2.6 可移植性 676
22.2.7 国际支持 677
22.3 系统组件 677
22.3.1 硬件抽象层 677
22.3.2 内核 678
22.3.3 执行体 682
22.4 环境子系统 697
22.4.1 MS-DOS环境 698
22.4.2 16位Windows环境 699
22.4.3 IA64上的32位Windows环境 699
22.4.4 Win32环境 699
22.4.5 POSIX子系统 700
22.4.6 登录与安全子系统 700
22.5 文件系统 701
22.5.1 NTFS内部布局 701
22.5.2 恢复 703
22.5.3 安全 704
22.5.4 卷管理和容错 704
22.5.5 压缩与加密 707
22.5.6 安装点 708
22.5.7 变更日志 708
22.5.8 卷影子副本 708
22.6 网络 708
22.6.1 网络接口 709
22.6.2 协议 709
22.6.3 分布式处理机制 710
22.6.4 重定向器与服务器 712
22.6.5 域 713
22.6.6 活动目录 714
22.6.7 TCP/IP网络的名称解析 714
22.7 程序接口 715
22.7.1 访问内核对象 715
22.7.2 进程间共享对象 715
22.7.3 进程管理 717
22.7.4 进程间通信 719
22.7.5 内存管理 720
22.8 小结 722
习题 722
文献注记 723
第23章 有影响的操作系统 724
23.1 早期系统 724
23.1.1 专用计算机系统 724
23.1.2 共享计算机系统 725
23.1.3 I/O叠加 728
23.2 Atlas 730
23.3 XDS-940 731
23.4 THE 731
23.5 RC4000 732
23.6 CTSS 733
23.7 MULTICS 733
23.8 IBM OS/360 734
23.9 Mach 735
23.10 其他系统 737
习题 737
参考文献 738
原版相关内容引用表 763
英汉名词对照表 764