目录 1
出版者的话 1
专家指导委员会 1
译者序 1
前言 1
第1章 导言 1
1.1 计算机与软件 1
1.1.1 通常的系统软件 2
1.1.2 资源抽象 4
示例:磁盘设备抽象 5
1.1.3 资源共享 6
1.1.4 虚拟机和透明资源共享 6
1.1.5 显式资源共享 9
1.2 操作系统策略 10
1.2.2 用户的观点 11
1.2.1 批处理系统 11
1.2.3 批处理技术 12
示例:批处理文件 13
1.2.4 分时系统 13
1.2.5 用户的观点 14
1.2.6 分时技术 14
示例:UNIX分时系统 14
1.2.7 个人计算机和工作站 15
1.2.8 用户的观点 16
1.2.9 操作系统技术 16
1.2.10 对现代操作系统技术的贡献 17
示例:微软Windows操作系统家族 17
1.2.11 嵌入式系统 18
1.2.12 用户的观点 18
1.2.13 操作系统技术 18
1.2.16 用户的观点 19
1.2.15 小型通信计算机 19
1.2.14 对现代操作系统技术的贡献 19
示例:VxWorks 19
1.2.17 操作系统技术 20
示例:Windows CE(Pocket PC) 20
1.2.18 网络 21
1.2.19 现代操作系统的起源 22
1.3 小结 22
1.4 习题 23
第2章 使用操作系统 25
2.1 程序员看到的虚拟机 25
2.1.1 顺序计算 25
2.1.2 多线程计算 26
2.2 资源 27
示例:Windows文件 28
示例:POSIX文件 28
2.2.1 使用文件 28
2.2.2 使用其他资源 30
2.3 进程和线程 31
2.3.1 创建进程和线程 32
2.3.2 FORK()、JOIN()和QUIT():历史的观点 32
示例:使用FORK()、JOIN()和QUIT() 32
2.3.3 经典的进程创建 34
2.3.4 现代进程和线程的创建 34
2.4 并发程序的编写 34
2.4.1 多单线程进程:UNIX模型 34
示例:在UNIX系统中执行命令 36
2.4.2 多进程和进程中的多线程:Windows模型 39
示例:创建Windows进程 40
2.5 对象 43
2.7 习题 44
2.6 小结 44
实验2.1:一个简单的shell 45
实验2.2:一个多线程的应用程序 50
第3章 操作系统的组织结构 55
3.1 基本功能 55
3.1.1 设备管理 55
3.1.2 进程、线程和资源管理 56
3.1.3 存储管理 56
3.1.4 文件管理 57
3.2 一般实现考虑 57
3.2.1 性能 58
3.2.2 资源独占性使用 58
3.2.3 处理器模式 58
3.2.4 内核 59
3.2.5 请求获得操作系统服务 60
3.2.6 软件模块化 61
3.3 当代的操作系统内核 62
3.3.1 UNIX内核 63
示例:Linux 64
3.3.2 Windows NT执行体和内核 65
3.4 小结 66
3.5 习题 67
实验3.1:观察操作系统的行为 67
第4章 计算机组织结构 69
4.1 冯·诺依曼体系结构 69
4.1.1 冯·诺依曼体系结构的发展 69
4.1.2 基本思想 69
4.2 中央处理单元 71
4.2.1 算术逻辑运算单元 71
4.2.2 控制单元 72
4.3 主存储器 73
4.2.3 处理器的实现 73
4.4 I/O设备 74
4.4.1 设备控制器 75
4.4.2 直接内存访问 76
4.4.3 存储映射I/O 77
4.5 中断 78
4.6 当代传统计算机 80
4.7.1 片上系统技术 83
4.7 移动计算机 83
4.7.2 电源管理 84
示例:Itsy移动计算机 84
4.8 多处理机和并行计算机 85
4.8.1 并行指令执行 85
4.8.2 阵列处理机 86
4.8.3 共享内存多处理机 86
4.8.4 分布式存储多处理机 86
4.10 习题 87
4.8.5 工作站网络 87
4.9 小结 87
第5章 设备管理 91
5.1 I/O系统 91
5.1.1 设备管理器抽象 91
5.1.2 在应用程序内I/O与处理器的交迭执行 93
5.1.3 多个线程间的I/O-处理器交迭执行 94
5.2 I/O策略 94
5.2.1 使用轮询的直接I/O 95
5.2.2 中断驱动I/O 96
5.2.3 中断I/O与轮询I/O的性能比较 97
5.3 设备管理器设计 97
5.3.1 设备相关的驱动程序基础框架 98
5.3.2 服务中断 99
示例:Linux设备I/O 100
5.4 缓冲 102
5.5 不同种类设备的特征 104
5.5.1 通信设备 105
示例:异步串行设备 106
5.5.2 顺序访问存储设备 107
示例:传统磁带 107
5.5.3 随机访问存储设备 107
示例:磁盘 108
示例:磁盘访问优化 109
示例:CD-ROM和DVD 111
5.6 小结 112
5.7 习题 112
实验5.1:软盘驱动程序 113
第6章 进程、线程和资源的实现 119
6.1 手边的任务 119
6.1.1 经典进程的虚拟机 120
6.1.2 支持现代进程和线程 121
6.1.4 进程地址空间 122
6.1.3 资源 122
6.1.5 操作系统家族 123
6.1.6 进程管理器的任务 123
6.2 硬件进程 124
6.3 虚拟机接口 125
6.4 进程抽象 127
示例:Linux进程描述表 129
示例:Windows NT/2000/XP进程描述表 130
6.5 线程抽象 130
示例:Linux线程描述表 131
示例:Windows NT/2000/XP线程描述表 131
6.6 状态图 132
示例:UNIX状态图 133
6.7 资源管理器 134
6.8.1 精化进程管理器 136
6.8 概括进程管理策略 136
6.8.2 专用的资源分配策略 137
6.9 小结 138
6.10 习题 138
实验6.1:内核计时器 139
实验6.2:操纵内核对象 144
第7章 调度 153
7.1 概述 153
7.2 调度机制 154
7.2.1 进程调度程序组织 154
7.2.2 保存上下文 154
7.2.3 自愿的CPU共享 156
7.2.4 非自愿的CPU共享 157
7.2.5 性能 158
7.3 策略选择 158
7.3.1 调度程序的特征 159
7.3.2 一个调度研究模型 160
示例:分解一个进程成多个小进程 160
7.4 非剥夺策略 161
示例:估计系统负载 161
7.4.1 先来先服务 162
示例:预测FCFS的等待时间 163
7.4.2 最短作业优先 163
7.4.3 优先级调度 164
7.4.4 期限调度 165
7.5 剥夺式策略 166
7.5.1 轮转 166
7.5.2 多级队列 168
7.6 调度程序的实现 169
示例:Linux调度机制 170
7.7 小结 171
示例:Windows NT/2000/XP中的线程调度 171
示例:BSDUNIX中的调度策略 171
7.8 习题 172
实验7.1:分析RR调度 174
第8章 基本同步原理 179
8.1 协作进程 179
8.1.1 临界区 181
8.1.2 死锁 186
8.1.3 资源共享 187
8.2 经典解决办法的改进 188
8.3 信号量:现代解决方法的基础 189
8.3.1 操作原理 190
示例:使用信号量 191
8.3.2 应用中要考虑的因素 195
8.6 习题 199
8.5 小结 199
8.4 共享存储的多处理机中的同步 199
实验8.1:有限缓冲区问题 202
第9章 高级同步技术与进程间通信 209
9.1 可选的同步原语 209
9.1.1 AND同步 210
示例:使用AND同步来解决哲学家就餐问题 211
9.1.2 事件 211
示例:使用通用事件 213
示例:Windows NT/2000/XP中的分派对象 213
9.2 管程 215
9.2.1 操作原理 215
9.2.2 条件变量 216
示例:使用管程 218
9.2.3 使用管程的一些实际状况 220
9.3.1 管道模型 221
9.3.2 消息传递机制 221
9.3 进程间通信 221
9.3.3 信箱 222
9.3.4 消息协议 223
9.3.5 使用send()和receive()操作 223
示例:同步的IPC 224
9.3.6 延迟的消息拷贝 225
9.4 小结 225
9.5 习题 225
实验9.1:使用管道 227
实验9.2:精炼shell程序 232
第10章 死锁 235
10.1 背景 235
10.1.1 死锁预防 237
10.1.2 死锁避免 237
10.2 一个系统死锁模型 238
10.1.4 人工死锁管理 238
10.1.3 死锁检测和恢复 238
示例:单个资源类型 239
10.3 死锁预防 241
10.3.1 占有并等待 241
10.3.2 循环等待 242
10.3.3 允许剥夺 243
10.4 死锁避免 244
示例:使用银行家算法 246
10.5 死锁检测和恢复 247
10.5.1 顺序可重用资源 248
示例:顺序可重用资源图 252
10.5.2 可消费资源 253
10.5.3 一般资源系统 256
10.5.4 恢复 257
10.6 小结 257
10.7 习题 257
11.1 基本知识 259
第11章 存储管理 259
11.2 地址空间抽象 261
11.2.1 管理地址空间 261
示例:静态地址绑定 263
11.2.2 用于数据结构的动态存储 266
11.2.3 现代存储绑定 266
11.3 主存分配 267
11.3.1 固定分区存储分配策略 268
11.3.2 可变分区存储分配策略 268
示例:移动程序的开销 270
11.3.3 现代存储分配策略 271
11.4 动态地址空间绑定 271
11.5 现代存储管理器策略 274
11.5.1 交换 274
示例:使用高速缓存存储器 276
11.5.2 虚拟存储器 276
11.5.3 共享存储器的多处理机 277
11.6 小结 279
11.7 习题 280
实验11.1:使用共享存储器 281
第12章 虚拟存储器 287
12.1 概述 287
12.2 地址转换 287
12.2.1 地址空间映射 288
12.2.2 段式和页式 289
12.3 页式 290
示例:当代的页表实现 293
12.4 静态页面调度算法 293
12.4.1 取策略 294
12.4.2 请求调页算法 295
12.4.3 栈算法 297
12.4.4 实现LRU 298
12.4.5 页面调度性能 299
12.5 动态页面调度算法 300
12.5.1 驻留集算法 300
示例:驻留集算法 301
12.5.2 驻留集算法的实现 302
示例:利用分页实现IPC 303
示例:WindowsNT/2000/XP虚拟存储器 304
示例:Linux虚拟存储器 306
12.6 段式 307
12.6.1 地址转换 307
12.6.2 实现 309
示例:Multics段式系统 310
12.7 存储映射文件 311
12.8 小结 312
12.9 习题 313
实验12.1:存储映射文件 314
第13章 文件管理 319
13.1 概述 319
13.2 文件 320
13.2.1 低级文件 322
13.2.2 结构化文件 323
13.2.3 数据库管理系统 326
13.2.4 多媒体存储 326
13.3 低级文件实现 327
13.3.1 open()和close()操作 327
示例:UNIX中的open和close操作 329
13.3.2 块管理 331
示例:UNIX文件结构 333
示例:DOS下的FAT文件系统 334
13.3.3 读、写字节流 335
13.4.2 索引顺序文件 337
13.4 支持高级文件抽象 337
13.4.1 结构化顺序文件 337
13.4.3 数据库管理系统 338
13.4.4 多媒体文档 338
13.5 目录 338
示例:几个目录例子 340
13.6 目录实现 341
13.6.1 目录项 341
13.6.2 打开一个文件 341
13.7 文件系统 342
示例:ISO9660文件系统 342
13.7.1 安装文件系统 343
13.7.2 异构文件系统 344
13.8 小结 345
13.9 习题 345
实验13.1:一个简单的文件管理器 347
第14章 保护和安全 353
14.1 问题 353
14.1.1 目标 354
14.1.2 策略和机制 354
14.1.3 保护和安全的上下文 355
14.1.4 保护机制的开销 357
14.2 认证 357
14.2.1 外部用户认证 357
示例:Windows NT/2000/XP用户认证 359
14.2.2 内部的线程/进程认证 361
14.2.3 网络中的认证 361
14.2.4 软件认证 363
14.3 授权 364
14.3.1 特别的授权机制 365
14.3.2 授权的通用模型 367
14.3.3 实现安全策略 369
14.3.4 实现通用的授权机制 370
14.3.5 保护域 370
14.3.6 访问矩阵的实现 372
14.4 密码技术 374
14.4.1 概述 374
14.4.2 私有密钥加密技术 375
14.4.3 公开密钥加密技术 377
示例:PGP 377
14.4.4 Internet信息发送 377
14.5 小结 378
14.6 习题 379
第15章 网络 381
15.1 从计算机通信到网络 381
15.1.1 交换网络 381
15.1.2 网络硬件需求 382
15.1.3 网络软件需求 383
15.2 ISO的OSI网络体系结构模型 384
15.2.1 网络协议的演变 384
15.2.2 ISO的OSI模型 385
15.3 媒体访问控制(MAC)协议 387
15.3.1 物理层 387
示例:快速物理层 388
15.3.2 数据链路层 388
15.3.3 当代网络 389
15.4 网络层 391
15.4.1 Internet寻址 392
15.4.2 路由 393
15.4.3 网络层的使用 394
示例:在Internet上的延迟 395
15.5 传输层 395
15.5.1 通信端口 395
15.5.3 可靠的通信 396
15.5.2 数据类型 396
示例:数据报和虚电路性能 397
15.6 使用传输层 397
15.6.1 命名和地址 397
示例:域名服务 399
15.6.2 客户-服务器模型 399
15.7 网络安全 401
15.7.1 传输层安全:防火墙 401
15.7.2 网络层安全:IPsec 402
15.8 小结 402
15.9 习题 403
实验15.1:使用TCP/IP协议 404
示例:WinSock包 405
16.1 通过网络共享信息 409
第16章 远程文件 409
16.1.1 显式的文件复制系统 411
16.1.2 无缝文件系统接口 412
16.1.3 工作分布 413
16.2 远程磁盘系统 414
16.2.1 远程磁盘操作 415
16.2.2 性能因素 416
16.2.3 可靠性 417
16.2.4 远程磁盘的未来 419
16.3 远程文件系统 419
16.3.1 通用的体系结构 419
16.3.2 块高速缓存 420
16.3.3 失效后的恢复 422
16.4 文件级高速缓存 424
16.4.1 Andrew文件系统 424
16.4.2 LOCUS文件系统 425
16.5.1 文件名字 427
16.5 目录系统及其实现 427
16.5.2 打开一个文件 428
16.6 小结 429
16.7 习题 430
第17章 分布式计算 431
17.1 分布式操作系统机制 431
17.2 分布式主存 433
示例:Linda程序设计语言 435
17.2.1 远程存储器 435
17.2.2 分布式共享存储器 436
17.3 远程过程调用 438
17.3.1 RPC如何工作 438
17.3.2 实现RPC 440
17.4 远程对象 442
17.4.1 Emerald系统 442
17.4.2 CORBA 443
17.5 分布式进程管理 444
17.4.3 Java远程对象 444
17.5.1 通用的进程管理 445
17.5.2 进程和线程创建 445
17.5.3 调度 446
17.5.4 迁移和负载平衡 446
17.5.5 分布式同步 447
17.6 小结 450
17.7 习题 451
实验17.1:使用远程过程调用 452
第18章 分布式程序设计运行时系统 459
18.1 用中间件来支持分布式软件 459
18.2 传统的分布式应用程序 459
18.3 经典分布式程序设计的中间件支持 461
18.3.1 PVM 461
18.3.2 Beowulf集群计算环境 462
18.3.3 OSF分布式计算环境 463
18.4 Web上的分布式程序设计 468
18.5 移动代码的中间件支持 469
18.5.1 Java和Java虚拟机 469
18.5.2 ECMA-335通用语言基础设施 473
18.6 小结 477
18.7 习题 477
第19章 设计策略 479
19.1 设计考虑 479
19.1.1 性能 479
19.1.2 可信软件 480
19.1.3 模块化 480
19.1.4 可移植性 482
19.2 单一内核 483
示例:MS-DOS 483
示例:UNIX内核 483
示例:Choices——面向对象的操作系统 484
19.3 模块化组织结构 484
19.4 可扩展内核或微内核组织结构 486
示例:Mach操作系统 486
19.5 分层的组织结构 491
19.6 用于分布式系统的操作系统 492
19.6.1 网络操作系统 492
示例:BSD UNIX 493
19.6.2 分布式操作系统 493
示例:CHORUS操作系统 494
19.7 小结 496
19.8 习题 497
第20章 Linux内核 499
20.1 Linux内核 499
20.2 内核组织结构 499
20.2.1 使用内核服务 499
20.3 模块和设备管理 501
20.2.4 机器中的控制流 501
20.2.3 启动内核 501
20.2.2 守护进程 501
20.3.1 模块组织 502
20.3.2 模块的安装和移除 502
20.4 进程和资源管理 503
20.4.1 运行进程管理器 504
20.4.2 创建一个新任务 504
20.4.3 IPC和同步 505
20.4.4 调度程序 506
20.5 存储管理器 506
20.5.1 虚拟地址空间 507
20.5.2 缺页处理程序 509
20.6 文件管理 509
20.7 小结 511
第21章 Windows NT/2000/XP内核 513
21.1 概述 513
21.2.2 线程 514
21.2 NT内核 514
21.2.1 对象 514
21.2.3 多处理机同步 515
21.2.4 自陷、中断和异常 515
21.3 NT执行体 516
21.3.1 对象管理器 516
21.3.2 进程和线程管理器 517
21.3.3 虚拟存储管理器 518
21.3.4 I/O管理器 518
21.3.5 高速缓存管理器 520
21.4 内核本地过程调用和IPC 521
21.5 子系统 522
21.6 小结 523
术语表 525
参考文献 549