第Ⅰ部分 硬件、软件和操作系统导论 5
第1章 操作系统导论 5
1.1 概述 7
1.2 什么是操作系统 7
1.3 操作系统早期历史:20世纪40~50年代 8
操作系统思想:改革 9
1.4 20世纪60年代 9
操作系统思想:人力和计算机资源的相对价值 11
人物介绍:Ken Thompson和Dennis Ritchie 12
1.5 20世纪70年代 13
奇闻轶事:亚伯拉罕·林肯的技术忠告 14
1.6 20世纪80年代 14
人物介绍:Doug Engelbart 15
1.7 Internet和万维网的发展历史 16
人物介绍:Tim Berners-Lee 17
1.8 20世纪90年代 18
人物介绍:Linus Torvalds 20
人物介绍:Richard Stallman 21
1.9 2000年至今 22
1.10 应用基础 23
1.11 操作系统环境 24
1.12 操作系统组件和目标 26
1.12.1 操作系统核心组件 27
1.12.2 操作系统目的 28
操作系统思想:性能 30
1.13 操作系统体系结构 30
操作系统思想:尽量保持简单(Keep It Simple,KIS) 31
奇闻轶事:系统设计师与系统工程师 31
操作系统思想:体系结构 32
1.13.1 单内核体系结构 32
1.13.2 分层体系结构 33
1.13.3 微内核体系结构 34
1.13.4 网络操作系统和分布式操作系统 35
第2章 硬件和软件的概念 57
2.1 概述 59
2.2 硬件设备的发展 59
人物介绍:Gordon Moore和摩尔定律 60
2.3 硬件组件 62
2.3.1 主板 62
2.3.2 处理器 63
2.3.3 时钟 65
2.3.4 存储器分级体系 65
操作系统思想:高速缓存技术 67
2.3.5 主存储器 68
2.3.6 辅助存储器 68
2.3.7 总线 69
2.3.8 直接存储器存取(DMA) 71
操作系统思想:遗留硬件和软件 72
2.3.9 外围设备 72
2.4 操作系统的硬件支持 74
2.4.1 处理器 74
操作系统思想:最少权限原则 75
操作系统思想:保护 76
奇闻轶事:Glitch这一术语的由来 77
2.4.2 定时器和时钟 77
2.4.3 自举 78
2.4.4 即插即用 79
2.5 高速缓存技术和缓冲技术 79
操作系统思想:试探法 81
2.6 软件概述 81
2.6.1 机器语言和汇编语言 81
2.6.2 解释器和编译器 82
2.6.3 高级语言 83
2.6.4 结构化程序设计 84
2.6.5 面向对象程序设计 85
2.7 应用编程接口(API) 86
2.8 编译、链接和加载 87
2.8.1 编译 87
2.8.2 链接 88
小型案例分析:Mach系统 91
2.8.3 加载 92
2.9 固件 93
2.10 中间件 94
第Ⅱ部分 进程和线程 115
第3章 进程的概念 115
3.1 概述 117
操作系统思想:用户最终想要的应用程序 117
小型案例分析:CTSS和Multics 118
人物介绍:Fernando J.Corbato 119
3.2 进程的状态:进程的生命周期 119
3.3 进程管理 120
3.3.1 进程状态和状态转换图 120
3.3.2 进程控制块/进程描述符 122
操作系统思想:操作系统中的数据结构 123
3.3.3 进程操作 124
3.3.4 挂起进程和恢复进程 126
3.3.5 上下文切换 127
3.4 中断 129
操作系统思想:异步与同步 130
3.4.1 中断处理 130
3.4.2 中断类型 132
3.5 进程间通信 134
3.5.1 信号 134
3.5.2 消息传递 135
3.6 案例分析:UNIX进程 136
小型案例分析:UNIX系统 138
第4章 线程的概念 155
4.1 概述 157
操作系统思想:并发性 158
4.2 线程的定义 158
4.3 引入线程的动机 159
操作系统思想:并行性 161
4.4 线程状态:线程的生命周期 161
4.5 线程操作 163
4.6 线程模型 164
4.6.1 用户级线程 164
4.6.2 内核级线程 166
操作系统思想:标准的一致性 167
4.6.3 用户级和内核级组合线程 168
4.7 线程实现需要考虑的问题 169
4.7.1 线程信号交付 170
奇闻轶事:工程 172
4.7.2 线程终止 172
4.8 POSIX和Pthread 173
奇闻轶事:标准和一致性:插针到插针兼容性 173
4.9 Linux线程 175
操作系统思想:可伸缩性 175
4.10 Windows XP线程 177
4.11 Java多线程案例分析,第Ⅰ部分:介绍Java线程 179
第5章 异步并发执行 197
5.1 概述 199
5.2 互斥 199
5.2.1 Java多线程案例分析,第Ⅱ部分:一个Java生产者/消费者关系 200
5.2.2 临界区 208
5.2.3 互斥基元 208
5.3 实现互斥基元 209
5.4 互斥问题的软件方案 210
5.4.1 Dekker算法 210
奇闻轶事:为什么应该相信软件能正常工作? 220
5.4.2 Peterson算法 220
5.4.3 N线程互斥:Lamport的Bakery算法 223
人物介绍:Leslie Lamport 227
5.5 互斥问题的硬件方案 228
5.5.1 禁止中断 228
5.5.2 test-and-set指令 229
5.5.3 swap指令 231
5.6 信号量 233
人物介绍:Edsger W.Dijkstra 234
5.6.1 使用信号量的互斥 235
5.6.2 使用信号量的线程同步 236
5.6.3 计数信号量 238
5.6.4 实现信号量 238
奇闻轶事:不明确的要求 239
第6章 并发编程 257
6.1 概述 259
奇闻轶事:彻底测试是不可能的 260
6.2 监视器 261
操作系统思想:信息隐藏 262
6.2.1 条件变量 262
6.2.2 用监视器来实现简单的资源分配 263
人物介绍:Per Brinch Hansen 264
6.2.3 监视器示例:循环缓冲区 265
6.2.4 监视器示例:Reader和Writer 268
6.3 Java监视器 271
6.4 Java多线程案例分析,第Ⅲ部分:Java中的生产者/消费者关系 272
6.5 Java多线程案例分析,第Ⅳ部分:Java中的循环缓冲区 280
第7章 死锁和无限延期 299
7.1 概述 301
7.2 死锁的例子 301
7.2.1 数据传输死锁 302
奇闻轶事:单行道大桥 303
7.2.2 简单资源死锁 303
7.2.3 脱机打印系统中的死锁 304
操作系统思想:等待、死锁和无限延期 305
7.2.4 示例:就餐哲学家 306
7.3 相关问题:无限延期 307
7.4 资源概念 308
7.5 死锁的4个必要条件 309
7.6 死锁解决方案 310
7.7 死锁预防 310
奇闻轶事:不允许螺母、螺栓和螺钉 311
7.7.1 杜绝“等待”条件 311
7.7.2 杜绝“不可抢占”条件 313
7.7.3 杜绝“循环等待”条件 313
7.8 使用Dijkstra的银行家算法来避免死锁 315
奇闻轶事:缩写词 317
7.8.1 安全状态的例子 317
7.8.2 非安全状态的例子 318
7.8.3 安全状态变成非安全状态的例子 319
7.8.4 银行家算法资源分配 319
7.8.5 银行家算法的缺点 320
7.9 死锁检测 321
7.9.1 资源分配图 321
7.9.2 缩减资源分配图 322
7.10 死锁恢复 324
7.11 当前和未来系统中的死锁策略 326
第8章 处理器调度 345
8.1 概述 347
8.2 调度级别 347
8.3 可抢占与不可抢占调度的对比 349
操作系统思想:开销 350
8.4 优先级 351
8.5 调度目标 351
操作系统思想:可预测性 352
操作系统思想:公平性 353
8.6 调度标准 353
8.7 调度算法 355
8.7.1 先入先出(FIFO)调度 355
8.7.2 轮流(RR)调度 356
8.7.3 最短进程优先(SPF)调度 358
8.7.4 最高响应比优先(HRRN)调度 359
8.7.5 最短剩余时间优先(SRT)调度 360
8.7.6 多级反馈队列 361
8.7.7 公平共享调度 364
8.8 截止期调度 366
操作系统思想:资源管理强度与相对资源价值的对比 367
8.9 实时调度 367
小型案例分析:实时操作系统 369
8.10 Java线程调度 369
第Ⅲ部分 物理和虚拟内存 393
第9章 实内存组织和管理 393
9.1 概述 395
9.2 内存组织 395
操作系统思想:对处理能力、内存、存储和带宽的追求是无止境的 396
9.3 内存管理 397
9.4 内存层次结构 397
9.5 内存管理策略 399
9.6 连续性和非连续性内存分配 400
9.7 单用户连续性内存分配 400
9.7.1 叠加 401
9.7.2 单用户系统中的保护 402
9.7.3 单流批处理 404
操作系统思想:改变是规则,而不是例外 404
9.8 固定分区多道程序设计 405
奇闻轶事:分割 408
操作系统思想:空间资源和碎片化 409
9.9 可变分区多道程序设计 409
9.9.1 可变分区的特征 410
9.9.2 内存安置策略 413
9.10 使用内存交换的多道程序设计 414
第10章 虚拟内存组织 431
10.1 概述 433
小型案例分析:Atlas 433
操作系统思想:虚拟化 434
人物介绍:Peter Denning 435
10.2 虚拟内存:基本概念 435
奇闻轶事:虚拟内存不必要 436
10.3 块映射 439
10.4 分页 441
10.4.1 分页地址转换之直接映射技术 444
10.4.2 分页地址转换之关联映射技术 445
10.4.3 分页地址转换之直接/联想映射技术 446
操作系统思想:经验结果:基于局部性的直观推断 447
10.4.4 多级页表 449
10.4.5 反向页表 451
10.4.6 分页系统中的共享 453
操作系统思想:缓式分配 455
10.5 分段 456
10.5.1 分段地址转换之直接映射 457
10.5.2 分段系统中的共享 459
10.5.3 分段系统中的保护和访问控制 460
10.6 分段/分页系统 464
10.6.1 分段/分页系统中的动态地址转换 464
10.6.2 分段/分页系统中的共享和保护 467
10.7 案例分析:IA-32 Intel构架虚拟内存 468
小型案例分析:IBM大型机操作系统 471
小型案例分析:VM操作系统的早期历史 472
第11章 虚拟内存管理 495
11.1 概述 497
11.2 局部性 497
11.3 请求分页 498
操作系统思想:操作系统中的计算机理论 500
操作系统思想:空间-时间折中 500
11.4 先行分页技术 501
11.5 页替换 502
11.6 页替换策略 503
11.6.1 随机页替换 503
11.6.2 先入先出(FIFO)页替换 504
11.6.3 FIFO异常 505
11.6.4 最近最少使用(LRU)的页替换策略 506
11.6.5 最少使用(LFU)的页替换策略 508
11.6.6 最近不用的先淘汰(NUR)页替换策略 508
11.6.7 FIFO变型:二次机会页替换和时钟页替换 510
11.6.8 最远的页先淘汰替换策略 510
11.7 工作集模型 512
11.8 缺页错误频率(PFF)页替换 516
11.9 页释放 517
11.10 页大小 517
11.11 分页模式下的程序行为 519
11.12 全局页替换与局部页替换 521
11.13 案例分析:Linux页替换策略 522
第Ⅳ部分 辅助存储器、文件和数据库 545
第12章 磁盘性能优化 545
12.1 概述 547
12.2 辅助存储器的演变 547
12.3 活动臂磁盘存储器的特征 548
12.4 磁盘调度的必要性 550
12.5 磁盘调度策略 551
12.5.1 先到先服务(FCFS)磁盘调度策略 553
12.5.2 最短寻道时间优先(SSTF)磁盘调度 554
奇闻轶事:每个问题都有解决方案,每个解决方案都有问题 555
12.5.3 SCAN磁盘调度 555
12.5.4 C-SCAN磁盘调度 556
12.5.5 FSCAN和N-Step SCAN磁盘调度 557
12.5.6 LOOK和C-LOOK磁盘调度 559
12.6 旋转优化 560
12.6.1 SLTF调度 560
12.6.2 SPTF和SATF调度 561
12.7 系统考虑 563
操作系统思想:饱和与瓶颈 564
12.8 高速缓存和缓冲 565
12.9 其他的磁盘性能优化技术 566
操作系统思想:压缩和解压 567
操作系统思想:冗余技术 568
12.10 独立磁盘冗余阵列(RAID) 569
12.10.1 RAID概述 569
操作系统思想:任务关键系统 570
操作系统思想:容错 571
12.10.2 第0级(带区集) 572
12.10.3 第1级(镜像) 573
12.10.4 第2级(位级汉明纠错码奇偶校验) 574
12.10.5 第3级(位级异或纠错码奇偶校验) 576
12.10.6 第4级(块级异或纠错码奇偶校验) 578
12.10.7 第5级(块级分布式异或纠错码奇偶校验) 579
第13章 文件和数据库系统 605
13.1 概述 607
13.2 数据层次结构 607
13.3 文件 608
13.4 文件系统 609
操作系统思想:加密和解密 610
13.4.1 目录 611
13.4.2 元数据 615
13.4.3 安装 616
13.5 文件组织 618
13.6 文件分配 618
13.6.1 连续文件分配 619
13.6.2 链表式非连续文件分配 620
13.6.3 表格式非连续文件分配 621
小型案例分析:MS-DOS 623
13.6.4 索引非连续文件分配 624
13.7 空闲空间管理 627
13.8 文件访问控制 628
操作系统思想:安全性 629
13.8.1 访问控制矩阵 629
13.8.2 用户级访问控制 630
13.9 数据访问技术 631
13.10 数据完整性保护 632
13.10.1 备份和恢复 632
操作系统思想:备份和恢复 632
13.10.2 数据完整性和基于日志的文件系统 633
操作系统思想:墨菲法则和健壮系统 634
13.11 文件服务器和分布式系统 637
13.12 数据库系统 637
13.12.1 数据库系统的优点 638
13.12.2 数据访问 638
13.12.3 关系数据库模型 639
13.12.4 操作系统和数据库系统 641
第Ⅴ部分 性能、处理器和多处理器管理 665
第14章 性能和处理器设计 665
14.1 概述 667
14.2 影响性能问题的重要趋势 667
14.3 为什么性能监督和评估是必需的 668
14.4 性能指标 669
14.5 性能评估技术 671
14.5.1 tracing和profiling 671
14.5.2 计时和微基准程序 672
14.5.3 特定应用程序的评估 673
14.5.4 分析模型 674
14.5.5 基准程序 675
14.5.6 复合程序 676
14.5.7 仿真 677
14.5.8 性能监督 678
14.6 瓶颈和饱和 679
14.7 反馈循环 680
14.7.1 负反馈 680
14.7.2 正反馈 681
14.8 处理器设计中的性能技术 681
14.8.1 复杂指令集计算(CISC) 682
14.8.2 精简指令集计算(RISC) 683
14.8.3 Post-RISC处理器 686
14.8.4 显式并行指令计算(EPIC) 688
第15章 多处理器管理 711
15.1 概述 713
小型案例分析:超级计算机 713
人物介绍:Seymour Cray 714
15.2 多处理器构架 715
15.2.1 顺序和并行执行构架分类 715
15.2.2 处理器互连机制 716
15.2.3 松散耦合系统与紧密耦合系统 722
15.3 多处理器操作系统组织 723
15.3.1 主/从结构 723
15.3.2 独立内核 724
15.3.3 对称结构 725
操作系统思想:适当地降低性能(Graceful Degradation) 726
15.4 存储器访问构架 726
15.4.1 均匀的内存访问 727
15.4.2 非均匀的内存访问 728
15.4.3 全高速缓存存储构架 729
15.4.4 非远程存储访问 730
15.5 多处理器内存共享 731
操作系统思想:数据复制和一致性 732
15.5.1 高速缓存一致性 732
15.5.2 页复制和迁移 733
15.5.3 共享虚拟内存 734
15.6 多处理器调度 736
15.6.1 不知道作业的多处理器调度 738
15.6.2 知道作业的多处理器调度 739
15.7 进程迁移 742
15.7.1 进程迁移步骤 742
15.7.2 进程迁移概念 744
15.7.3 进程迁移策略 745
15.8 负载平衡 746
15.8.1 静态负载平衡 747
15.8.2 动态负载平衡 748
15.9 多处理器互斥 751
15.9.1 旋锁 751
15.9.2 休眠/唤醒锁 752
15.9.3 读/写锁 753
第Ⅵ部分 联网和分布式计算 781
第16章 联网概论 781
16.1 概述 783
16.2 网络拓扑 783
小型案例分析:Symbian OS 786
16.3 网络类型 786
16.4 TCP/IP协议堆栈 787
16.5 应用层 788
16.5.1 超文本传输协议(HTTP) 789
16.5.2 文件传输协议(FTP) 790
16.6 传输层 790
奇闻轶事:不可靠的通信线路可能带来麻烦 791
16.6.1 传输控制协议(TCP) 792
16.6.2 用户数据文报协议(UDP) 793
16.7 网络层 793
16.7.1 Internet协议(IP) 794
16.7.2 IPv6 795
16.8 链路层 796
16.8.1 Ethernet 796
16.8.2 令牌环 797
16.8.3 光纤分布式数据接口(FDDI) 799
16.8.4 IEEE 802.11(无线) 799
16.9 客户/服务器模型 800
第17章 分布式系统入门 817
17.1 概述 819
17.2 分布式系统的特点 820
17.2.1 性能和伸缩性 820
17.2.2 连接性和安全性 820
17.2.3 可靠性和容错性 821
17.2.4 透明性 821
17.2.5 网络操作系统 823
17.2.6 分布式操作系统 823
17.3 分布式系统中的通信 823
17.3.1 中间件 824
奇闻轶事:发生错误的后果 825
17.3.2 远程过程调用(RPC) 825
17.3.3 远程方法调用(RMI) 826
17.3.4 CORBA 827
17.3.5 DCOM 828
17.3.6 分布式系统中的进程迁移 828
17.4 分布式系统中的同步 829
17.5 分布式系统中的互斥 830
17.5.1 没有共享内存的互斥 830
17.5.2 Agrawala和Ricart的分布式互斥算法 831
17.6 分布式系统中的死锁 832
17.6.1 分布式死锁 832
17.6.2 死锁预防 833
17.6.3 死锁检测 834
17.6.4 一个分布式资源死锁检测算法 835
17.7 案例分析:Sprite分布式操作系统 837
17.8 案例分析:Amoeba分布式操作系统 838
第18章 分布式系统和Web服务 853
18.1 概述 855
18.2 分布式文件系统 855
18.2.1 分布式文件系统的概念 855
18.2.2 网络文件系统(NFS) 857
18.2.3 Andrew文件系统(AFS) 859
18.2.4 Coda文件系统 861
18.2.5 Sprite文件系统 864
18.3 多计算机系统 867
18.4 群集 868
18.4.1 群集类型 869
18.4.2 群集的优势 869
18.4.3 群集的例子 870
18.5 对等分布式计算 872
18.5.1 客户/服务器和对等应用程序 872
18.5.2 集中式和分散式P2P应用程序 873
18.5.3 Peer发现与搜索 875
18.5.4 JXTA 876
18.6 网格计算 877
18.7 Java分布式计算 878
18.7.1 Java Servlet和JavaServer Page(JSP) 878
18.7.2 Jini 880
18.7.3 JavaSpaces 882
18.7.4 Java管理扩展(JMX) 884
18.8 Web服务 885
18.8.1 Microsoft.NET平台 886
18.8.2 Sun Microsystems和Sun ONE平台 887
第Ⅶ部分 安全性 911
第19章 安全性 911
19.1 概述 914
操作系统思想:伦理系统设计 914
19.2 加密技术 915
19.2.1 秘密密钥加密技术 916
19.2.2 公钥加密技术 919
人物介绍:Rivest,Shamir和Adleman 921
19.3 认证 922
19.3.1 基础认证 922
19.3.2 生物特征和智能卡 924
19.3.3 Kerberos 925
19.3.4 单一登录 926
19.4 访问控制 927
19.4.1 访问权和保护域 927
19.4.2 访问控制模型和策略 928
19.4.3 访问控制机制 929
19.5 安全性攻击 932
19.5.1 密码分析 932
19.5.2 病毒和蠕虫 932
19.5.3 拒绝服务(DoS)攻击 934
19.5.4 软件漏洞 935
19.5.5 系统渗透 936
19.6 预防攻击和安全性解决方案 937
19.6.1 防火墙 937
19.6.2 入侵检测系统(IDS) 938
19.6.3 反病毒软件 939
19.6.4 安全性补丁 941
小型案例分析:OpenBSD 942
小型案例分析:Macintosh 943
19.6.5 安全的文件系统 944
19.6.6 橘皮书安全性 945
19.7 安全通信 946
19.8 密钥协定协议 946
19.8.1 密钥管理 947
19.8.2 数字签名 948
19.9 公钥基础设施、证书和证书授权机构 949
19.10 安全通信协议 951
19.10.1 安全套接层(SSL) 951
19.10.2 虚拟专用网和IP安全性 952
19.10.3 无线安全性 953
19.11 隐写术 954
19.12 所有权和开放源码安全性 955
19.13 案例分析:UNIX系统安全性 956
第Ⅷ部分 操作系统案例分析 985
第20章 案例分析:Linux 985
20.1 概述 988
20.2 发展史 988
20.3 Linux概述 990
20.3.1 发展和团体 990
20.3.2 分发 991
20.3.3 用户界面 992
20.3.4 标准 992
20.4 内核体系结构 993
20.4.1 硬件平台 994
小型案例分析:用户模式的Linux 995
20.4.2 可加载的内核模块 996
20.5 进程管理 997
20.5.1 进程和线程组织 997
20.5.2 进程调度 999
20.6 内存管理 1004
20.6.1 内存组织 1004
20.6.2 物理内存分配和释放 1009
20.6.3 页面替换 1010
20.6.4 交换 1012
20.7 文件系统 1013
20.7.1 虚拟文件系统 1013
20.7.2 虚拟文件系统高速缓存 1016
20.7.3 第2扩展文件系统 1018
20.7.4 过程文件系统 1022
20.8 输入/输出管理 1024
20.8.1 设备驱动程序 1024
20.8.2 字符设备输入/输出 1026
20.8.3 块设备输入/输出 1027
20.8.4 网络设备输入/输出 1030
20.8.5 统一设备模型 1031
20.8.6 中断 1033
20.9 内核同步 1035
20.9.1 自旋锁 1035
20.9.2 阅读程序/写程序锁 1036
20.9.3 顺序锁 1036
20.9.4 内核信号量 1037
20.10 进程间的通信 1038
20.10.1 信号 1038
20.10.2 管道 1039
20.10.3 套接字 1040
20.10.4 消息队列 1041
20.10.5 共享内存 1042
20.10.6 系统V信号量 1043
20.11 联网技术 1044
20.11.1 数据包处理 1044
20.11.2 网络过滤器框架和异常分支 1045
20.12 可伸缩性 1046
20.12.1 对称多处理(SMP) 1047
20.12.2 非均衡内存访问 1047
20.12.3 其他的可伸缩性功能 1048
20.12.4 嵌入式Linux 1049
20.13 安全性 1049
20.13.1 认证 1050
20.13.2 访问控制方法 1050
20.13.3 加密技术 1051
第21章 案例分析:Windows XP 1077
21.1 概述 1080
21.2 历史 1080
人物介绍:比尔·盖茨(Bill Gates) 1081
人物介绍:大卫·卡特勒 1083
小型案例分析:OS/2 1084
21.3 设计目标 1084
21.4 系统体系结构 1085
21.5 系统管理机制 1087
21.5.1 注册表 1087
21.5.2 对象管理器 1088
21.5.3 中断请求级(IRQL) 1089
21.5.4 异步过程调用(APC) 1091
21.5.5 延迟过程调用(DPC) 1092
21.5.6 系统线程 1093
21.6 进程和线程管理 1093
21.6.1 进程和线程结构 1093
21.6.2 线程调度 1096
21.6.3 线程同步 1099
21.7 内存管理 1104
21.7.1 内存组织 1104
21.7.2 内存分配 1106
21.7.3 页面替换 1109
21.8 文件系统管理 1111
21.8.1 文件系统驱动程序 1111
21.8.2 NTFS 1112
21.9 输入/输出管理 1117
21.9.1 设备驱动程序 1118
21.9.2 输入/输出处理 1120
21.9.3 中断处理 1124
21.9.4 文件高速缓存管理 1125
21.10 进程间的通信 1126
21.10.1 管道 1126
21.10.2 mailslot控件 1128
21.10.3 共享内存 1128
21.10.4 本地和远程过程调用 1129
21.10.5 组件对象模型(COM) 1131
21.10.6 拖放式和复合文档 1132
21.11 联网技术 1133
21.11.1 网络输入/输出 1133
21.11.2 网络驱动程序体系结构 1135
21.11.3 网络协议 1136
21.11.4 网络服务 1138
21.11.5 .NET 1138
21.12 可伸缩性 1139
21.12.1 对称多处理(SMP) 1139
21.12.2 嵌入式Windows XP 1140
21.13 安全性 1141
21.13.1 认证 1141
21.13.2 授权 1142
21.13.3 Internet连接防火墙 1143
21.13.4 其他功能部件 1144
术语表 1187
索引 1279
第Ⅰ部分 硬件、软件和操作系统导论 5
第1章 操作系统导论 5
图1-1 应用程序与操作系统之间的交互 24
图1-2 虚拟机示意图 26
图1-3 单内核操作系统体系结构 33
图1-4 THE操作系统的层 34
图1-5 微内核操作系统体系结构 35
图1-6 客户机/服务器网络操作系统模型 36
第2章 硬件和软件的概念 57
图2-1 Intel处理器中晶体管数量与时间的关系 61
图2-2 处理器组件 64
图2-3 存储器分级体系 66
图2-4 直接存储器存取(DMA) 71
图2-5 外围设备 73
图2-6 自举 78
图2-7 应用编程接口 86
图2-8 编译阶段 88
图2-9 目标模块 89
图2-10 链接过程 89
图2-11 符号解析 90
图2-12 加载 92
图2-13 编译、链接和加载 93
第Ⅱ部分 进程和线程 115
第3章 进程的概念 115
图3-1 进程状态转换 121
图3-2 进程表和进程控制块 123
图3-3 进程创建的层次结构 125
图3-4 Linux操作系统中的进程层次结构 125
图3-5 包括挂起状态和恢复状态的进程状态转换 126
图3-6 上下文切换 128
图3-7 处理中断 131
图3-8 Intel IA-32体系结构所识别的常见的中断类型 132
图3-9 Intel IA-32异常类型 133
图3-10 UNIX系统调用 137
图3-11 练习4的代码 145
第4章 线程的概念 155
图4-1 线程与进程的关系 159
图4-2 线程的生命周期 162
图4-3 用户级线程 165
图4-4 内核级线程 166
图4-5 组合线程模型 168
图4-6 信号屏蔽 171
图4-7 Linux系统任务状态转换图 176
图4-8 Windows XP线程状态转换图 178
图4-9 Java线程的创建、启动、睡眠和显示(1/2) 180
图4-9 Java线程的创建、启动、睡眠和显示(2/2) 181
第5章 异步并发执行 197
图5-1 生产者/消费者例子中使用的Buffer接口 202
图5-2 Producer类代表生产者/消费者关系中的生产者线程 202
图5-3 Consumer类代表生产者/消费者关系中的消费者线程 203
图5-4 UnsynchronizedBuffer类实现了Buffer接口,并声明要由Producer和Consumer共享的变量buffer 204
图5-5 SharedBufferTest类包含main方法,它负责启动应用程序 205
图5-6 互斥实现——版本1 211
图5-7 互斥实现——版本2 213
图5-8 互斥实现——版本3 214
图5-9 互斥实现——版本4 215
图5-10 正确解决互斥问题的Dekker算法 217
图5-11 Peterson互斥算法 220
图5-12 Lamport的Bakery算法 224
图5-13 用于互斥的testAndSet指令 230
图5-14 用于互斥的swap指令 232
图5-15 使用信号量的互斥 235
图5-16 使用信号量来实现的生产者/消费者关系 236
图5-17 练习5.5的代码 244
图5-18 用于练习5.16(a)的新的互斥基元 245
图5-19 用于练习5.16(b)的代码 245
图5-20 练习5.8的算法 246
第6章 并发编程 257
图6-1 资源分配监视器 263
图6-2 伪代码监视器实现循环缓冲区 266
图6-3 用于解决reader和writer问题的监视器伪代码 268
图6-4 SynchronizedBuffer负责同步对一个共享整数的访问 273
图6-5 通过同步机制来修改一个共享对象的线程 277
图6-6 CircularBuffer控制对一个共享整数数组的访问 281
图6-7 CircularBufferTest类实例化生产者和消费者线程 285
第7章 死锁和无限延期 299
图7-1 交通死锁的例子 302
图7-2 资源死锁示例:这个系统已经死锁,因为每个进程都持有另一个进程需要的资源,但两个进程都不愿释放它所持有的资源 304
图7-3 就餐哲学家行为 306
图7-4 eat方法的实现 306
图7-5 Havender提出的预防死锁的资源线性顺序方案 314
图7-6 安全状态 317
图7-7 非安全状态 318
图7-8 安全状态变成了非安全状态 319
图7-9 3个进程的状态描述 320
图7-10 资源分配和请求图 322
图7-11 通过缩减资源分配图,证明不存在死锁 323
图7-12 练习7.9的典型哲学家行为 332
图7-13 练习7.9(a)的哲学家行为 332
图7-14 练习7.9(b)的哲学家行为 332
图7-15 练习7.9(c)的哲学家行为 333
图7-16 练习7.9(d)的哲学家行为 333
图7-17 状态A的资源描述 335
图7-18 状态B的资源描述 335
图7-19 系统状态(当前loan、最大需求和当前claim) 336
图7-20 系统状态(资源总数和可用资源数) 336
图7-21 处于非安全状态的一个系统的例子 337
第8章 处理器调度 345
图8-1 调度级别 348
图8-2 先入先出调度 355
图8-3 轮流调度 356
图8-4 多级反馈队列 362
图8-5 标准UNIX进程调度程序。调度程序将处理器分配给用户,每个用户都可能有多个进程(AT&T Archives专利,使用已获AT&T许可) 365
图8-6 公平共享调度程序。公平共享调度程序将系统资源划分为不同的部分,然后由进程调度程序分配给各个公平共享组(AT&T Archives专利,使用已获AT&T许可) 365
图8-7 Java线程优先级调度 371
第Ⅲ部分 物理和虚拟内存 393
第9章 实内存组织和管理 393
图9-1 Microsoft Windows操作系统的内存需求 396
图9-2 层次化内存组织 398
图9-3 单用户连续性内存分配 401
图9-4 叠加结构 402
图9-5 单用户连续性内存分配系统中的内存保护 403
图9-6 单用户系统上的处理器使用情况(注意:在许多单用户作业中,与图中显示的相比,I/O等待时间要比处理器使用时间长得多) 405
图9-7 使用绝对翻译和加载的固定分区多道程序设计 406
图9-8 采用绝对翻译和加载的固定分区多道程序设计系统的内存浪费示意图 406
图9-9 采用可重定位翻译和加载技术的固定分区多道程序设计 407
图9-10 连续分配多道程序设计系统的内存保护 407
图9-11 固定分区多道程序设计系统中的内部碎片化问题 408
图9-12 可变分区多道程序设计的初始分区 410
图9-13 可变分区多道程序设计中的内存“洞” 411
图9-14 在可变分区多道程序设计中对内存洞进行合并 411
图9-15 可变分区多道程序设计中的内存压缩 412
图9-16 First-fit,Best-fit和Worst-fit内存安置策略 414
图9-17 交换系统中的多道程序设计,每次只能有一个进程驻留在主内存中 415
第10章 虚拟内存组织 431
图10-1 内存组织的演变 434
图10-2 二级存储结构 436
图10-3 内存和辅助存储器中存在的各种地址空间 437
图10-4 虚拟地址映射到真实地址 438
图10-5 假邻近 438
图10-6 块映射系统中虚拟地址格式 439
图10-7 用块映射进行虚拟地址转换 440
图10-8 纯分页系统下的虚拟地址格式 441
图10-9 主存被分成页帧 441
图10-10 在一个纯分页系统中的虚拟内存地址和物理内存地址间的对应关系 442
图10-11 页表项 443
图10-12 分页地址转换之直接映射技术 444
图10-13 分页地址转换之纯联想映射技术 445
图10-14 分页地址转换之联想/直接组合映射法 448
图10-15 多级页地址转换 450
图10-16 使用反向页表的页地址转换 452
图10-17 使用散列锚表的反向页表 453
图10-18 纯分页系统中的共享 454
图10-19 真实内存分段系统中不连续的内存分配 456
图10-20 纯分段系统中的虚拟内存格式 457
图10-21 纯分段系统中的虚拟地址转换 458
图10-22 分段映射表表项 459
图10-23 纯分段系统中的共享 460
图10-24 非连续内存分配多道程序设计系统中的内存保护键 461
图10-25 访问控制类型 462
图10-26 组合读、写和执行访问以产生有用的访问控制模式 462
图10-27 带保护位的分段映射表项 463
图10-28 分段/分页系统中的虚拟地址格式 464
图10-29 在一个分段/分页系统中,使用组合的联想/直接映射技术的虚拟地址转换 465
图10-30 分段/映射系统的映射表结构 466
图10-31 在分段/映射系统中两个进程共享一个分段 468
图10-32 虚拟机多道程序设计 474
第11章 虚拟内存管理 495
图11-1 请求分页系统下的空间-时间积 499
图11-2 先进先出(FIFO)页替换 504
图11-3 FIFO异常——缺页错误数可能随页帧分配而增加 506
图11-4 最近最少使用的(LRU)页替换策略 507
图11-5 NUR策略下的页分类 509
图11-6 最远的页先淘汰替换策略的访问图 511
图11-7 存储器的引用模式展示了局部性 512
图11-8 缺页率取决于一个进程的所有页可用的内存量 513
图11-9 进程的所引用页的工作集的定义 514
图11-10 工作集大小作为窗口大小的函数 514
图11-11 工作集内存管理下的主存分配 515
图11-12 在一个分页/分段组合系统中的内部碎片 518
图11-13 各种处理器构架中的页尺寸 519
图11-14 一个进程的所有页随时间的变化被引用的百分比 520
图11-15 缺页错误间隔时间与分配给一个进程的页帧数的关系 521
图11-16 Linux页替换策略综述 523
第Ⅳ部分 辅助存储器、文件和数据库 545
第12章 磁盘性能优化 545
图12-1 活动臂磁盘存储器的侧视图 548
图12-2 硬磁盘的寻道时间和延迟时间 549
图12-3 盘面的顶视图 549
图12-4 磁盘存取过程的组成 550
图12-5 磁盘请求模式 552
图12-6 FCFS策略下的寻道模式 553
图12-7 SSTF策略下的寻道模式 554
图12-8 SCAN策略下的寻道模式 556
图12-9 C-SCAN策略下的寻道模式 557
图12-10 FSCAN策略下的寻道模式 558
图12-11 N-Step SCAN策略下的寻道模式(n=3) 558
图12-12 LOOK策略下的寻道模式 559
图12-13 寻道优化策略总结 560
图12-14 SLTF调度。请求将以指示的顺序得到服务,而不管它们到达的先后顺序 561
图12-15 SPTF(a)和SATF(b)磁盘调度实例 562
图12-16 根据RAID系统中的单个文件创建的带区(strip)和带区集(stripe) 569
图12-17 第0级RAID(带区集) 572
图12-18 第1级RAID(镜像) 573
图12-19 第2级RAID(位级汉明纠错码奇偶校验) 576
图12-20 第3级RAID(位级、单个奇偶校验磁盘) 577
图12-21 第4级RAID(块级奇偶校验) 578
图12-22 第5级RAID(块级分布式奇偶校验) 580
图12-23 第0~5级RAID比较 580
第13章 文件和数据库系统 605
图13-1 目录文件内容示例 611
图13-2 二级分层文件系统 612
图13-3 分层文件系统的目录示例 613
图13-4 文件系统中的链接 614
图13-5 安装一个文件系统 617
图13-6 链表式非连续文件分配 621
图13-7 表式非连续文件分配 622
图13-8 索引块链接 625
图13-9 Inode结构 626
图13-10 使用空闲表的空闲空间管理 627
图13-11 使用位图的空闲空间管理 628
图13-12 访问控制矩阵 630
图13-13 基于日志的文件系统 636
图13-14 关系数据库中的一个关系 640
图13-15 通过投影形成的关系 640
图13-16 SQL查询 640
第Ⅴ部分 性能、处理器和多处理器管理 665
第14章 性能和处理器设计 665
图14-1 性能评估技术概括 679
图14-2 IBM的System/370构架上10个最常执行的指令(经IBM公司授权刊登) 684
图14-3 RISC和CISC设计对比 685
图14-4 (a)EPIC处理器中的指令执行,(b)post-RISC处理器中的指令执行 689
第15章 多处理器管理 711
图15-1 共享总线多处理器组织 717
图15-2 纵横开关矩阵多处理器组织 718
图15-3 4向连接的二维网状网络 719
图15-4 三维超立方体和四维超立方体 720
图15-5 多级基准网络 721
图15-6 紧密耦合系统 722
图15-7 松散耦合系统 722
图15-8 主/从多处理结构 724
图15-9 UMA多处理器 727
图15-10 NUMA多处理器 728
图15-11 COMA多处理器 729
图15-12 NORMA多处理器 730
图15-13 一起调度算法(未分版本) 740
图15-14 动态分割调度算法 741
图15-15 进程迁移 743
图15-16 使用图表示的静态负载平衡 747
图15-17 处理器负载扩散 749
第Ⅵ部分 联网和分布式计算 781
第16章 联网概论 781
图16-1 网络拓扑 784
图16-2 FTP命令 790
图16-3 通过令牌环协议来发送一条消息 798
图16-4 三层客户/服务器模型 801
第17章 分布式系统入门 817
图17-1 RPC通信模型 826
图17-2 wound-wait策略 833
图17-3 wait-die策略 834
图17-4 无死锁的系统 836
图17-5 出现了死锁的系统 836
图17-6 消除死锁之后的系统 837
第18章 分布式系统和Web服务 853
图18-1 NFS构架 858
图18-2 AFS结构 860
图18-3 Coda卷结构 862
图18-4 互斥AVSG中的文件一致性问题 863
图18-5 Sprite文件系统的域 864
图18-6 Sprite文件系统中的读取和写入 865
图18-7 典型的Beowulf群集 870
图18-8 使用共享存储的高可用性群集 871
图18-9 使用本地存储的高可用性群集 871
图18-10 具有32个结点的负载平衡群集 872
图18-11 集中式P2P即时通信应用程序 873
图18-12 纯P2P即时通信应用程序 874
图18-13 常见P2P应用 874
图18-14 JXTA低级协议 877
图18-15 Jini构架 881
图18-16 使用JavaSpaces的分布式图像处理应用程序 883
图18-17 JMX的三层管理构架 884
图18-18 含有6个peer的P2P系统 897
第Ⅶ部分 安全性 911
第19章 安全性 911
图19-1 用秘密密钥来加密和解密信息 917
图19-2 密钥分配中心分配会话密钥 917
图19-3 使用公钥加密技术加密和解密信息 919
图19-4 用公钥算法认证 920
图19-5 口令加码法(基于64位编码) 923
图19-6 一小组主体和客体的访问控制矩阵 930
图19-7 来源于访问控制矩阵的访问控制列表 930
图19-8 多态病毒 940
图19-9 创建数字信封 947
第Ⅷ部分 操作系统案例分析 985
第20章 案例分析:Linux 985
图20-1 Linux体系结构 994
图20-2 任务状态转换图 998
图20-3 调度程序优先级阵列 1000
图20-4 优先值和它们相应的交互性等级 1002
图20-5 页表组织 1005
图20-6 内核虚拟地址空间映射 1006
图20-7 在IA-32 Intel体系结构上的物理内存区 1008
图20-8 free_area向量 1009
图20-9 页面替换系统概观 1011
图20-10 VFS、文件系统和数据之间的关系 1014
图20-11 一个特定的/home目录的目录条目组织 1015
图20-12 VFS文件和索引节点操作 1016
图20-13 目录条目和索引节点高速缓存 1017
图20-14 ext2索引节点内容 1019
图20-15 块组 1020
图20-16 组描述符 1021
图20-17 目录结构 1021
图20-18 /proc目录的内容实例 1023
图20-19 /proc/devices文件内容 1024
图20-20 输入/输出接口层 1025
图20-21 chrdevs向量 1026
图20-22 块输入/输出子系统中的层 1027
图20-23 统一设备模型组织 1032
图20-24 POSIX信号 1038
图20-25 系统V共享内存系统调用 1042
图20-26 网络子系统所接收的网络数据包经过的路径 1045
图20-27 网络过滤异常分支 1046
图20-28 回送设备使用加密的API而提供的一个加密的文件系统 1052
第21章 案例分析:Windows XP 1077
图21-1 Windows XP系统体系结构 1086
图21-2 中断请求级(IRQL) 1090
图21-3 线程状态转换图 1097
图21-4 Windows XP中的调度程序对象 1101
图21-5 虚拟地址转换 1105
图21-6 页状态 1105
图21-7 内存分配步骤 1107
图21-8 页帧状态 1108
图21-9 页面替换过程 1110
图21-10 样本文件的主文件表 1113
图21-11 存储在B树中的目录内容 1114
图21-12 Windows XP I/O支持组件 1117
图21-13 I/O请求包 1121
图21-14 Windows XP中的主要功能代码示例 1121
图21-15 IRP的服务过程 1122
图21-16 LPC或RPC调用的流程 1130
图21-17 处理一个网络I/O请求 1134
图21-18 网络驱动程序体系结构 1136
图21-19 在一个Windows XP网络中的认证过程 1142