第一篇 基础原理篇 2
第1章 操作系统导论 2
引子:智者的挑战 2
1.1人造学科 3
1.2程序是如何运行的 5
1.3什么是操作系统 7
1.4魔幻与管理 8
1.5用户程序与操作系统 9
1.6操作系统的范畴 11
1.7为什么学习操作系统 12
思考题 13
第2章 操作系统历史 14
引子:操作系统进化的推动因素 14
2.1第一阶段:状态机操作系统(1940年以前) 15
2.2第二阶段:单一操作员、单一控制端操作系统(20世纪40年代) 16
2.3第三阶段:批处理操作系统(20世纪50年代) 16
2.4第四代:多道批处理操作系统(20世纪60年代) 18
2.5第五代之一:分时操作系统(20世纪70年代) 19
2.6第五代之二:实时操作系统 20
2.7第六代:现代操作系统(1980年以后) 21
2.8操作系统的演变过程 22
2.9操作系统的未来发展趋势 25
思考题 26
第3章 操作系统基本概念 27
引子:“差不多”精神 27
3.1计算机硬件基本知识 28
3.2抽象 31
3.3内核态和用户态 31
3.4操作系统结构 33
3.5进程、内存和文件 35
3.6系统调用 36
3.7壳 37
思考题 39
第二篇 进程原理篇 42
第4章 进程 42
引子 42
4.1进程概论 43
4.2进程模型 44
4.3多道编程的效率 44
4.4进程的产生与消失 46
4.5进程的层次结构 47
4.6进程的状态 47
4.7进程创立 49
4.8进程与地址空间 49
4.9进程管理 50
4.10进程的缺陷 52
思考题 52
第5章 线程 53
引子 53
5.1进程的分身术——线程 54
5.2线程管理 55
5.3线程的实现方式 56
5.4现代操作系统的线程实现模型 60
5.5多线程的关系 60
5.6讨论:从用户态进入内核态 61
5.7讨论:线程的困惑——确定性与非确定性 62
思考题 63
第6章 线程通信 64
引子 64
6.1为什么要通信 64
6.2线程对白:管道、记名管道、套接字 65
6.3线程电报:信号 69
6.4线程旗语:信号量 70
6.5线程拥抱:共享内存 71
6.6信件发送:消息队列 71
6.7其他通信机制 72
思考题 72
第7章 进程同步 73
引子 73
7.1为什么要同步 73
7.2线程同步的目的 75
7.3锁的进化 75
7.4睡觉与叫醒:生产者与消费者问题 81
7.5信号量 84
7.6锁、睡觉与叫醒、信号量 87
7.7管程 88
7.8消息传递 91
7.9栅栏 93
思考题 93
第8章 进程调度 96
引子 96
8.1调度的目标 97
8.2处理器调度的总体目标 97
8.3先来先服务调度算法 98
8.4时间片轮转 98
8.5短任务优先 99
8.6优先级调度 101
8.7混合调度算法 102
8.8其他调度算法 102
8.9实时调度算法 103
8.10高级议题:调度异常之优先级倒挂 104
思考题 106
第9章 锁的实现 107
引子:锁的实现哲学 107
9.1以中断启用与禁止来实现锁 108
9.2以测试与设置指令来实现锁 109
9.3以非繁忙等待、中断启用与禁止来实现锁 111
9.4以最少繁忙等待、测试与设置来实现锁 113
9.5中断禁止、测试与设置 116
思考题 117
第10章 死锁应对 118
引子 118
10.1发生死锁的原因 118
10.2死锁的描述 120
10.3死锁的4个必要条件 121
10.4哲学家就餐问题 122
10.5死锁的应对 122
10.6消除死锁的必要条件 128
10.7银行家算法:冒险的代价 130
10.8哲学家就餐问题之解 132
10.9讨论:死锁的思考——综合治理 134
10.10讨论:死锁、活锁与饥饿 134
思考题 135
第三篇 内存原理篇 138
第11章 基本内存管理 138
引子 138
11.1内存管理的环境 139
11.2内存管理的目标 140
11.3虚拟内存的概念 140
11.4操作系统在内存的位置 142
11.5单道编程的内存管理 143
11.6多道编程的内存管理 144
11.7闲置空间管理 150
思考题 152
第12章 页式内存管理 153
引子 153
12.1基址极限管理模式的问题 154
12.2分页内存管理 156
12.3分页系统的优缺点 160
12.4翻译速度 161
12.5缺页中断处理 163
12.6锁住页面 163
12.7页面尺寸 164
12.8内存抖动 165
思考题 167
第13章 页面更换算法 168
引子 168
13.1页面需要更换 169
13.2页面更换的目标 169
13.3随机更换算法 170
13.4先进先出算法 170
13.5第二次机会算法 171
13.6时钟算法 172
13.7最优更换算法 172
13.8 NRU算法 173
13.9 LRU算法 174
13.10工作集算法 179
13.11工作集时钟算法 181
13.12页面替换策略 181
思考题 182
第14章 段式内存管理 184
引子 184
14.1分页系统的缺点 185
14.2分段管理系统 186
14.3分段的优缺点 188
14.4段页式内存管理 189
14.5段号是否占用寻址字位 190
14.6讨论:否定之否定的嵌套——纯粹分段与逻辑分段、分页与段页 191
思考题 192
第四篇 文件原理篇 194
第15章 磁盘操作 194
引子 194
15.1磁盘组织与管理 195
15.2磁盘的结构 195
15.3盘面的结构 196
15.4磁盘驱动器的访问速度 197
15.5操作系统界面 198
15.6磁盘调度算法 199
思考题 202
第16章 文件基础 203
引子 203
16.1为什么需要文件系统 203
16.2什么是文件系统 204
16.3文件系统的目标 205
16.4文件的基本知识 205
16.5从用户角度看文件系统 205
16.6地址独立的实现机制:文件夹 212
16.7文件系统调用 214
16.8内存映射的文件访问 215
思考题 216
第17章 文件系统实现 217
引子 217
17.1文件系统的布局 218
17.2文件的实现 219
17.3目录实现:地址独立的实现 226
17.4闲置空间管理 231
思考题 232
第18章 文件系统 233
引子 233
18.1文件系统访问控制 234
18.2主动控制:访问控制表 235
18.3能力表 236
18.4访问控制的实施 238
18.5文件系统性能 239
18.6提高系统性能的方法 245
18.7文件系统设计分析:日志结构的文件系统 248
18.8海量数据文件系统 250
思考题 251
第五篇I/O原理篇 254
第19章 输入输出 254
引子 254
19.1什么是输入输出 255
19.2输入输出的目的 256
19.3输入输出硬件 256
19.4输入输出软件 262
19.5 I/O软件分层 266
思考题 269
第六篇 多核原理篇 272
第20章 多核结构与内存 272
引子 272
20.1以量取胜 273
20.2多核基本概念 273
20.3多核的内存结构 277
20.4对称多处理器计算机的启动过程 279
20.5多处理器之间的通信 279
20.6 SMP缓存一致性 281
20.7多处理器、超线程和多核的比较 281
思考题 282
第21章 多核环境下的进程同步与调度 283
引子 283
21.1多核环境下操作系统的修正 284
21.2多核环境下的进程同步与调度 284
21.3多核进程同步 284
21.4硬件原子操作 285
21.5总线锁 285
21.6多核环境下的软件同步原语 286
21.7旋锁 286
21.8其他同步原语 289
21.9多核环境下的进程调度 289
21.10多核环境下的能耗管理 292
21.11讨论:多核系统的性能 293
思考题 295
第七篇 操作系统设计原理篇 298
第22章 操作系统设计之原理 298
引子 298
22.1操作系统设计的追求 300
22.2操作系统设计的第1条哲学原理:层次架构 300
22.3操作系统设计的第2条哲学原理:没有对错 301
22.4操作系统设计的第3条哲学原理:懒人哲学 302
22.5操作系统设计的第4条哲学原理:让困于人 303
22.6操作系统设计的第5条哲学原理:留有余地 304
22.7操作系统设计的第6条哲学原理:子虚乌有——海市蜃楼之美 305
22.8操作系统设计的第7条哲学原理:时空转换——沧海桑田之变 305
22.9操作系统设计的第8条哲学原理:策机分离与权利分离 305
22.10操作系统设计的第9条哲学原理:简单为美——求于至简、归于永恒 306
22.11操作系统设计的第10条哲学原理:适可而止 306
思考题 307
结语 308
参考文献 310