第一部分 概述 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 计算机系统体系结构 11
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 保护和安全 24
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章 操作系统结构 35
2.1 操作系统服务 35
2.2 操作系统的用户界面 37
2.2.1 命令解释程序 37
2.2.2 图形用户界面 37
2.2.3 界面选择 38
2.3 系统调用 38
2.4 系统调用类型 42
2.4.1 进程控制 42
2.4.2 文件管理 46
2.4.3 设备管理 47
2.4.4 信息维护 47
2.4.5 通信 48
2.5 系统程序 48
2.6 操作系统设计和实现 49
2.6.1 设计目标 49
2.6.2 机制与策略 50
2.6.3 实现 50
2.7 操作系统结构 51
2.7.1 简单结构 51
2.7.2 分层法 52
2.7.3 微内核 54
2.7.4 模块 55
2.8 虚拟机 56
2.8.1 实现 58
2.8.2 优点 58
2.8.3 实例:VMware 59
2.9 Java 60
2.9.1 Java编程语言 60
2.9.2 Java API 60
2.9.3 Java虚拟机 60
2.9.4 Java开发环境 61
2.9.5 Java操作系统 62
2.10 操作系统生成 64
2.11 系统启动 65
2.12 小结 66
习题 67
项目:向Linux内核增加一个系统调用 68
文献注记 71
第二部分 进程管理 75
第3章 进程 75
3.1 进程概念 75
3.1.1 进程 75
3.1.2 进程状态 76
3.1.3 进程控制块 77
3.1.4 线程 77
3.2 进程调度 78
3.2.1 调度队列 78
3.2.2 调度程序 81
3.2.3 上下文切换 82
3.3 进程操作 83
3.3.1 进程创建 83
3.3.2 进程终止 87
3.4 进程间通信 89
3.4.1 共享内存系统 90
3.4.2 消息传递系统 93
3.5 IPC系统的实例 97
3.5.1 Mach 97
3.5.2 Windows XP 99
3.6 客户机-服务器通信 100
3.6.1 套接字 100
3.6.2 远程过程调用 103
3.6.3 远程方法调用 106
3.7 小结 110
习题 111
项目:创建一个shell接口 113
文献注记 115
第4章 线程 117
4.1 概述 117
4.1.1 动机 117
4.1.2 优点 118
4.2 多线程模型 119
4.2.1 多对一模型 119
4.2.2 一对一模型 120
4.2.3 多对多模型 120
4.3 线程库 121
4.3.1 Pthread 122
4.3.2 Win32线程 123
4.4 Java线程 125
4.4.1 Java线程状态 127
4.4.2 JVM和宿主操作系统 128
4.4.3 生产者-消费者问题的多线程解决方案 128
4.5 多线程问题 130
4.5.1 系统调用fork()和exec() 130
4.5.2 取消 131
4.5.3 信号处理 132
4.5.4 线程池 134
4.5.5 线程特定数据 136
4.5.6 调度程序激活 137
4.6 操作系统实例 138
4.6.1 Windows XP线程 138
4.6.2 Linux线程 140
4.7 小结 140
习题 141
项目:矩阵乘法 143
文献注记 146
第5章 CPU调度 147
5.1 基本概念 147
5.1.1 CPU-I/O区间周期 147
5.1.2 CPU调度程序 148
5.1.3 抢占调度 148
5.1.4 分派程序 149
5.2 调度准则 150
5.3 调度算法 151
5.3.1 先到先服务调度 151
5.3.2 最短作业优先调度 152
5.3.3 优先级调度 154
5.3.4 轮转调度 155
5.3.5 多级队列调度 158
5.3.6 多级反馈队列调度 159
5.4 多处理器调度 161
5.4.1 多处理器调度的方法 161
5.4.2 处理器亲和性 161
5.4.3 负载平衡 162
5.4.4 对称多线程 162
5.5 线程调度 163
5.5.1 竞争范围 163
5.5.2 Pthread调度 164
5.6 操作系统实例 166
5.6.1 Solaris调度 166
5.6.2 Windows XP调度 168
5.6.3 Linux调度 170
5.7 Java调度 171
5.7.1 线程优先级 172
5.7.2 Solaris上的Java线程调度 174
5.8 算法评估 175
5.8.1 确定性建模 175
5.8.2 排队模型 177
5.8.3 模拟 177
5.8.4 实现 178
5.9 小结 179
习题 180
文献注记 182
第6章 进程同步 183
6.1 背景 183
6.2 临界区问题 185
6.3 Peterson算法 186
6.4 硬件同步 187
6.5 信号量 190
6.5.1 用法 190
6.5.2 实现 192
6.5.3 死锁与饥饿 194
6.6 经典同步问题 194
6.6.1 有限缓冲问题 194
6.6.2 读者-写者问题 197
6.6.3 哲学家进餐问题 202
6.7 管程 203
6.7.1 使用 204
6.7.2 哲学家就餐问题的管程解决方案 206
6.8 Java同步 208
6.8.1 有限缓冲区 208
6.8.2 多重通知 213
6.8.3 读者-写者问题 214
6.8.4 块同步 216
6.8.5 同步规则 217
6.8.6 处理InterruptedException 218
6.8.7 Java并发特性 218
6.9 同步实例 221
6.9.1 Solaris同步 222
6.9.2 Windows XP同步 223
6.9.3 Linux同步 224
6.9.4 Pthread同步 224
6.10 原子事务 225
6.10.1 系统模型 225
6.10.2 基于日志的恢复 226
6.10.3 检查点 227
6.10.4 并发原子操作 227
6.11 小结 231
习题 232
文献注记 238
第7章 死锁 240
7.1 系统模型 240
7.2 死锁特征 242
7.2.1 必要条件 242
7.2.2 资源分配图 242
7.3 死锁处理方法 246
7.3.1 三种主要方法 246
7.3.2 Java中的死锁处理 247
7.4 死锁预防 250
7.4.1 互斥 250
7.4.2 占有并等待 250
7.4.3 非抢占 251
7.4.4 循环等待 251
7.5 死锁避免 252
7.5.1 安全状态 253
7.5.2 资源分配图算法 254
7.5.3 银行家算法 255
7.6 死锁检测 258
7.6.1 每种资源类型只有单个实例 258
7.6.2 每种资源类型可有多个实例 259
7.6.3 应用检测算法 260
7.7 死锁恢复 261
7.7.1 进程终止 261
7.7.2 资源抢占 262
7.8 小结 262
习题 263
项目:银行家算法 265
文献注记 267
第三部分 内存管理 271
第8章 内存管理 271
8.1 背景 271
8.1.1 基本硬件 271
8.1.2 地址绑定 273
8.1.3 逻辑地址空间与物理地址空间 275
8.1.4 动态加载 276
8.1.5 动态链接与共享库 276
8.2 交换 277
8.3 连续内存分配 279
8.3.1 内存映射与保护 279
8.3.2 内存分配 280
8.3.3 碎片 281
8.4 分页 282
8.4.1 基本方法 283
8.4.2 硬件支持 287
8.4.3 保护 289
8.4.4 共享页 290
8.5 页表结构 291
8.5.1 层次页表 292
8.5.2 哈希页表 294
8.5.3 反向页表 295
8.6 分段 296
8.6.1 基本方法 296
8.6.2 硬件 298
8.7 实例:Intel Pentium 299
8.7.1 Pentium分段 300
8.7.2 Pentium分页 300
8.7.3 Pentium系统上的Linux 302
8.8 小结 303
习题 304
文献注记 305
第9章 虚拟内存 307
9.1 背景 307
9.2 按需调页 310
9.2.1 基本概念 310
9.2.2 按需调页的性能 314
9.3 写时复制 316
9.4 页面置换 317
9.4.1 基本页置换 318
9.4.2 FIFO页置换 321
9.4.3 最优置换 322
9.4.4 LRU页置换 323
9.4.5 近似LRU页置换 325
9.4.6 基于计数的页置换 327
9.4.7 页缓冲算法 327
9.4.8 应用程序与页置换 328
9.5 帧分配 328
9.5.1 帧的最少数量 328
9.5.2 分配算法 329
9.5.3 全局分配与局部分配 330
9.6 系统颠簸 331
9.6.1 系统颠簸的原因 331
9.6.2 工作集合模型 334
9.6.3 页错误频率 335
9.7 内存映射文件 336
9.7.1 基本机制 336
9.7.2 Java中的内存映射文件 338
9.7.3 内存映射I/O 339
9.8 内核内存的分配 340
9.8.1 Buddy系统 340
9.8.2 slab分配 341
9.9 其他考虑 343
9.9.1 预调页 343
9.9.2 页大小 343
9.9.3 TLB范围 344
9.9.4 反向页表 345
9.9.5 程序结构 345
9.9.6 I/O互锁 346
9.10 操作系统实例 348
9.10.1 Windows XP 348
9.10.2 Solaris 349
9.11 小结 350
习题 351
文献注记 354
第四部分 存储管理 357
第10章 文件系统接口 357
10.1 文件概念 357
10.1.1 文件属性 358
10.1.2 文件操作 358
10.1.3 打开与关闭文件 359
10.1.4 文件类型 360
10.1.5 文件结构 362
10.1.6 内部文件结构 363
10.1.7 文件加锁 363
10.2 访问方法 365
10.2.1 顺序访问 365
10.2.2 直接访问 365
10.2.3 其他访问方式 366
10.3 目录结构 367
10.3.1 存储结构 368
10.3.2 目录概述 368
10.3.3 单层结构目录 369
10.3.4 双层结构目录 369
10.3.5 树状结构目录 371
10.3.6 无环图目录 373
10.3.7 通用图目录 375
10.4 文件系统安装 376
10.5 文件共享 378
10.5.1 多用户 378
10.5.2 远程文件系统 379
10.5.3 一致性语义 382
10.6 保护 383
10.6.1 访问类型 383
10.6.2 访问控制 384
10.6.3 其他保护方式 386
10.7 小结 387
习题 388
文献注记 388
第11章 文件系统实现 390
11.1 文件系统结构 390
11.2 文件系统实现 392
11.2.1 概述 392
11.2.2 分区与安装 394
11.2.3 虚拟文件系统 395
11.3 目录实现 397
11.3.1 线性列表 397
11.3.2 哈希表 397
11.4 分配方法 398
11.4.1 连续分配 398
11.4.2 链接分配 400
11.4.3 索引分配 402
11.4.4 性能 405
11.5 空闲空间管理 406
11.5.1 位向量 406
11.5.2 链表 407
11.5.3 组 407
11.5.4 计数 408
11.6 效率与性能 408
11.6.1 效率 408
11.6.2 性能 409
11.7 恢复 411
11.7.1 一致性检查 411
11.7.2 备份和恢复 412
11.8 基于日志结构的文件系统 412
11.9 NFS 414
11.9.1 概述 414
11.9.2 安装协议 416
11.9.3 NFS协议 416
11.9.4 路径名转换 417
11.9.5 远程操作 418
11.10 实例:WAFL文件系统 419
11.11 小结 421
习题 421
项目:设计一个文件系统 422
文献注记 428
第12章 大容量存储器的结构 429
12.1 大容量存储器结构简介 429
12.1.1 磁盘 429
12.1.2 磁带 431
12.2 磁盘结构 431
12.3 磁盘附属 432
12.3.1 主机附属存储 432
12.3.2 网络附属存储 433
12.3.3 存储区域网络 433
12.4 磁盘调度 434
12.4.1 FCFS调度 435
12.4.2 SSTF调度 435
12.4.3 SCAN调度 436
12.4.4 C-SCAN调度 437
12.4.5 LOOK调度 437
12.4.6 磁盘调度算法的选择 438
12.5 磁盘管理 439
12.5.1 磁盘格式化 440
12.5.2 引导块 441
12.5.3 坏块 442
12.6 交换空间管理 443
12.6.1 交换空间的使用 443
12.6.2 交换空间位置 443
12.6.3 实例:交换空间管理 444
12.7 RAID结构 445
12.7.1 通过冗余改善可靠性 445
12.7.2 通过并行处理改善性能 446
12.7.3 RAID级别 447
12.7.4 RAID级别的选择 451
12.7.5 扩展 451
12.7.6 RAID的问题 452
12.8 稳定存储实现 452
12.9 第三级存储结构 453
12.9.1 第三级存储设备 454
12.9.2 操作系统支持 456
12.9.3 性能 458
12.10 小结 462
习题 463
文献注记 466
第13章 I/O输入系统 468
13.1 概述 468
13.2 I/O硬件 469
13.2.1 轮询 471
13.2.2 中断 472
13.2.3 直接内存访问 475
13.2.4 I/O硬件小结 476
13.3 I/O应用接口 477
13.3.1 块与字符设备 479
13.3.2 网络设备 480
13.3.3 时钟与定时器 480
13.3.4 阻塞与非阻塞I/O 481
13.4 I/O内核子系统 482
13.4.1 I/O调度 482
13.4.2 缓冲 483
13.4.3 高速缓存 484
13.4.4 假脱机与设备预留 485
13.4.5 错误处理 485
13.4.6 I/O保护 486
13.4.7 内核数据结构 487
13.4.8 内核I/O子系统小结 488
13.5 把I/O操作转换成硬件操作 488
13.6 流 490
13.7 性能 492
13.8 小结 494
习题 495
文献注记 496
第五部分 保护与安全 499
第14章 保护 499
14.1 保护目标 499
14.2 保护原则 500
14.3 保护域 501
14.3.1 域结构 501
14.3.2 实例:UNIX 503
14.3.3 实例:MULTICS 504
14.4 访问矩阵 505
14.5 访问矩阵的实现 509
14.5.1 全局表 509
14.5.2 对象的访问列表 509
14.5.3 域的权限列表 509
14.5.4 锁-钥匙机制 510
14.5.5 比较 510
14.6 访问控制 511
14.7 访问权限的撤回 512
14.8 面向权限的系统 514
14.8.1 实例:Hydra 514
14.8.2 实例:剑桥CAP系统 515
14.9 基于语言的保护 516
14.9.1 基于编译程序的强制 516
14.9.2 Java的保护 518
14.10 小结 521
习题 521
文献注记 522
第15章 安全 523
15.1 安全问题 523
15.2 程序威胁 526
15.2.1 特洛伊木马 526
15.2.2 后门 527
15.2.3 逻辑炸弹 528
15.2.4 栈和缓冲区溢出 528
15.2.5 病毒 531
15.3 系统和网络威胁 534
15.3.1 蠕虫 534
15.3.2 端口扫描 537
15.3.3 拒绝服务 538
15.4 作为安全工具的密码术 539
15.4.1 加密 540
15.4.2 密码术的实现 545
15.4.3 实例:SSL 547
15.5 用户验证 549
15.5.1 密码 549
15.5.2 密码脆弱的一面 549
15.5.3 密码加密 551
15.5.4 一次性密码 551
15.5.5 生物测定学 552
15.6 实现安全防御 553
15.6.1 安全策略 553
15.6.2 脆弱性评估 553
15.6.3 入侵检测 555
15.6.4 病毒防护 557
15.6.5 审计、会计和日志 559
15.7 保护系统和网络的防火墙 559
15.8 计算机安全分类 561
15.9 实例:Windows XP 562
15.10 小结 564
习题 565
文献注记 565
第六部分 分布式系统 571
第16章 分布式系统结构 571
16.1 动机 571
16.1.1 资源共享 571
16.1.2 加快计算速度 572
16.1.3 可靠性 572
16.1.4 通信 573
16.2 分布式操作系统的类型 573
16.2.1 网络操作系统 573
16.2.2 分布式操作系统 575
16.3 网络结构 577
16.3.1 局域网 577
16.3.2 广域网 578
16.4 网络拓扑结构 579
16.5 通信结构 581
16.5.1 命名和名字解析 581
16.5.2 路由策略 583
16.5.3 包策略 584
16.5.4 连接策略 585
16.5.5 竞争 585
16.6 通信协议 586
16.7 稳健性 589
16.7.1 故障检测 589
16.7.2 重构 590
16.7.3 故障恢复 590
16.8 设计事项 590
16.9 实例:连网 592
16.10 小结 594
习题 594
项目:设计一个Web服务器 595
文献注记 599
第17章 分布式文件系统 601
17.1 背景 601
17.2 命名和透明性 602
17.2.1 命名结构 603
17.2.2 命名方案 604
17.2.3 实现技术 605
17.3 远程文件访问 605
17.3.1 基本的缓存设计 606
17.3.2 缓存位置 606
17.3.3 缓存更新策略 607
17.3.4 一致性 608
17.3.5 高速缓存和远程服务的比较 609
17.4 有状态服务和无状态服务 610
17.5 文件复制 612
17.6 实例:AFS 612
17.6.1 概述 613
17.6.2 共享名称空间 614
17.6.3 文件操作和一致性语义 615
17.6.4 实现 616
17.7 小结 617
习题 618
文献注记 618
第18章 分布式协调 619
18.1 事件排序 619
18.1.1 事前关系 619
18.1.2 实现 620
18.2 互斥 621
18.2.1 集中式算法 621
18.2.2 完全分布式的算法 622
18.2.3 令牌传递算法 623
18.3 原子性 624
18.3.1 两阶段提交协议 624
18.3.2 2PC中的错误处理 625
18.4 并发控制 626
18.4.1 加锁协议 627
18.4.2 时间戳 629
18.5 死锁处理 630
18.5.1 死锁预防和避免 630
18.5.2 死锁检测 631
18.6 选举算法 636
18.6.1 Bully算法 636
18.6.2 环算法 637
18.7 达成一致 638
18.7.1 不可靠通信 638
18.7.2 出错进程 639
18.8 小结 640
习题 640
文献注记 641
第七部分 特殊用途系统 645
第19章 实时系统 645
19.1 概述 645
19.2 系统特性 646
19.3 实时内核特性 647
19.4 实现实时操作系统 649
19.4.1 基于优先级的调度 649
19.4.2 抢占式内核 650
19.4.3 最小化延迟 650
19.5 实时CPU调度 652
19.5.1 单调速率调度 653
19.5.2 最早截止期限优先调度算法 655
19.5.3 按比例分享调度 656
19.5.4 Pthread调度 656
19.6 VxWorks 5.x 657
19.7 小结 659
习题 660
文献注记 660
第20章 多媒体系统 661
20.1 什么是多媒体 661
20.1.1 媒体传送 661
20.1.2 多媒体系统的特点 663
20.1.3 操作系统问题 663
20.2 压缩 664
20.3 多媒体内核的要求 665
20.4 CPU调度 667
20.5 磁盘调度 668
20.5.1 最早期限优先调度 668
20.5.2 SCAN-EDF调度 668
20.6 网络管理 669
20.6.1 单播和多播 670
20.6.2 实时流协议 671
20.7 实例:CineBlitz 673
20.7.1 磁盘调度 673
20.7.2 接纳控制 673
20.8 小结 675
习题 675
文献注记 676
第八部分 案例研究 679
第21章 Linux系统 679
21.1 Linux发展历程 679
21.1.1 Linux内核 680
21.1.2 Linux系统 682
21.1.3 Linux发行版 682
21.1.4 Linux许可 683
21.2 设计原则 683
21.2.1 Linux系统的组件 684
21.3 内核模块 686
21.3.1 模块管理 686
21.3.2 驱动程序注册 687
21.3.3 冲突解决 688
21.4 进程管理 688
21.4.1 fork()和exec()进程模式 689
21.4.2 进程与线程 691
21.5 调度 691
21.5.1 进程调度 691
21.5.2 内核同步 693
21.5.3 对称多处理技术 695
21.6 内存管理 696
21.6.1 物理内存管理 696
21.6.2 虚拟内存 699
21.6.3 执行与装入用户程序 701
21.7 文件系统 703
21.7.1 虚拟文件系统 704
21.7.2 Linux ext2fs文件系统 705
21.7.3 日志 707
21.7.4 Linux进程文件系统 708
21.8 输入与输出 709
21.8.1 块设备 710
21.8.2 字符设备 711
21.9 进程间通信 711
21.9.1 同步与信号 711
21.9.2 进程间数据传输 712
21.10 网络结构 712
21.11 安全 714
21.11.1 认证 715
21.11.2 访问控制 715
21.12 小结 716
习题 717
文献注记 718
第22章 Windows XP 719
22.1 历史 719
22.2 设计原则 720
22.2.1 安全性 721
22.2.2 可靠性 721
22.2.3 Windows和POSIX应用程序的兼容性 721
22.2.4 高性能 721
22.2.5 可扩展性 722
22.2.6 可移植性 722
22.2.7 国际支持 723
22.3 系统组件 723
22.3.1 硬件抽象层 723
22.3.2 内核 724
22.3.3 执行体 728
22.4 环境子系统 744
22.4.1 MS-DOS环境 744
22.4.2 16位Windows环境 745
22.4.3 IA64上的32位Windows环境 745
22.4.4 Win32环境 746
22.4.5 POSIX子系统 746
22.4.6 登录与安全子系统 747
22.5 文件系统 747
22.5.1 NTFS内部布局 747
22.5.2 恢复 749
22.5.3 安全 750
22.5.4 卷管理和容错 750
22.5.5 压缩与加密 753
22.5.6 安装点 754
22.5.7 变更日志 754
22.5.8 卷影子副本 754
22.6 网络 755
22.6.1 网络接口 755
22.6.2 协议 755
22.6.3 分布式处理机制 757
22.6.4 重定向器与服务器 758
22.6.5 域 759
22.6.6 活动目录 760
22.6.7 TCP/IP网络的名称解析 760
22.7 程序接口 761
22.7.1 访问内核对象 761
22.7.2 进程间共享对象 761
22.7.3 进程管理 763
22.7.4 进程间通信 765
22.7.5 内存管理 766
22.8 小结 768
习题 768
文献注记 768
第23章 有影响的操作系统 770
23.1 早期系统 770
23.1.1 专用计算机系统 770
23.1.2 共享计算机系统 771
23.1.3 I/O叠加 774
23.2 Atlas 776
23.3 XDS-940 776
23.4 THE 777
23.5 RC4000 778
23.6 CTSS 779
23.7 MULTICS 779
23.8 IBM OS/360 780
23.9 Mach 781
23.10 其他系统 782
习题 783
参考文献 784
原版相关内容引用表 809
英汉名词对照表 810