操作系统导论 本书特色
这是一本关于现代操作系统的书。全书围绕虚拟化、并发和持久性这3个主要概念展开,介绍了所有现代系统的主要组件(包括调度、虚拟内存管理、磁盘和I/O子系统、文件系统 )。本书共50章,分为3个部分,分别讲述虚拟化、并发和持久性的相关内容。本书大部分章节均先提出特定的问题,然后通过书中介绍的技术、算法和思想来解决这些问题。笔者以对话形式引入所介绍的主题概念,行文诙谐幽默却又鞭辟入里,力求帮助读者理解操作系统中虚拟化、并发和持久性的原理。本书内容全面,并给出了真实可运行的代码(而非伪代码),还提供了相应的练习,适合高等院校相关专业教师教学和高校学生自学。
操作系统导论 内容简介
这是一本关于现代操作系统的书。全书围绕虚拟化、并发和持久性这3个主要概念展开,介绍了所有现代系统的主要组件(包括调度、虚拟内存管理、磁盘和I/O子系统、文件系统 )。本书共50章,分为3个部分,分别讲述虚拟化、并发和持久性的相关内容。本书大部分章节均先提出特定的问题,然后通过书中介绍的技术、算法和思想来解决这些问题。笔者以对话形式引入所介绍的主题概念,行文诙谐幽默却又鞭辟入里,力求帮助读者理解操作系统中虚拟化、并发和持久性的原理。本书内容全面,并给出了真实可运行的代码(而非伪代码),还提供了相应的练习,适合高等院校相关专业教师教学和高校学生自学。
操作系统导论 目录
第 1章关于本书的对话1
第2章 操作系统介绍3
2.1虚拟化CPU4
2.2虚拟化内存6
2.3并发7
2.4持久性9
2.5设计目标11
2.6简单历史12
2.7小结15
参考资料15
第1部分 虚拟化
第3章关于虚拟化的对话18
第4章抽象:进程19
4.1抽象:进程20
4.2进程API20
4.3进程创建:更多细节21
4.4进程状态22
4.5数据结构24
4.6小结25
参考资料25
作业26
问题26
第5章插叙:进程API28
5.1fork()系统调用28
5.2wait()系统调用29
5.3*后是exec()系统调用30
5.4为什么这样设计API32
5.5其他API34
5.6小结34
参考资料34
作业(编码)35
问题35
第6章机制:受限直接执行37
6.1基本技巧:受限直接执行37
6.2问题1:受限制的操作38
6.3问题2:在进程之间切换40
6.4担心并发吗44
6.5小结45
参考资料45
作业(测量)47
第7章进程调度:介绍48
7.1工作负载假设48
7.2调度指标49
7.3先进先出(FIFO)49
7.4*短任务优先(SJF)50
7.5*短完成时间优先(STCF)51
7.6新度量指标:响应时间52
7.7轮转52
7.8结合I/O54
7.9无法预知54
7.10小结55
参考资料55
作业56
问题56
第8章调度:多级反馈队列57
8.1MLFQ:基本规则57
8.2尝试 #1:如何改变优先级58
8.3尝试 #2:提升优先级60
8.4尝试 #3:更好的计时方式61
8.5MLFQ调优及其他问题61
8.6MLFQ:小结62
参考资料63
作业64
问题64
第9章调度:比例份额65
9.1基本概念:彩票数表示份额65
9.2彩票机制66
9.3实现67
9.4一个例子68
9.5如何分配彩票68
9.6为什么不是确定的69
9.7小结70
参考资料70
作业71
问题71
第10章 多处理器调度(高级)73
10.1背景:多处理器架构73
10.2别忘了同步75
10.3*后一个问题:缓存亲和度76
10.4单队列调度76
10.5多队列调度77
10.6Linux 多处理器调度79
10.7小结79
参考资料79
第11章 关于CPU虚拟化的总结对话81
第12章 关于内存虚拟化的对话83
第13章 抽象:地址空间85
13.1早期系统85
13.2多道程序和时分共享85
13.3地址空间86
13.4目标87
13.5小结89
参考资料89
第14章 插叙:内存操作API91
14.1内存类型91
14.2malloc()调用92
14.3free()调用93
14.4常见错误93
14.5底层操作系统支持96
14.6其他调用97
14.7小结97
参考资料97
作业(编码)98
问题98
第15章 机制:地址转换100
15.1假设101
15.2一个例子101
15.3动态(基于硬件)重定位103
15.4硬件支持:总结105
15.5操作系统的问题105
15.6小结108
参考资料109
作业110
问题110
第16章 分段111
16.1分段:泛化的基址/界限111
16.2我们引用哪个段113
16.3栈怎么办114
16.4支持共享114
16.5细粒度与粗粒度的分段115
16.6操作系统支持115
16.7小结117
参考资料117
作业118
问题119
第17章 空闲空间管理120
17.1假设120
17.2底层机制121
17.3基本策略126
17.4其他方式128
17.5小结130
参考资料130
作业131
问题131
第18章 分页:介绍132
18.1一个简单例子132
18.2页表存在哪里134
18.3列表中究竟有什么135
18.4分页:也很慢136
18.5内存追踪137
18.6小结139
参考资料139
作业140
问题140
第19章 分页:快速地址转换(TLB)142
19.1TLB的基本算法142
19.2示例:访问数组143
19.3谁来处理TLB未命中145
19.4TLB的内容146
19.5上下文切换时对TLB的处理147
19.6TLB替换策略149
19.7实际系统的TLB表项149
19.8小结150
参考资料151
作业(测量)152
问题153
第20章 分页:较小的表154
20.1简单的解决方案:更大的页154
20.2混合方法:分页和分段155
20.3多级页表157
20.4反向页表162
20.5将页表交换到磁盘163
20.6小结163
参考资料163
作业164
问题164
第21章 超越物理内存:机制165
21.1交换空间165
21.2存在位166
21.3页错误167
21.4内存满了怎么办168
21.5页错误处理流程168
21.6交换何时真正发生169
21.7小结170
参考资料171
第22章 超越物理内存:策略172
22.1缓存管理172
22.2*优替换策略173
22.3简单策略:FIFO175
22.4另一简单策略:随机176
22.5利用历史数据:LRU177
22.6工作负载示例178
22.7实现基于历史信息的算法180
22.8近似LRU181
22.9考虑脏页182
22.10其他虚拟内存策略182
22.11抖动183
22.12小结183
参考资料183
作业185
问题185
第23章 VAX/VMS虚拟内存系统186
23.1背景186
23.2内存管理硬件186
23.3一个真实的地址空间187
23.4页替换189
23.5其他漂亮的虚拟内存技巧190
23.6小结191
参考资料191
第24章 内存虚拟化总结对话193
第2部分 并发
第25章 关于并发的对话196
第26章 并发:介绍198
26.1实例:线程创建199
26.2为什么更糟糕:共享数据201
26.3核心问题:不可控的调度203
26.4原子性愿望205
26.5还有一个问题:等待另一个
线程206
26.6小结:为什么操作系统课要研究
并发207
参考资料207
作业208
问题208
第27章 插叙:线程API210
27.1线程创建210
27.2线程完成211
27.3锁214
27.4条件变量215
27.5编译和运行217
27.6小结217
参考资料218
第28章 锁219
28.1锁的基本思想219
28.2Pthread锁220
28.3实现一个锁220
28.4评价锁220
28.5控制中断221
28.6测试并设置指令(原子交换)222
28.7实现可用的自旋锁223
28.8评价自旋锁225
28.9比较并交换225
28.10链接的加载和条件式存储指令226
28.11获取并增加228
28.12自旋过多:怎么办229
28.13简单方法:让出来吧,宝贝229
28.14使用队列:休眠替代自旋230
28.15不同操作系统,不同实现232
28.16两阶段锁233
28.17小结233
参考资料233
作业235
问题235
第29章 基于锁的并发数据结构237
29.1并发计数器237
29.2并发链表241
29.3并发队列244
29.4并发散列表245
29.5小结246
参考资料247
第30章条件变量249
30.1定义和程序250
30.2生产者/消费者(有界缓冲区)
问题252
30.3覆盖条件260
30.4小结261
参考资料261
第31章信号量263
31.1信号量的定义263
31.2二值信号量(锁)264
31.3信号量用作条件变量266
31.4生产者/消费者(有界缓冲区)
问题268
31.5读者—写者锁271
31.6哲学家就餐问题273
31.7如何实现信号量275
31.8小结276
参考资料276
第32章常见并发问题279
32.1有哪些类型的缺陷279
32.2非死锁缺陷280
32.3死锁缺陷282
32.4小结288
参考资料289
第33章基于事件的并发(进阶)291
33.1基本想法:事件循环291
33.2重要API:select()(或poll())292
33.3使用select()293
33.4为何更简单?无须锁294
33.5一个问题:阻塞系统调用294
33.6解决方案:异步I/O294
33.7另一个问题:状态管理296
33.8什么事情仍然很难297
33.9小结298
参考资料298
第34章并发的总结对话300
第3部分持久性
第35章关于持久性的对话302
第36章I/O设备303
36.1系统架构303
36.2标准设备304
36.3标准协议304
36.4利用中断减少CPU开销305
36.5利用DMA进行更高效的数据
传送306
36.6设备交互的方法307
36.7纳入操作系统:设备驱动程序307
36.8案例研究:简单的IDE磁盘驱动
程序309
36.9历史记录311
36.10小结311
参考资料312
第37章磁盘驱动器314
37.1接口314
37.2基本几何形状314
37.3简单的磁盘驱动器315
37.4I/O时间:用数学318
37.5磁盘调度320
37.6小结323
参考资料323
作业324
问题324
第38章廉价冗余磁盘阵列(RAID)326
38.1接口和RAID内部327
38.2故障模型327
38.3如何评估RAID328
38.4RAID 0级:条带化328
38.5RAID 1级:镜像331
38.6RAID 4级:通过奇偶校验节省
空间333
38.7RAID 5级:旋转奇偶校验336
38.8RAID比较:总结337
38.9其他有趣的RAID问题338
38.10小结338
参考资料339
作业340
问题340
第39章插叙:文件和目录342
39.1文件和目录342
39.2文件系统接口343
39.3创建文件343
39.4读写文件344
39.5读取和写入,但不按顺序346
39.6用fsync()立即写入346
39.7文件重命名347
39.8获取文件信息348
39.9删除文件349
39.10创建目录349
39.11读取目录350
39.12删除目录351
39.13硬链接351
39.14符号链接353
39.15创建并挂载文件系统354
39.16总结355
参考资料355
作业356
问题356
第40章文件系统实现357
40.1思考方式357
40.2整体组织358
40.3文件组织:inode359
40.4目录组织363
40.5空闲空间管理364
40.6访问路径:读取和写入364
40.7缓存和缓冲367
40.8小结369
参考资料369
作业370
问题371
第41章局部性和快速文件系统372
41.1问题:性能不佳372
41.2FFS:磁盘意识是解决方案373
41.3组织结构:柱面组373
41.4策略:如何分配文件和目录374
41.5测量文件的局部性375
41.6大文件例外376
41.7关于FFS的其他几件事377
41.8小结378
参考资料378
第42章崩溃一致性:FSCK和日志380
42.1一个详细的例子380
42.2解决方案#1:文件系统检查
程序383
42.3解决方案#2:日志
(或预写日志)384
42.4解决方案#3:其他方法392
42.5小结393
参考资料393
第43章日志结构文件系统395
43.1按顺序写入磁盘396
43.2顺序而高效地写入396
43.3要缓冲多少397
43.4问题:查找inode398
43.5通过间接解决方案:inode映射398
43.6检查点区域399
43.7从磁盘读取文件:回顾400
43.8目录如何400
43.9一个新问题:垃圾收集401
43.10确定块的死活402
43.11策略问题:要清理哪些块,
何时清理403
43.12崩溃恢复和日志403
43.13小结404
参考资料404
第44章数据完整性和保护407
44.1磁盘故障模式407
44.2处理潜在的扇区错误409
44.3检测讹误:校验和409
44.4使用校验和412
44.5一个新问题:错误的写入412
44.6*后一个问题:丢失的写入413
44.7擦净413
44.8校验和的开销414
44.9小结414
参考资料414
第45章关于持久的总结对话417
第46章关于分布式的对话418
第47章分布式系统419
47.1通信基础420
47.2不可靠的通信层420
47.3可靠的通信层422
47.4通信抽象424
47.5远程过程调用(RPC)425
47.6小结428
参考资料429
第48章Sun的网络文件系统(NFS)430
48.1基本分布式文件系统430
48.2交出NFS431
48.3关注点:简单快速的服务器崩溃
恢复431
48.4快速崩溃恢复的关键:无状态432
48.5NFSv2协议433
48.6从协议到分布式文件系统434
48.7利用幂等操作处理服务器故障435
48.8提高性能:客户端缓存437
48.9缓存一致性问题437
48.10评估NFS的缓存一致性439
48.11服务器端写缓冲的隐含意义439
48.12小结440
参考资料440
第49章Andrew文件系统(AFS)442
49.1AFS版本1442
49.2版本1的问题443
49.3改进协议444
49.4AFS版本2444
49.5缓存一致性446
49.6崩溃恢复447
49.7AFSv2的扩展性和性能448
49.8AFS:其他改进450
49.9小结450
参考资料451
作业452
问题452
第50章关于分布式的总结对话453
附录A关于虚拟机监视器的对话454
附录B虚拟机监视器455
附录C关于监视器的对话466
附录D关于实验室的对话467
附录E实验室:指南468
附录F实验室:系统项目478
附录G实验室:xv6项目480
操作系统导论 作者简介
雷姆兹·H.阿帕希杜塞尔(Remzi H.Arpaci-Dusseau)和安德莉亚·C.阿帕希杜塞尔(Andrea C.Arpaci-Dusseau)夫妇是美国威斯康星大学计算机科学教授。二人都从事计算机操作系统方面的教学和研究。