第一部分 概论 2
第1章 导论 2
1.1 操作系统的功能 2
1.1.1 用户视角 2
1.1.2 系统视角 3
1.1.3 操作系统的定义 4
1.2 计算机系统的组成 4
1.2.1 计算机系统的运行 5
1.2.2 存储结构 6
1.2.3 I/O结构 8
1.3 计算机系统的体系结构 9
1.3.1 单处理器系统 9
1.3.2 多处理器系统 10
1.3.3 集群系统 12
1.4 操作系统的结构 13
1.5 操作系统的执行 14
1.5.1 双重模式与多重模式的执行 15
1.5.2 定时器 16
1.6 进程管理 17
1.7 内存管理 17
1.8 存储管理 18
1.8.1 文件系统管理 18
1.8.2 大容量存储器管理 19
1.8.3 高速缓存 19
1.8.4 I/O系统 21
1.9 保护与安全 21
1.10 内核数据结构 22
1.10.1 列表、堆栈及队列 22
1.10.2 树 23
1.10.3 哈希函数与哈希表 23
1.10.4 位图 24
1.11 计算环境 24
1.11.1 传统计算 24
1.11.2 移动计算 25
1.11.3 分布计算 26
1.11.4 客户机-服务器计算 26
1.11.5 对等计算 27
1.11.6 虚拟化 28
1.11.7 云计算 29
1.11.8 实时嵌入式系统 29
1.12 开源操作系统 30
1.12.1 历史 31
1.12.2 Linux 31
1.12.3 BSD UNIX 32
1.12.4 Solaris 32
1.12.5 用作学习的开源操作系统 33
1.13 小结 33
复习题 35
实践题 35
习题 35
推荐读物 36
参考文献 37
第2章 操作系统结构 38
2.1 操作系统的服务 38
2.2 用户与操作系统的界面 40
2.2.1 命令解释程序 40
2.2.2 图形用户界面 41
2.2.3 界面的选择 42
2.3 系统调用 43
2.4 系统调用的类型 46
2.4.1 进程控制 46
2.4.2 文件管理 49
2.4.3 设备管理 50
2.4.4 信息维护 50
2.4.5 通信 50
2.4.6 保护 51
2.5 系统程序 51
2.6 操作系统的设计与实现 52
2.6.1 设计目标 52
2.6.2 机制与策略 53
2.6.3 实现 53
2.7 操作系统的结构 54
2.7.1 简单结构 54
2.7.2 分层方法 55
2.7.3 微内核 56
2.7.4 模块 57
2.7.5 混合系统 58
2.8 操作系统的调试 60
2.8.1 故障分析 60
2.8.2 性能优化 60
2.8.3 DTrace 61
2.9 操作系统的生成 63
2.10 系统引导 64
2.11 小结 64
复习题 65
实践题 65
习题 65
编程题 66
编程项目 66
推荐读物 69
参考文献 70
第二部分 进程管理 72
第3章 进程 72
3.1 进程概念 72
3.1.1 进程 72
3.1.2 进程状态 73
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 进程终止 82
3.4 进程间通信 83
3.4.1 共享内存系统 85
3.4.2 消息传递系统 86
3.5 IPC系统例子 89
3.5.1 例子:POSIX共享内存 89
3.5.2 例子:Mach 91
3.5.3 例子:Windows 92
3.6 客户机/服务器通信 93
3.6.1 套接字 93
3.6.2 远程过程调用 96
3.6.3 管道 98
3.7 小结 102
复习题 103
实践题 103
习题 104
编程题 105
编程项目 107
推荐读物 110
参考文献 111
第4章 线程 112
4.1 概述 112
4.1.1 动机 112
4.1.2 优点 113
4.2 多核编程 114
4.2.1 编程挑战 115
4.2.2 并行类型 115
4.3 多线程模型 116
4.3.1 多对一模型 116
4.3.2 一对一模型 116
4.3.3 多对多模型 116
4.4 线程库 117
4.4.1 Pthreads 118
4.4.2 Windows线程 119
4.4.3 Java线程 121
4.5 隐式多线程 122
4.5.1 线程池 123
4.5.2 OpenMP 124
4.5.3 大中央调度 125
4.5.4 其他方法 125
4.6 多线程问题 125
4.6.1 系统调用fork()和exec() 125
4.6.2 信号处理 126
4.6.3 线程撤销 127
4.6.4 线程本地存储 128
4.6.5 调度程序激活 128
4.7 操作系统例子 129
4.7.1 Windows线程 129
4.7.2 Linux线程 130
4.8 小结 131
复习题 131
实践题 131
习题 131
编程题 133
编程项目 135
推荐读物 136
参考文献 136
第5章 进程同步 138
5.1 背景 138
5.2 临界区问题 140
5.3 Peterson解决方案 141
5.4 硬件同步 142
5.5 互斥锁 144
5.6 信号量 144
5.6.1 信号量的使用 145
5.6.2 信号量的实现 145
5.6.3 死锁与饥饿 147
5.6.4 优先级的反转 147
5.7 经典同步问题 148
5.7.1 有界缓冲问题 148
5.7.2 读者-作者问题 149
5.7.3 哲学家就餐问题 150
5.8 管程 151
5.8.1 使用方法 152
5.8.2 哲学家就餐问题的管程解决方案 153
5.8.3 采用信号量的管程实现 154
5.8.4 管程内的进程重启 155
5.9 同步例子 156
5.9.1 Windows同步 156
5.9.2 Linux同步 157
5.9.3 Solaris同步 158
5.9.4 Pthreads同步 159
5.10 替代方法 160
5.10.1 事务内存 161
5.10.2 OpenMP 162
5.10.3 函数式编程语言 162
5.11 死锁 163
5.11.1 系统模型 163
5.11.2 死锁特征 164
5.11.3 死锁处理方法 167
5.12 小结 168
复习题 168
实践题 168
习题 169
编程题 172
编程项目 174
推荐读物 178
参考文献 178
第6章 CPU调度 180
6.1 基本概念 180
6.1.1 CPU-I/O执行周期 180
6.1.2 CPU调度程序 181
6.1.3 抢占调度 181
6.1.4 调度程序 182
6.2 调度准则 182
6.3 调度算法 183
6.3.1 先到先服务调度 183
6.3.2 最短作业优先调度 184
6.3.3 优先级调度 186
6.3.4 轮转调度 187
6.3.5 多级队列调度 189
6.3.6 多级反馈队列调度 190
6.4 线程调度 191
6.4.1 竞争范围 191
6.4.2 Pthreads调度 191
6.5 多处理器调度 193
6.5.1 多处理器调度的方法 193
6.5.2 处理器亲和性 193
6.5.3 负载平衡 194
6.5.4 多核处理器 194
6.6 实时CPU调度 196
6.6.1 最小化延迟 196
6.6.2 优先级调度 197
6.6.3 单调速率调度 198
6.6.4 最早截止期限优先调度 199
6.6.5 比例分享调度 200
6.6.6 POSIX实时调度 200
6.7 操作系统例子 202
6.7.1 例子:Linux调度 202
6.7.2 例子:Windows调度 204
6.7.3 例子:Solaris调度 206
6.8 算法评估 207
6.8.1 确定性模型 208
6.8.2 排队模型 209
6.8.3 仿真 209
6.8.4 实现 210
6.9 小结 211
复习题 212
实践题 212
习题 213
推荐读物 215
参考文献 216
第三部分 内存管理 220
第7章 内存 220
7.1 背景 220
7.1.1 基本硬件 220
7.1.2 地址绑定 222
7.1.3 逻辑地址空间与物理地址空间 222
7.1.4 动态加载 223
7.1.5 动态链接与共享库 224
7.2 交换 224
7.2.1 标准交换 224
7.2.2 移动系统的交换 225
7.3 连续内存分配 226
7.3.1 内存保护 226
7.3.2 内存分配 227
7.3.3 碎片 228
7.4 分段 228
7.4.1 基本方法 229
7.4.2 分段硬件 229
7.5 分页 230
7.5.1 基本方法 231
7.5.2 硬件支持 233
7.5.3 保护 236
7.5.4 共享页 237
7.6 页表结构 238
7.6.1 分层分页 238
7.6.2 哈希页表 240
7.6.3 倒置页表 240
7.6.4 Oracle SPARC Solaris 241
7.7 例子:Intel 32位与64位体系结构 242
7.7.1 IA-32架构 242
7.7.2 x86-64 244
7.8 例子:ARM架构 245
7.9 小结 245
复习题 246
实践题 246
习题 247
编程题 249
推荐读物 249
参考文献 250
第8章 虚拟内存 251
8.1 背景 251
8.2 请求调页 253
8.2.1 基本概念 253
8.2.2 请求调页的性能 256
8.3 写时复制 258
8.4 页面置换 259
8.4.1 基本页面置换 260
8.4.2 FIFO页面置换 262
8.4.3 最优页面置换 263
8.4.4 LRU页面置换 263
8.4.5 近似LRU页面置换 265
8.4.6 基于计数的页面置换 266
8.4.7 页面缓冲算法 267
8.4.8 应用程序与页面置换 267
8.5 帧分配 267
8.5.1 帧的最小数 268
8.5.2 分配算法 269
8.5.3 全局分配与局部分配 269
8.5.4 非均匀内存访问 270
8.6 系统抖动 270
8.6.1 系统抖动的原因 271
8.6.2 工作集模型 272
8.6.3 缺页错误频率 273
8.6.4 结束语 274
8.7 内存映射文件 274
8.7.1 基本机制 274
8.7.2 共享内存WindowsAPI 275
8.7.3 内存映射I/O 277
8.8 分配内核内存 278
8.8.1 伙伴系统 278
8.8.2 slab分配 279
8.9 其他注意事项 280
8.9.1 预调页面 280
8.9.2 页面大小 280
8.9.3 TLB范围 281
8.9.4 倒置页表 282
8.9.5 程序结构 282
8.9.6 I/O联锁与页面锁定 283
8.10 操作系统例子 284
8.10.1 Windows 284
8.10.2 Solaris 285
8.11 小结 286
复习题 286
实践题 287
习题 288
编程题 292
编程项目 292
推荐读物 294
参考文献 295
第四部分 存储管理 298
第9章 大容量存储结构 298
9.1 大容量存储结构概述 298
9.1.1 硬盘 298
9.1.2 固态磁盘 299
9.1.3 磁带 299
9.2 磁盘结构 300
9.3 磁盘连接 300
9.3.1 主机连接存储 300
9.3.2 网络连接存储 301
9.3.3 存储区域网络 301
9.4 磁盘调度 302
9.4.1 FCFS调度 302
9.4.2 SSTF调度 302
9.4.3 SCAN调度 303
9.4.4 C-SCAN调度 304
9.4.5 LOOK调度 304
9.4.6 磁盘调度算法的选择 304
9.5 磁盘管理 305
9.5.1 磁盘格式化 305
9.5.2 引导块 306
9.5.3 坏块 307
9.6 交换空间管理 308
9.6.1 交换空间的使用 308
9.6.2 交换空间位置 308
9.6.3 交换空间管理例子 309
9.7 RAID结构 309
9.7.1 通过冗余提高可靠性 310
9.7.2 通过并行处理提高性能 311
9.7.3 RAID级别 311
9.7.4 RAID级别的选择 314
9.7.5 扩展 315
9.7.6 RAID的问题 315
9.8 稳定存储实现 316
9.9 小结 317
复习题 318
实践题 318
习题 318
编程题 320
推荐读物 320
参考文献 321
第10章 文件系统接口 322
10.1 文件概念 322
10.1.1 文件属性 322
10.1.2 文件操作 323
10.1.3 文件类型 327
10.1.4 文件结构 328
10.1.5 内部文件结构 328
10.2 访问方法 328
10.2.1 顺序访问 329
10.2.2 直接访问 329
10.2.3 其他访问方法 330
10.3 目录与磁盘的结构 331
10.3.1 存储结构 331
10.3.2 目录概述 332
10.3.3 单级目录 332
10.3.4 两级目录 333
10.3.5 树形目录 334
10.3.6 无环图目录 335
10.3.7 通用图目录 337
10.4 文件系统安装 338
10.5 文件共享 339
10.5.1 多用户 339
10.5.2 远程文件系统 340
10.5.3 一致性语义 342
10.6 保护 343
10.6.1 访问类型 343
10.6.2 访问控制 343
10.6.3 其他保护方式 345
10.7 小结 346
复习题 346
实践题 346
习题 347
推荐读物 348
参考文献 348
第11章 文件系统实现 349
11.1 文件系统结构 349
11.2 文件系统实现 350
11.2.1 概述 351
11.2.2 分区与安装 353
11.2.3 虚拟文件系统 353
11.3 目录实现 355
11.3.1 线性列表 355
11.3.2 哈希表 355
11.4 分配方法 356
11.4.1 连续分配 356
11.4.2 链接分配 357
11.4.3 索引分配 359
11.4.4 性能 360
11.5 空闲空间管理 361
11.5.1 位向量 361
11.5.2 链表 362
11.5.3 组 362
11.5.4 计数 362
11.5.5 空间图 363
11.6 效率与性能 363
11.6.1 效率 363
11.6.2 性能 364
11.7 恢复 366
11.7.1 一致性检查 366
11.7.2 基于日志的文件系统 366
11.7.3 其他解决方法 367
11.7.4 备份和恢复 368
11.8 NFS 368
11.8.1 概述 369
11.8.2 安装协议 370
11.8.3 NFS协议 370
11.8.4 路径名称转换 371
11.8.5 远程操作 372
11.9 例子:WAFL文件系统 372
11.10 小结 374
复习题 375
实践题 375
习题 375
编程题 376
推荐读物 377
参考文献 378
第12章 I/O系统 379
12.1 概述 379
12.2 I/O硬件 379
12.2.1 轮询 381
12.2.2 中断 382
12.2.3 直接内存访问 385
12.2.4 I/O硬件小结 386
12.3 应用程序I/O接口 386
12.3.1 块与字符设备 388
12.3.2 网络设备 389
12.3.3 时钟与定时器 389
12.3.4 非阻塞与异步I/O 390
12.3.5 向量I/O 391
12.4 内核I/O子系统 391
12.4.1 I/O调度 391
12.4.2 缓冲 392
12.4.3 缓存 393
12.4.4 假脱机与设备预留 394
12.4.5 错误处理 394
12.4.6 I/O保护 394
12.4.7 内核数据结构 395
12.4.8 电源管理 396
12.4.9 内核I/O子系统小结 397
12.5 I/O请求转成硬件操作 397
12.6 流 399
12.7 性能 400
12.8 小结 402
复习题 403
实践题 403
习题 403
推荐读物 404
参考文献 404
第五部分 保护与安全 406
第13章 保护 406
13.1 保护目标 406
13.2 保护原则 407
13.3 保护域 407
13.3.1 域结构 408
13.3.2 例子:UNIX 409
13.3.3 例子:MULTICS 410
13.4 访问矩阵 411
13.5 访问矩阵的实现 413
13.5.1 全局表 413
13.5.2 对象的访问列表 413
13.5.3 域的能力列表 414
13.5.4 锁-钥匙机制 414
13.5.5 比较 414
13.6 访问控制 415
13.7 访问权限的撤回 416
13.8 基于能力的系统 417
13.8.1 例子:Hydra 417
13.8.2 例子:剑桥CAP系统 418
13.9 基于语言的保护 418
13.9.1 基于编译程序的实现 419
13.9.2 Java的保护 420
13.10 小结 422
复习题 422
实践题 422
习题 423
推荐读物 423
参考文献 424
第14章 安全 427
14.1 安全问题 427
14.2 程序威胁 429
14.2.1 特洛伊木马 429
14.2.2 后门 430
14.2.3 逻辑炸弹 431
14.2.4 堆栈和缓冲区溢出 431
14.2.5 病毒 433
14.3 系统和网络的威胁 435
14.3.1 蠕虫 436
14.3.2 端口扫描 438
14.3.3 拒绝服务 439
14.4 作为安全工具的密码术 439
14.4.1 加密 440
14.4.2 密码术的实现 445
14.4.3 例子:SSL 445
14.5 用户认证 447
14.5.1 密码 447
14.5.2 密码漏洞 447
14.5.3 密码安全 448
14.5.4 一次性密码 449
14.5.5 生物识别技术 449
14.6 实现安全防御 450
14.6.1 安全策略 450
14.6.2 漏洞评估 450
14.6.3 入侵检测 451
14.6.4 病毒防护 453
14.6.5 审计、记账和日志 455
14.7 保护系统和网络的防火墙 455
14.8 计算机安全等级 456
14.9 例子:Windows 7 457
14.10 小结 459
复习题 459
习题 459
推荐读物 460
参考文献 461
第六部分 案例研究 466
第15章 Linux系统 466
15.1 Linux历史 466
15.1.1 Linux内核 467
15.1.2 Linux系统 468
15.1.3 Linux发行 468
15.1.4 Linux许可 469
15.2 设计原则 469
15.3 内核模块 471
15.3.1 模块管理 472
15.3.2 驱动程序注册 473
15.3.3 冲突解决 473
15.4 进程管理 473
15.4.1 fork()/exec()进程模型 474
15.4.2 进程与线程 475
15.5 调度 476
15.5.1 进程调度 476
15.5.2 实时调度 477
15.5.3 内核同步 478
15.5.4 对称多处理 479
15.6 内存管理 480
15.6.1 物理内存管理 480
15.6.2 虚拟内存 482
15.6.3 执行与加载用户程序 484
15.7 文件系统 486
15.7.1 虚拟文件系统 486
15.7.2 Linux ext3文件系统 487
15.7.3 日志 489
15.7.4 Linux进程文件系统 489
15.8 输入与输出 490
15.8.1 块设备 491
15.8.2 字符设备 492
15.9 进程间通信 492
15.9.1 同步与信号 492
15.9.2 进程间的数据传递 493
15.10 网络结构 493
15.11 安全 495
15.11.1 认证 495
15.11.2 访问控制 495
15.12 小结 496
复习题 497
实践题 497
习题 497
推荐读物 498
参考文献 499