第1章 引论 1
1.1什么是操作系统 2
1.1.1作为扩展机器的操作系统 2
1.1.2作为资源管理者的操作系统 3
1.2操作系统的历史 4
1.2.1第一代(1945~1955):真空管和穿孔卡片 4
1.2.2第二代(1955~1965):晶体管和批处理系统 4
1.2.3第三代(1965~1980):集成电路和多道程序设计 6
1.2.4第四代( 1980年至今):个人计算机 8
1.2.5第五代(1990年至今):移动计算机 10
1.3计算机硬件简介 11
1.3.1处理器 12
1.3.2存储器 14
1.3.3磁盘 15
1.3.4 I/O设备 16
1.3.5总线 18
1.3.6启动计算机 19
1.4操作系统大观园 20
1.4.1大型机操作系统 20
1.4.2服务器操作系统 20
1.4.3多处理器操作系统 20
1.4.4个人计算机操作系统 20
1.4.5掌上计算机操作系统 21
1.4.6嵌入式操作系统 21
1.4.7传感器节点操作系统 21
1.4.8实时操作系统 21
1.4.9智能卡操作系统 21
1.5操作系统概念 22
1.5.1进程 22
1.5.2地址空间 23
1.5.3文件 23
1.5.4输入/输出 25
1.5.5保护 25
1.5.6 shell 25
1.5.7个体重复系统发育 26
1.6系统调用 28
1.6.1用于进程管理的系统调用 31
1.6.2用于文件管理的系统调用 32
1.6.3用于目录管理的系统调用 32
1.6.4各种系统调用 34
1.6.5 Windows Win32 API 34
1.7操作系统结构 35
1.7.1单体系统 36
1.7.2层次式系统 36
1.7.3微内核 37
1.7.4客户端-服务器模式 38
1.7.5虚拟机 39
1.7.6外核 41
1.8依靠C的世界 41
1.8.1 C语言 41
1.8.2头文件 41
1.8.3大型编程项目 43
1.8.4运行模型 43
1.9有关操作系统的研究 44
1.10本书其他部分概要 45
1.11公制单位 45
1.12小结 46
习题 46
第2章 进程与线程 48
2.1进程 48
2.1.1进程模型 48
2.1.2进程的创建 49
2.1.3进程的终止 51
2.1.4进程的层次结构 51
2.1.5进程的状态 51
2.1.6进程的实现 53
2.1.7多道程序设计模型 54
2.2线程 54
2.2.1线程的使用 54
2.2.2经典的线程模型 57
2.2.3 POSIX线程 60
2.2.4在用户空间中实现线程 60
2.2.5在内核中实现线程 63
2.2.6混合实现 63
2.2.7调度程序激活机制 64
2.2.8弹出式线程 64
2.2.9使单线程代码多线程化 65
2.3进程间通信 67
2.3.1竞争条件 67
2.3.2临界区 68
2.3.3忙等待的互斥 68
2.3.4睡眠与唤醒 71
2.3.5信号量 73
2.3.6互斥量 74
2.3.7管程 78
2.3.8消息传递 81
2.3.9屏障 82
2.3.10避免锁:读-复制-更新 83
2.4调度 84
2.4.1调度简介 84
2.4.2批处理系统中的调度 88
2.4.3交互式系统中的调度 89
2.4.4实时系统中的调度 92
2.4.5策略和机制 93
2.4.6线程调度 93
2.5经典的IPC问题 94
2.5.1哲学家就餐问题 94
2.5.2读者-写者问题 96
2.6有关进程与线程的研究 97
2.7小结 97
习题 98
第3章 内存管理 102
3.1无存储器抽象 102
3.2一种存储器抽象:地址空间 104
3.2.1地址空间的概念 104
3.2.2交换技术 106
3.2.3空闲内存管理 107
3.3虚拟内存 109
3.3.1分页 110
3.3.2页表 112
3.3.3加速分页过程 112
3.3.4针对大内存的页表 114
3.4页面置换算法 117
3.4.1最优页面置换算法 117
3.4.2最近未使用页面置换算法 118
3.4.3先进先出页面置换算法 118
3.4.4第二次机会页面置换算法 118
3.4.5时钟页面置换算法 119
3.4.6最近最少使用页面置换算法 119
3.4.7用软件模拟LRU 120
3.4.8工作集页面置换算法 121
3.4.9工作集时钟页面置换算法 123
3.4.10页面置换算法小结 124
3.5分页系统中的设计问题 124
3.5.1局部分配策略与全局分配策略 124
3.5.2负载控制 126
3.5.3页面大小 126
3.5.4分离的指令空间和数据空间 127
3.5.5共享页面 128
3.5.6共享库 128
3.5.7内存映射文件 130
3.5.8清除策略 130
3.5.9虚拟内存接口 130
3.6有关实现的问题 131
3.6.1与分页有关的工作 131
3.6.2缺页中断处理 131
3.6.3指令备份 132
3.6.4锁定内存中的页面 132
3.6.5后备存储 133
3.6.6策略和机制的分离 134
3.7分段 134
3.7.1纯分段的实现 136
3.7.2分段和分页结合:MULTICS 136
3.7.3分段和分页结合:Intel x86 138
3.8有关内存管理的研究 141
3.9小结 141
习题 142
第4章 文件系统 147
4.1文件 148
4.1.1文件命名 148
4.1.2文件结构 149
4.1.3文件类型 149
4.1.4文件访问 151
4.1.5文件属性 151
4.1.6文件操作 152
4.1.7使用文件系统调用的一个示例程序 152
4.2目录 154
4.2.1一级目录系统 154
4.2.2层次目录系统 154
4.2.3路径名 154
4.2.4目录操作 156
4.3文件系统的实现 157
4.3.1文件系统布局 157
4.3.2文件的实现 157
4.3.3目录的实现 160
4.3.4共享文件 162
4.3.5日志结构文件系统 163
4.3.6日志文件系统 164
4.3.7虚拟文件系统 165
4.4文件系统管理和优化 167
4.4.1磁盘空间管理 167
4.4.2文件系统备份 171
4.4.3文件系统的一致性 174
4.4.4文件系统性能 176
4.4.5磁盘碎片整理 178
4.5文件系统实例 179
4.5.1 MS-DOS文件系统 179
4.5.2 UNIX V7文件系统 181
4.5.3 CD-ROM文件系统 182
4.6有关文件系统的研究 185
4.7小结 185
习题 186
第5章 输入/输出 189
5.1 I/O硬件原理 189
5.1.1 I/O设备 189
5.1.2设备控制器 190
5.1.3内存映射I/O 190
5.1.4直接存储器存取 192
5.1.5重温中断 194
5.2 I/O软件原理 196
5.2.1 I/O软件的目标 196
5.2.2程序控制I/O 197
5.2.3中断驱动I/O 198
5.2.4使用DMA的I/O 199
5.3 I/O软件层次 199
5.3.1中断处理程序 199
5.3.2设备驱动程序 200
5.3.3与设备无关的I/O软件 202
5.3.4用户空间的I/O软件 205
5.4盘 206
5.4.1盘的硬件 206
5.4.2磁盘格式化 211
5.4.3磁盘臂调度算法 213
5.4.4错误处理 215
5.4.5稳定存储器 216
5.5时钟 218
5.5.1时钟硬件 218
5.5.2时钟软件 219
5.5.3软定时器 221
5.6用户界面:键盘、鼠标和监视器 222
5.6.1输入软件 222
5.6.2输出软件 225
5.7瘦客户机 235
5.8电源管理 236
5.8.1硬件问题 236
5.8.2操作系统问题 237
5.8.3应用程序问题 241
5.9有关输入/输出的研究 241
5.10小结 242
习题 243
第6章 死锁 247
6.1资源 247
6.1.1可抢占资源和不可抢占资源 247
6.1.2资源获取 248
6.2死锁简介 249
6.2.1资源死锁的条件 249
6.2.2死锁建模 249
6.3鸵鸟算法 251
6.4死锁检测和死锁恢复 251
6.4.1每种类型一个资源的死锁检测 252
6.4.2每种类型多个资源的死锁检测 253
6.4.3从死锁中恢复 254
6.5死锁避免 255
6.5.1资源轨迹图 255
6.5.2安全状态和不安全状态 256
6.5.3单个资源的银行家算法 257
6.5.4多个资源的银行家算法 257
6.6死锁预防 258
6.6.1破坏互斥条件 258
6.6.2破坏占有并等待条件 259
6.6.3破坏不可抢占条件 259
6.6.4破坏环路等待条件 259
6.7其他问题 260
6.7.1两阶段加锁 260
6.7.2通信死锁 260
6.7.3活锁 261
6.7.4饥饿 262
6.8有关死锁的研究 262
6.9小结 263
习题 263
第7章 虚拟化和云 267
7.1历史 268
7.2虚拟化的必要条件 268
7.3第一类和第二类虚拟机管理程序 270
7.4高效虚拟化技术 271
7.4.1在不支持虚拟化的平台上实现虚拟化 271
7.4.2虚拟化的开销 273
7.5虚拟机管理程序是正确的微内核吗 273
7.6内存虚拟化 275
7.7 I/O虚拟化 277
7.8虚拟装置 279
7.9多核CPU上的虚拟机 279
7.10授权问题 279
7.11云 280
7.11.1云即服务 280
7.11.2虚拟机迁移 280
7.11.3检查点 281
7.12案例研究:VMware 281
7.12.1 VMware的早期历史 281
7.12.2 VMware Workstation 282
7.12.3将虚拟化引入x86的挑战 282
7.12.4 VMware Workstation解决方案概览 283
7.12.5 VMware Workstation的演变 288
7.12.6 VMware的第一类虚拟机管理程序ESX Server 288
7.13有关虚拟化和云的研究 289
习题 289
第8章 多处理机系统 291
8.1多处理机 292
8.1.1多处理机硬件 292
8.1.2多处理机操作系统类型 298
8.1.3多处理机同步 301
8.1.4多处理机调度 303
8.2多计算机 306
8.2.1多计算机硬件 307
8.2.2低层通信软件 309
8.2.3用户层通信软件 311
8.2.4远程过程调用 313
8.2.5分布式共享存储器 314
8.2.6多计算机调度 317
8.2.7负载平衡 318
8.3分布式系统 319
8.3.1网络硬件 321
8.3.2网络服务和协议 323
8.3.3基于文档的中间件 325
8.3.4基于文件系统的中间件 326
8.3.5基于对象的中间件 329
8.3.6基于协作的中间件 330
8.4有关多处理机系统的研究 332
8.5小结 332
习题 333
第9章 安全 336
9.1环境安全 337
9.1.1威胁 337
9.1.2入侵者 339
9.2操作系统完全 339
9.2.1可信系统 339
9.2.2可信计算基 340
9.3保护机制 341
9.3.1保护域 341
9.3.2访问控制列表 342
9.3.3权能字 344
9.4安全系统的形式化模型 345
9.4.1多级安全 346
9.4.2隐蔽信道 348
9.5密码学原理 350
9.5.1私钥加密技术 351
9.5.2公钥加密技术 351
9.5.3单向函数 352
9.5.4数字签名 352
9.5.5可信平台模块 353
9.6认证 354
9.6.1使用物理识别的认证方式 358
9.6.2使用生物识别的认证方式 360
9.7软件漏洞 361
9.7.1缓冲区溢出攻击 361
9.7.2格式化字符串攻击 367
9.7.3悬垂指针 369
9.7.4空指针间接引用攻击 369
9.7.5整数溢出攻击 370
9.7.6命令注入攻击 370
9.7.7检查时间/使用时间攻击 371
9.8内部攻击 371
9.8.1逻辑炸弹 371
9.8.2后门陷阱 372
9.8.3登录欺骗 372
9.9恶意软件 373
9.9.1特洛伊木马 374
9.9.2病毒 375
9.9.3蠕虫 381
9.9.4间谍软件 382
9.9.5 rootkit 384
9.10防御 386
9.10.1防火墙 387
9.10.2反病毒和抑制反病毒技术 388
9.10.3代码签名 392
9.10.4囚禁 392
9.10.5基于模型的入侵检测 393
9.10.6封装移动代码 394
9.10.7 Java安全性 396
9.11有关安全的研究 397
9.12小结 398
习题 398
第10章 实例研究1:UNIX、Linux和Android 403
10.1 UNIX与Linux的历史 403
10.1.1 UNICS 403
10.1.2 PDP-11 UNIX 404
10.1.3可移植的UNIX 404
10.1.4 Berkeley UNIX 405
10.1.5标准UNIX 405
10.1.6 MINIX 406
10.1.7 Linux 407
10.2 Linux简介 408
10.2.1 Linux的设计目标 408
10.2.2到Linux的接口 409
10.2.3 shell 410
10.2.4 Linux应用程序 412
10.2.5内核结构 413
10.3 Linux中的进程 414
10.3.1基本概念 414
10.3.2 Linux中进程管理相关的系统调用 416
10.3.3 Linux中进程与线程的实现 418
10.3.4 Linux中的调度 422
10.3.5启动Linux系统 425
10.4 Linux中的内存管理 426
10.4.1基本概念 427
10.4.2 Linux中的内存管理系统调用 429
10.4.3 Linux中内存管理的实现 429
10.4.4 Linux中的分页 433
10.5 Linux中的I/O系统 434
10.5.1基本概念 434
10.5.2网络 435
10.5.3 Linux中的I/O系统调用 436
10.5.4 I/O在Linux中的实现 437
10.5.5 Linux中的模块 439
10.6 Linux文件系统 439
10.6.1基本概念 439
10.6.2 Linux中的文件系统调用 442
10.6.3 Linux文件系统的实现 444
10.6.4 NFS:网络文件系统 449
10.7 Linux的安全性 452
10.7.1基本概念 452
10.7.2 Linux中安全相关的系统调用 454
10.7.3 Linux中的安全实现 454
10.8 Android 455
10.8.1 Android与Google 455
10.8.2 Android的历史 455
10.8.3设计目标 457
10.8.4 Android体系结构 458
10.8.5 Linux扩展 459
10.8.6 Dalvik 461
10.8.7 Binder IPC 462
10.8.8 Android应用 467
10.8.9意图 475
10.8.10应用程序沙箱 475
10.8.11安全性 476
10.8.12进程模型 479
10.9小结 482
习题 483
第11章 实例研究2: Windows 8 487
11.1 Windows 8.1的历史 487
11.1.1 20世纪80年代:MS-DOS 487
11.1.2 20世纪90年代:基于MS-DOS的Windows 488
11.1.3 21世纪00年代:基于NT的Windows 488
11.1.4 Windows Vista 489
11.1.5 21世纪10年代:现代Windows 490
11.2 Windows编程 490
11.2.1原生NT应用编程接口 493
11.2.2 Win32应用编程接口 494
11.2.3 Windows注册表 496
11.3系统结构 498
11.3.1操作系统结构 498
11.3.2启动Windows 506
11.3.3对象管理器的实现 507
11.3.4子系统、DLL和用户态服务 513
11.4 Windows中的进程和线程 514
11.4.1基本概念 514
11.4.2作业、进程、线程和纤程管理API调用 518
11.4.3进程和线程的实现 521
11.5内存管理 525
11.5.1基本概念 525
11.5.2内存管理系统调用 527
11.5.3存储管理的实现 528
11.6 Windows的高速缓存 533
11.7 Windows的I/O 534
11.7.1基本概念 534
11.7.2 I/O的API调用 535
11.7.3 I/O实现 536
11.8 Windows NT文件系统 539
11.8.1基本概念 540
11.8.2 NTFS文件系统的实现 540
11.9 Windows电源管理 546
11.10 Windows 8中的安全 547
11.10.1基本概念 548
11.10.2安全相关的API调用 548
11.10.3安全实现 549
11.10.4安全缓解技术 551
11.11小结 552
习题 553
第12章 操作系统设计 556
12.1设计问题的本质 556
12.1.1目标 556
12.1.2设计操作系统为什么困难 557
12.2接口设计 558
12.2.1指导原则 558
12.2.2范型 559
12.2.3系统调用接口 561
12.3实现 563
12.3.1系统结构 563
12.3.2机制与策略 565
12.3.3正交性 566
12.3.4命名 566
12.3.5绑定的时机 567
12.3.6静态与动态结构 567
12.3.7自顶向下与自底向上的实现 568
12.3.8同步通信与异步通信 568
12.3.9实用技术 569
12.4性能 572
12.4.1操作系统为什么运行缓慢 572
12.4.2什么应该优化 573
12.4.3空间-时间的权衡 573
12.4.4缓存 575
12.4.5线索 575
12.4.6利用局部性 576
12.4.7优化常见的情况 576
12.5项目管理 576
12.5.1人月神话 576
12.5.2团队结构 577
12.5.3经验的作用 578
12.5.4没有银弹 579
12.6操作系统设计的趋势 579
12.6.1虚拟化与云 579
12.6.2众核芯片 580
12.6.3大型地址空间操作系统 580
12.6.4无缝的数据访问 580
12.6.5电池供电的计算机 581
12.6.6嵌入式系统 581
12.7小结 581
习题 582
第13章 参考书目与文献 584
13.1进行深入阅读的建议 584
13.1.1引论 584
13.1.2进程与线程 584
13.1.3内存管理 585
13.1.4文件系统 585
13.1.5输入/输出 585
13.1.6死锁 586
13.1.7虚拟化和云 586
13.1.8多处理机系统 586
13.1.9安全 587
13.1.10实例研究1: UNIX、Linux和Android 588
13.1.11实例研究2: Windows 8 588
13.1.12操作系统设计 589
13.2按字母顺序排序的参考文献 589