现代操作系统(原书第5版) / 计算机科学丛书
定价:¥149.00
作者: [荷]安德鲁·S. 塔嫩鲍姆(Andrew S. Tanenbaum) [荷]赫伯特·博斯(Herbert Bos)
出版时间:2025-07-22
出版社:机械工业出版社
- 机械工业出版社
- 9787111776895
- 1-1
- 2025-07-22
- 1283
内容简介
本书是操作系统领域的经典教材,涵盖操作系统设计师需要掌握的所有核心概念,并深入探讨了进程与线程、内存管理、文件系统、输入/输出、死锁、虚拟化和云、多处理机系统、操作系统设计等主题。案例研究部分详细分析了Windows、Android和Linux等流行的操作系统。第5版对知识点做了与时俱进的更新,更加关注现代存储方案、新的安全防御方法等,同时优化篇章结构,全面反映了当代操作系统的技术动向与发展趋势。本书适合作为高等院校计算机专业的操作系统课程教材,也适合相关技术人员参考。
目录
目 录
译者序
前言
作者简介
第1章 引论1
1.1 什么是操作系统2
1.1.1 作为扩展机器的操作系统3
1.1.2 作为资源管理器的操作系统4
1.2 操作系统的历史5
1.2.1 第一代计算机(1945~
1955年):真空管和穿
孔卡片5
1.2.2 第二代计算机(1955~
1965年):晶体管和批
处理系统5
1.2.3 第三代计算机(1965~
1980年):集成电路芯
片和多道程序设计7
1.2.4 第四代计算机(1980年
至今):个人计算机11
1.2.5 第五代计算机(1990年
至今):移动计算机13
1.3 计算机硬件简介14
1.3.1 处理器15
1.3.2 存储器17
1.3.3 非易失性存储器20
1.3.4 I/O设备21
1.3.5 总线23
1.3.6 启动计算机 24
1.4 操作系统大观园25
1.4.1 大型机操作系统25
1.4.2 服务器操作系统26
1.4.3 个人计算机操作系统26
1.4.4 智能手机和掌上计算机操作
系统26
1.4.5 物联网和嵌入式操作系统26
1.4.6 实时操作系统27
1.4.7 智能卡操作系统27
1.5 操作系统概念28
1.5.1 进程28
1.5.2 地址空间29
1.5.3 文件30
1.5.4 输入/输出32
1.5.5 保护32
1.5.6 shell32
1.5.7 个体重复系统发育33
1.6 系统调用35
1.6.1 用于进程管理的系统调用38
1.6.2 用于文件管理的系统调用40
1.6.3 用于目录管理的系统调用41
1.6.4 各种系统调用42
1.6.5 Windows API43
1.7 操作系统结构45
1.7.1 单体系统45
1.7.2 层次式系统46
1.7.3 微内核46
1.7.4 客户端-服务器模式48
1.7.5 虚拟机49
1.7.6 外核和unikernel52
1.8 依靠C的世界52
1.8.1 C语言53
1.8.2 头文件53
1.8.3 大型编程项目54
1.8.4 运行模型55
1.9 有关操作系统的研究55
1.10 本书其他部分概要56
1.11 公制单位56
1.12 小结57
习题57
第2章 进程与线程60
2.1 进程60
2.1.1 进程模型60
2.1.2 进程的创建62
2.1.3 进程的终止63
2.1.4 进程的层次结构64
2.1.5 进程的状态65
2.1.6 进程的实现66
2.1.7 多道程序设计模型67
2.2 线程68
2.2.1 线程的使用68
2.2.2 经典的线程模型71
2.2.3 POSIX线程74
2.2.4 在用户空间中实现线程75
2.2.5 在内核中实现线程78
2.2.6 混合实现79
2.2.7 使单线程代码多线程化79
2.3 事件驱动服务器82
2.4 同步和进程间通信84
2.4.1 竞争条件84
2.4.2 临界区85
2.4.3 忙等待的互斥86
2.4.4 睡眠与唤醒90
2.4.5 信号量92
2.4.6 互斥量95
2.4.7 管程98
2.4.8 消息传递103
2.4.9 屏障105
2.4.10 优先级反转106
2.4.11 避免锁:读-复制-更新107
2.5 调度108
2.5.1 调度简介108
2.5.2 批处理系统中的调度113
2.5.3 交互式系统中的调度114
2.5.4 实时系统中的调度118
2.5.5 策略和机制119
2.5.6 线程调度119
2.6 有关进程与线程的研究121
2.7 小结121
习题122
第3章 内存管理127
3.1 无内存抽象127
3.2 一种内存抽象:地址空间130
3.2.1 地址空间的概念130
3.2.2 交换技术132
3.2.3 空闲内存管理134
3.3 虚拟内存136
3.3.1 分页137
3.3.2 页表139
3.3.3 加速分页过程142
3.3.4 针对大内存的页表144
3.4 页面置换算法147
3.4.1 最优页面置换算法148
3.4.2 最近未使用页面置换算法148
3.4.3 先进先出页面置换算法149
3.4.4 第二次机会页面置换算法149
3.4.5 时钟页面置换算法150
3.4.6 最近最少使用页面置换算法151
3.4.7 用软件模拟LRU151
3.4.8 工作集页面置换算法 152
3.4.9 工作集时钟页面置换算法155
3.4.10 页面置换算法小结157
3.5 分页系统中的设计问题157
3.5.1 局部分配策略与全局分配
策略158
3.5.2 负载控制159
3.5.3 清除策略160
3.5.4 页面大小161
3.5.5 分离的指令空间和数据空间162
3.5.6 共享页面163
3.5.7 共享库164
3.5.8 内存映射文件165
3.6 有关实现的问题166
3.6.1 与分页有关的操作系统工作166
3.6.2 缺页中断处理166
3.6.3 指令备份167
3.6.4 锁定内存中的页面168
3.6.5 后备存储168
3.6.6 策略和机制的分离169
3.7 分段171
3.7.1 纯分段的实现172
3.7.2 分段和分页结合:MULTICS173
3.7.3 分段和分页结合:Intel x86176
3.8 有关内存管理的研究176
3.9 小结177
习题178
第4章 文件系统184
4.1 文件185
4.1.1 文件命名185
4.1.2 文件结构186
4.1.3 文件类型187
4.1.4 文件访问189
4.1.5 文件属性189
4.1.6 文件操作190
4.1.7 使用文件系统调用的一个
示例程序191
4.2 目录概述193
4.2.1 一级目录系统193
4.2.2 层次目录系统194
4.2.3 路径名194
4.2.4 目录操作195
4.3 文件系统的实现196
4.3.1 文件系统布局196
4.3.2 文件的实现198
4.3.3 目录的实现201
4.3.4 共享文件203
4.3.5 日志结构文件系统205
4.3.6 日志文件系统206
4.3.7 闪存文件系统207
4.3.8 虚拟文件系统 210
4.4 文件系统管理和优化213
4.4.1 磁盘空间管理213
4.4.2 文件系统备份217
4.4.3 文件系统的一致性221
4.4.4 文件系统性能223
4.4.5 磁盘碎片整理227
4.4.6 压缩和重复数据删除227
4.4.7 文件安全删除和磁盘加密228
4.5 文件系统实例229
4.5.1 MS-DOS文件系统229
4.5.2 UNIX V7 文件系统231
4.6 有关文件系统的研究233
4.7 小结234
习题234
第5章 输入/输出238
5.1 I/O硬件原理238
5.1.1 I/O设备238
5.1.2 设备控制器239
5.1.3 内存映射I/O240
5.1.4 直接存储器存取243
5.1.5 重温中断245
5.2 I/O软件原理248
5.2.1 I/O软件的目标249
5.2.2 程序控制I/O250
5.2.3 中断驱动I/O251
5.2.4 使用DMA的I/O252
5.3 I/O软件层次252
5.3.1 中断处理程序252
5.3.2 设备驱动程序253
5.3.3 与设备无关的I/O软件256
5.3.4 用户空间的I/O软件260
5.4 大容量存储:磁盘和固态硬盘261
5.4.1 磁盘262
5.4.2 固态硬盘270
5.4.3 RAID273
5.5 时钟277
5.5.1 时钟硬件277
5.5.2 时钟软件278
5.5.3 软定时器280
5.6 用户界面:键盘、鼠标和显示器281
5.6.1 输入软件281
5.6.2 输出软件286
5.7 瘦客户机298
5.8 电源管理299
5.8.1 硬件问题300
5.8.2 操作系统问题301
5.8.3 应用程序问题305
5.9 有关输入/输出的研究305
5.10 小结306
习题307
第6章 死锁312
6.1 资源312
6.1.1 可抢占资源和不可抢占资源312
6.1.2 资源获取313
6.1.3 哲学家进餐问题314
6.2 死锁概述317
6.2.1 资源死锁的条件317
6.2.2 死锁模型317
6.3 鸵鸟算法319
6.4 死锁检测和死锁恢复320
6.4.1 每种类型一个资源的死锁
检测320
6.4.2 每种类型多个资源的死锁
检测322
6.4.3 从死锁中恢复323
6.5 死锁避免324
6.5.1 资源轨迹图325
6.5.2 安全状态和不安全状态326
6.5.3 单个资源的银行家算法327
6.5.4 多个资源的银行家算法327
6.6 死锁预防328
6.6.1 破坏互斥条件329
6.6.2 破坏占有并等待条件329
6.6.3 破坏不可抢占条件329
6.6.4 破坏循环等待条件330
6.7 其他问题330
6.7.1 两阶段加锁330
6.7.2 通信死锁331
6.7.3 活锁332
6.7.4 饥饿333
6.8 有关死锁的研究334
6.9 小结334
习题335
第7章 虚拟化和云339
7.1 历史340
7.2 虚拟化的必要条件342
7.3 第一类和第二类虚拟机管理程序344
7.4 高效虚拟化的技术345
7.4.1 在不支持虚拟化的平台上
实现虚拟化345
7.4.2 虚拟化的开销347
7.5 虚拟机管理程序是正确的
微内核吗348
7.6 内存虚拟化350
7.7 I/O虚拟化353
7.8 多核CPU上的虚拟机355
7.9 云355
7.9.1 云即服务356
7.9.2 虚拟机迁移356
7.9.3 检查点357
7.10 操作系统级虚拟化357
7.11 案例研究:VMware359
7.11.1 VMware的早期历史359
7.11.2 VMware Workstation360
7.11.3 将虚拟化引入x86的挑战361
7.11.4 VMware Workstation解决
方案概览362
7.11.5 VMware Workstation的演变367
7.11.6 VMware的第一类虚拟机
管理程序ESX Server368
7.12 有关虚拟化和云的研究369
7.13 小结370
习题370
第8章 多处理机系统372
8.1 多处理机373
8.1.1 多处理机硬件374
8.1.2 多处理机操作系统类型382
8.1.3 多处理机同步385
8.1.4 多处理机调度388
8.2 多计算机394
8.2.1 多计算机硬件394
8.2.2 低层通信软件398
8.2.3 用户层通信软件399
8.2.4 远程过程调用402
8.2.5 分布式共享存储器404
8.2.6 多计算机调度407
8.2.7 负载平衡407
8.3 分布式系统410
8.3.1 网络硬件411
8.3.2 网络服务和协议414
8.3.3 基于文档的中间件416
8.3.4 基于文件系统的中间件417
8.3.5 基于对象的中间件421
8.3.6 基于协作的中间件422
8.4 有关多处理机系统的研究424
8.5 小结425
习题426
第9章 安全429
9.1 操作系统安全基础430
9.1.1 CIA安全三要素431
9.1.2 安全原则431
9.1.3 操作系统结构的安全性433
9.1.4 可信计算基434
9.1.5 攻击者435
9.1.6 可信系统437
9.2 保护机制438
9.2.1 保护域438
9.2.2 访问控制列表440
9.2.3 权能字442
9.3 安全系统的形式化模型445
9.3.1 多级安全446
9.3.2 密码学447
9.3.3 可信平台模块450
9.4 认证451
9.4.1 密码451
9.4.2 使用物理识别的认证方式456
9.4.3 使用生物识别的认证方式457
9.5 软件漏洞458
9.5.1 缓冲区溢出攻击459
9.5.2 格式化字符串攻击465
9.5.3 UAF攻击468
9.5.4 类型混淆漏洞468
9.5.5 空指针间接引用攻击470
9.5.6 整数溢出攻击470
9.5.7 命令注入攻击471
9.5.8 检查时间/使用时间攻击472
9.5.9 双重获取漏洞472
9.6 利用硬件漏洞473
9.6.1 隐蔽信道473
9.6.2 侧信道475
9.6.3 瞬态执行攻击477
9.7 内部攻击481
9.7.1 逻辑炸弹481
9.7.2 后门陷阱481
9.7.3 登录欺骗482
9.8 操作系统加固482
9.8.1 细粒度随机化483
9.8.2 控制流限制484
9.8.3 准入限制485
9.8.4 代码和数据完整性检查488
9.8.5 使用可信平台模块的远程
认证488
9.8.6 封装不受信任的代码490
9.9 有关安全的研究491
9.10 小结492
习题493
第10章 实例研究1:UNIX、Linux
和Android498
10.1 UNIX与Linux的历史498
10.1.1 UNICS498
10.1.2 PDP-11 UNIX499
10.1.3 可移植的UNIX500
10.1.4 伯克利UNIX501
10.1.5 标准UNIX501
10.1.6 MINIX502
10.1.7 Linux503
10.2 Linux概述505
10.2.1 Linux的设计目标505
10.2.2 到Linux的接口506
10.2.3 shell507
10.2.4 Linux应用程序509
10.2.5 内核结构511
10.3 Linux中的进程513
10.3.1 基本概念513
10.3.2 Linux中进程管理相关的系统
调用515
10.3.3 Linux中进程与线程的实现518
10.3.4 Linux中的调度523
10.3.5 Linux中的同步526
10.3.6 启动Linux系统526
10.4 Linux中的内存管理528
10.4.1 基本概念529
10.4.2 Linux中的内存管理系统
调用531
10.4.3 Linux中内存管理的实现532
10.4.4 Linux中的分页536
10.5 Linux中的I/O系统538
10.5.1 基本概念538
10.5.2 网络539
10.5.3 Linux中的I/O系统调用541
10.5.4 I/O在Linux中的实现541
10.5.5 Linux中的模块544
10.6 Linux文件系统544
10.6.1 基本概念544
10.6.2 Linux中的文件系统调用548
10.6.3 Linux文件系统的实现551
10.6.4 网络文件系统557
10.7 Linux的安全性561
10.7.1 基本概念561
10.7.2 Linux中安全相关的系统
调用563
10.7.3 Linux中的安全实现564
10.8 Android564
10.8.1 Android与Google565
10.8.2 Android的历史565
10.8.3 设计目标569
10.8.4 Android体系结构569
10.8.5 Linux扩展571
10.8.6 ART574
10.8.7 Binder IPC575
10.8.8 Android应用581
10.8.9 意图589
10.8.10 进程模型590
10.8.11 安全和隐私594
10.8.12 后台执行和社会工程606
10.9 小结610
习题611
第11章 实例研究2:Windows 11616
11.1 通过Windows11简述Windows的
历史616
11.1.1 20世纪80年代:MS-DOS617
11.1.2 20世纪90年代:基于MS-
DOS的Windows617
11.1.3 21世纪最初十年:基于NT
的Windows618
11.1.4 Windows Vista620
11.1.5 Windows 8620
11.1.6 Windows 10621
11.1.7 Windows 11 622
11.2 Windows编程622
11.2.1 通用Windows平台623
11.2.2 Windows子系统624
11.2.3 本地NT API625
11.2.4 Win32 API627
11.2.5 Windows 注册表630
11.3 系统结构631
11.3.1 操作系统结构632
11.3.2 启动Windows643
11.3.3 对象管理器的实现645
11.3.4 子系统、DLL和用户态服务654
11.4 Windows中的进程和线程655
11.4.1 基本概念656
11.4.2 作业、进程、线程和纤程
管理API调用659
11.4.3 进程和线程的实现663
11.4.4 WoW64和模拟670
11.5 内存管理673
11.5.1 基本概念673
11.5.2 内存管理系统调用677
11.5.3 内存管理的实现678
11.5.4 内存压缩685
11.5.5 内存分区687
11.6 Windows的高速缓存689
11.7 Windows的I/O690
11.7.1 基本概念690
11.7.2 I/O的API调用691
11.7.3 I/O实现693
11.8 Windows NT 文件系统697
11.8.1 基本概念697
11.8.2 NTFS的实现698
11.9 Windows电源管理705
11.10 Windows虚拟化707
11.10.1 Hyper-V707
11.10.2 容器712
11.10.3 基于虚拟化的安全716
11.11 Windows的安全717
11.11.1 基本概念718
11.11.2 安全相关的API调用720
11.11.3 安全性的实现720
11.11.4 安全修复722
11.12 小结728
习题729
第12章 操作系统设计733
12.1 设计问题的本质733
12.1.1 目标733
12.1.2 设计操作系统为什么困难734
12.2 接口设计736
12.2.1 指导原则736
12.2.2 范型737
12.2.3 系统调用接口740
12.3 实现742
12.3.1 系统结构742
12.3.2 机制与策略744
12.3.3 正交性745
12.3.4 命名746
12.3.5 绑定的时机747
12.3.6 静态与动态结构747
12.3.7 自顶向下与自底向上的
实现748
12.3.8 同步通信与异步通信749
12.3.9 实用技术750
12.4 性能754
12.4.1 操作系统为什么运行缓慢754
12.4.2 什么应该优化754
12.4.3 空间-时间的权衡755
12.4.4 缓存757
12.4.5 线索758
12.4.6 利用局部性758
12.4.7 优化常见的情况758
12.5 项目管理759
12.5.1 人月神话759
12.5.2 团队结构760
12.5.3 经验的作用761
12.5.4 没有银弹762
习题762
第13章 参考书目与文献765
13.1 进行深入阅读的建议765
13.1.1 引论765
13.1.2 进程与线程765
13.1.3 内存管理766
13.1.4 文件系统766
13.1.5 输入/输出767
13.1.6 死锁768
13.1.7 虚拟化和云768
13.1.8 多处理机系统768
13.1.9 安全769
13.1.10 实例研究1:UNIX、Linux
和Android770
13.1.11 实例研究2:Windows 11770
13.1.12 操作系统设计770
13.2 按字母顺序排列的参考文献771
译者序
前言
作者简介
第1章 引论1
1.1 什么是操作系统2
1.1.1 作为扩展机器的操作系统3
1.1.2 作为资源管理器的操作系统4
1.2 操作系统的历史5
1.2.1 第一代计算机(1945~
1955年):真空管和穿
孔卡片5
1.2.2 第二代计算机(1955~
1965年):晶体管和批
处理系统5
1.2.3 第三代计算机(1965~
1980年):集成电路芯
片和多道程序设计7
1.2.4 第四代计算机(1980年
至今):个人计算机11
1.2.5 第五代计算机(1990年
至今):移动计算机13
1.3 计算机硬件简介14
1.3.1 处理器15
1.3.2 存储器17
1.3.3 非易失性存储器20
1.3.4 I/O设备21
1.3.5 总线23
1.3.6 启动计算机 24
1.4 操作系统大观园25
1.4.1 大型机操作系统25
1.4.2 服务器操作系统26
1.4.3 个人计算机操作系统26
1.4.4 智能手机和掌上计算机操作
系统26
1.4.5 物联网和嵌入式操作系统26
1.4.6 实时操作系统27
1.4.7 智能卡操作系统27
1.5 操作系统概念28
1.5.1 进程28
1.5.2 地址空间29
1.5.3 文件30
1.5.4 输入/输出32
1.5.5 保护32
1.5.6 shell32
1.5.7 个体重复系统发育33
1.6 系统调用35
1.6.1 用于进程管理的系统调用38
1.6.2 用于文件管理的系统调用40
1.6.3 用于目录管理的系统调用41
1.6.4 各种系统调用42
1.6.5 Windows API43
1.7 操作系统结构45
1.7.1 单体系统45
1.7.2 层次式系统46
1.7.3 微内核46
1.7.4 客户端-服务器模式48
1.7.5 虚拟机49
1.7.6 外核和unikernel52
1.8 依靠C的世界52
1.8.1 C语言53
1.8.2 头文件53
1.8.3 大型编程项目54
1.8.4 运行模型55
1.9 有关操作系统的研究55
1.10 本书其他部分概要56
1.11 公制单位56
1.12 小结57
习题57
第2章 进程与线程60
2.1 进程60
2.1.1 进程模型60
2.1.2 进程的创建62
2.1.3 进程的终止63
2.1.4 进程的层次结构64
2.1.5 进程的状态65
2.1.6 进程的实现66
2.1.7 多道程序设计模型67
2.2 线程68
2.2.1 线程的使用68
2.2.2 经典的线程模型71
2.2.3 POSIX线程74
2.2.4 在用户空间中实现线程75
2.2.5 在内核中实现线程78
2.2.6 混合实现79
2.2.7 使单线程代码多线程化79
2.3 事件驱动服务器82
2.4 同步和进程间通信84
2.4.1 竞争条件84
2.4.2 临界区85
2.4.3 忙等待的互斥86
2.4.4 睡眠与唤醒90
2.4.5 信号量92
2.4.6 互斥量95
2.4.7 管程98
2.4.8 消息传递103
2.4.9 屏障105
2.4.10 优先级反转106
2.4.11 避免锁:读-复制-更新107
2.5 调度108
2.5.1 调度简介108
2.5.2 批处理系统中的调度113
2.5.3 交互式系统中的调度114
2.5.4 实时系统中的调度118
2.5.5 策略和机制119
2.5.6 线程调度119
2.6 有关进程与线程的研究121
2.7 小结121
习题122
第3章 内存管理127
3.1 无内存抽象127
3.2 一种内存抽象:地址空间130
3.2.1 地址空间的概念130
3.2.2 交换技术132
3.2.3 空闲内存管理134
3.3 虚拟内存136
3.3.1 分页137
3.3.2 页表139
3.3.3 加速分页过程142
3.3.4 针对大内存的页表144
3.4 页面置换算法147
3.4.1 最优页面置换算法148
3.4.2 最近未使用页面置换算法148
3.4.3 先进先出页面置换算法149
3.4.4 第二次机会页面置换算法149
3.4.5 时钟页面置换算法150
3.4.6 最近最少使用页面置换算法151
3.4.7 用软件模拟LRU151
3.4.8 工作集页面置换算法 152
3.4.9 工作集时钟页面置换算法155
3.4.10 页面置换算法小结157
3.5 分页系统中的设计问题157
3.5.1 局部分配策略与全局分配
策略158
3.5.2 负载控制159
3.5.3 清除策略160
3.5.4 页面大小161
3.5.5 分离的指令空间和数据空间162
3.5.6 共享页面163
3.5.7 共享库164
3.5.8 内存映射文件165
3.6 有关实现的问题166
3.6.1 与分页有关的操作系统工作166
3.6.2 缺页中断处理166
3.6.3 指令备份167
3.6.4 锁定内存中的页面168
3.6.5 后备存储168
3.6.6 策略和机制的分离169
3.7 分段171
3.7.1 纯分段的实现172
3.7.2 分段和分页结合:MULTICS173
3.7.3 分段和分页结合:Intel x86176
3.8 有关内存管理的研究176
3.9 小结177
习题178
第4章 文件系统184
4.1 文件185
4.1.1 文件命名185
4.1.2 文件结构186
4.1.3 文件类型187
4.1.4 文件访问189
4.1.5 文件属性189
4.1.6 文件操作190
4.1.7 使用文件系统调用的一个
示例程序191
4.2 目录概述193
4.2.1 一级目录系统193
4.2.2 层次目录系统194
4.2.3 路径名194
4.2.4 目录操作195
4.3 文件系统的实现196
4.3.1 文件系统布局196
4.3.2 文件的实现198
4.3.3 目录的实现201
4.3.4 共享文件203
4.3.5 日志结构文件系统205
4.3.6 日志文件系统206
4.3.7 闪存文件系统207
4.3.8 虚拟文件系统 210
4.4 文件系统管理和优化213
4.4.1 磁盘空间管理213
4.4.2 文件系统备份217
4.4.3 文件系统的一致性221
4.4.4 文件系统性能223
4.4.5 磁盘碎片整理227
4.4.6 压缩和重复数据删除227
4.4.7 文件安全删除和磁盘加密228
4.5 文件系统实例229
4.5.1 MS-DOS文件系统229
4.5.2 UNIX V7 文件系统231
4.6 有关文件系统的研究233
4.7 小结234
习题234
第5章 输入/输出238
5.1 I/O硬件原理238
5.1.1 I/O设备238
5.1.2 设备控制器239
5.1.3 内存映射I/O240
5.1.4 直接存储器存取243
5.1.5 重温中断245
5.2 I/O软件原理248
5.2.1 I/O软件的目标249
5.2.2 程序控制I/O250
5.2.3 中断驱动I/O251
5.2.4 使用DMA的I/O252
5.3 I/O软件层次252
5.3.1 中断处理程序252
5.3.2 设备驱动程序253
5.3.3 与设备无关的I/O软件256
5.3.4 用户空间的I/O软件260
5.4 大容量存储:磁盘和固态硬盘261
5.4.1 磁盘262
5.4.2 固态硬盘270
5.4.3 RAID273
5.5 时钟277
5.5.1 时钟硬件277
5.5.2 时钟软件278
5.5.3 软定时器280
5.6 用户界面:键盘、鼠标和显示器281
5.6.1 输入软件281
5.6.2 输出软件286
5.7 瘦客户机298
5.8 电源管理299
5.8.1 硬件问题300
5.8.2 操作系统问题301
5.8.3 应用程序问题305
5.9 有关输入/输出的研究305
5.10 小结306
习题307
第6章 死锁312
6.1 资源312
6.1.1 可抢占资源和不可抢占资源312
6.1.2 资源获取313
6.1.3 哲学家进餐问题314
6.2 死锁概述317
6.2.1 资源死锁的条件317
6.2.2 死锁模型317
6.3 鸵鸟算法319
6.4 死锁检测和死锁恢复320
6.4.1 每种类型一个资源的死锁
检测320
6.4.2 每种类型多个资源的死锁
检测322
6.4.3 从死锁中恢复323
6.5 死锁避免324
6.5.1 资源轨迹图325
6.5.2 安全状态和不安全状态326
6.5.3 单个资源的银行家算法327
6.5.4 多个资源的银行家算法327
6.6 死锁预防328
6.6.1 破坏互斥条件329
6.6.2 破坏占有并等待条件329
6.6.3 破坏不可抢占条件329
6.6.4 破坏循环等待条件330
6.7 其他问题330
6.7.1 两阶段加锁330
6.7.2 通信死锁331
6.7.3 活锁332
6.7.4 饥饿333
6.8 有关死锁的研究334
6.9 小结334
习题335
第7章 虚拟化和云339
7.1 历史340
7.2 虚拟化的必要条件342
7.3 第一类和第二类虚拟机管理程序344
7.4 高效虚拟化的技术345
7.4.1 在不支持虚拟化的平台上
实现虚拟化345
7.4.2 虚拟化的开销347
7.5 虚拟机管理程序是正确的
微内核吗348
7.6 内存虚拟化350
7.7 I/O虚拟化353
7.8 多核CPU上的虚拟机355
7.9 云355
7.9.1 云即服务356
7.9.2 虚拟机迁移356
7.9.3 检查点357
7.10 操作系统级虚拟化357
7.11 案例研究:VMware359
7.11.1 VMware的早期历史359
7.11.2 VMware Workstation360
7.11.3 将虚拟化引入x86的挑战361
7.11.4 VMware Workstation解决
方案概览362
7.11.5 VMware Workstation的演变367
7.11.6 VMware的第一类虚拟机
管理程序ESX Server368
7.12 有关虚拟化和云的研究369
7.13 小结370
习题370
第8章 多处理机系统372
8.1 多处理机373
8.1.1 多处理机硬件374
8.1.2 多处理机操作系统类型382
8.1.3 多处理机同步385
8.1.4 多处理机调度388
8.2 多计算机394
8.2.1 多计算机硬件394
8.2.2 低层通信软件398
8.2.3 用户层通信软件399
8.2.4 远程过程调用402
8.2.5 分布式共享存储器404
8.2.6 多计算机调度407
8.2.7 负载平衡407
8.3 分布式系统410
8.3.1 网络硬件411
8.3.2 网络服务和协议414
8.3.3 基于文档的中间件416
8.3.4 基于文件系统的中间件417
8.3.5 基于对象的中间件421
8.3.6 基于协作的中间件422
8.4 有关多处理机系统的研究424
8.5 小结425
习题426
第9章 安全429
9.1 操作系统安全基础430
9.1.1 CIA安全三要素431
9.1.2 安全原则431
9.1.3 操作系统结构的安全性433
9.1.4 可信计算基434
9.1.5 攻击者435
9.1.6 可信系统437
9.2 保护机制438
9.2.1 保护域438
9.2.2 访问控制列表440
9.2.3 权能字442
9.3 安全系统的形式化模型445
9.3.1 多级安全446
9.3.2 密码学447
9.3.3 可信平台模块450
9.4 认证451
9.4.1 密码451
9.4.2 使用物理识别的认证方式456
9.4.3 使用生物识别的认证方式457
9.5 软件漏洞458
9.5.1 缓冲区溢出攻击459
9.5.2 格式化字符串攻击465
9.5.3 UAF攻击468
9.5.4 类型混淆漏洞468
9.5.5 空指针间接引用攻击470
9.5.6 整数溢出攻击470
9.5.7 命令注入攻击471
9.5.8 检查时间/使用时间攻击472
9.5.9 双重获取漏洞472
9.6 利用硬件漏洞473
9.6.1 隐蔽信道473
9.6.2 侧信道475
9.6.3 瞬态执行攻击477
9.7 内部攻击481
9.7.1 逻辑炸弹481
9.7.2 后门陷阱481
9.7.3 登录欺骗482
9.8 操作系统加固482
9.8.1 细粒度随机化483
9.8.2 控制流限制484
9.8.3 准入限制485
9.8.4 代码和数据完整性检查488
9.8.5 使用可信平台模块的远程
认证488
9.8.6 封装不受信任的代码490
9.9 有关安全的研究491
9.10 小结492
习题493
第10章 实例研究1:UNIX、Linux
和Android498
10.1 UNIX与Linux的历史498
10.1.1 UNICS498
10.1.2 PDP-11 UNIX499
10.1.3 可移植的UNIX500
10.1.4 伯克利UNIX501
10.1.5 标准UNIX501
10.1.6 MINIX502
10.1.7 Linux503
10.2 Linux概述505
10.2.1 Linux的设计目标505
10.2.2 到Linux的接口506
10.2.3 shell507
10.2.4 Linux应用程序509
10.2.5 内核结构511
10.3 Linux中的进程513
10.3.1 基本概念513
10.3.2 Linux中进程管理相关的系统
调用515
10.3.3 Linux中进程与线程的实现518
10.3.4 Linux中的调度523
10.3.5 Linux中的同步526
10.3.6 启动Linux系统526
10.4 Linux中的内存管理528
10.4.1 基本概念529
10.4.2 Linux中的内存管理系统
调用531
10.4.3 Linux中内存管理的实现532
10.4.4 Linux中的分页536
10.5 Linux中的I/O系统538
10.5.1 基本概念538
10.5.2 网络539
10.5.3 Linux中的I/O系统调用541
10.5.4 I/O在Linux中的实现541
10.5.5 Linux中的模块544
10.6 Linux文件系统544
10.6.1 基本概念544
10.6.2 Linux中的文件系统调用548
10.6.3 Linux文件系统的实现551
10.6.4 网络文件系统557
10.7 Linux的安全性561
10.7.1 基本概念561
10.7.2 Linux中安全相关的系统
调用563
10.7.3 Linux中的安全实现564
10.8 Android564
10.8.1 Android与Google565
10.8.2 Android的历史565
10.8.3 设计目标569
10.8.4 Android体系结构569
10.8.5 Linux扩展571
10.8.6 ART574
10.8.7 Binder IPC575
10.8.8 Android应用581
10.8.9 意图589
10.8.10 进程模型590
10.8.11 安全和隐私594
10.8.12 后台执行和社会工程606
10.9 小结610
习题611
第11章 实例研究2:Windows 11616
11.1 通过Windows11简述Windows的
历史616
11.1.1 20世纪80年代:MS-DOS617
11.1.2 20世纪90年代:基于MS-
DOS的Windows617
11.1.3 21世纪最初十年:基于NT
的Windows618
11.1.4 Windows Vista620
11.1.5 Windows 8620
11.1.6 Windows 10621
11.1.7 Windows 11 622
11.2 Windows编程622
11.2.1 通用Windows平台623
11.2.2 Windows子系统624
11.2.3 本地NT API625
11.2.4 Win32 API627
11.2.5 Windows 注册表630
11.3 系统结构631
11.3.1 操作系统结构632
11.3.2 启动Windows643
11.3.3 对象管理器的实现645
11.3.4 子系统、DLL和用户态服务654
11.4 Windows中的进程和线程655
11.4.1 基本概念656
11.4.2 作业、进程、线程和纤程
管理API调用659
11.4.3 进程和线程的实现663
11.4.4 WoW64和模拟670
11.5 内存管理673
11.5.1 基本概念673
11.5.2 内存管理系统调用677
11.5.3 内存管理的实现678
11.5.4 内存压缩685
11.5.5 内存分区687
11.6 Windows的高速缓存689
11.7 Windows的I/O690
11.7.1 基本概念690
11.7.2 I/O的API调用691
11.7.3 I/O实现693
11.8 Windows NT 文件系统697
11.8.1 基本概念697
11.8.2 NTFS的实现698
11.9 Windows电源管理705
11.10 Windows虚拟化707
11.10.1 Hyper-V707
11.10.2 容器712
11.10.3 基于虚拟化的安全716
11.11 Windows的安全717
11.11.1 基本概念718
11.11.2 安全相关的API调用720
11.11.3 安全性的实现720
11.11.4 安全修复722
11.12 小结728
习题729
第12章 操作系统设计733
12.1 设计问题的本质733
12.1.1 目标733
12.1.2 设计操作系统为什么困难734
12.2 接口设计736
12.2.1 指导原则736
12.2.2 范型737
12.2.3 系统调用接口740
12.3 实现742
12.3.1 系统结构742
12.3.2 机制与策略744
12.3.3 正交性745
12.3.4 命名746
12.3.5 绑定的时机747
12.3.6 静态与动态结构747
12.3.7 自顶向下与自底向上的
实现748
12.3.8 同步通信与异步通信749
12.3.9 实用技术750
12.4 性能754
12.4.1 操作系统为什么运行缓慢754
12.4.2 什么应该优化754
12.4.3 空间-时间的权衡755
12.4.4 缓存757
12.4.5 线索758
12.4.6 利用局部性758
12.4.7 优化常见的情况758
12.5 项目管理759
12.5.1 人月神话759
12.5.2 团队结构760
12.5.3 经验的作用761
12.5.4 没有银弹762
习题762
第13章 参考书目与文献765
13.1 进行深入阅读的建议765
13.1.1 引论765
13.1.2 进程与线程765
13.1.3 内存管理766
13.1.4 文件系统766
13.1.5 输入/输出767
13.1.6 死锁768
13.1.7 虚拟化和云768
13.1.8 多处理机系统768
13.1.9 安全769
13.1.10 实例研究1:UNIX、Linux
和Android770
13.1.11 实例研究2:Windows 11770
13.1.12 操作系统设计770
13.2 按字母顺序排列的参考文献771







