第1章 引论 1
1.1 计算机系统概述 1
1.1.1 计算机的硬件组织 1
1.1.2 软件的层次与虚拟机的概念 3
1.2 操作系统的形成和发展 4
1.2.1 什么是操作系统 4
1.2.2 操作系统的形成和发展 5
1.3 多道程序设计的概念 6
1.3.1 多道程序设计的引入 6
1.3.2 多道程序设计的概念 7
1.4 操作系统的功能和特性 8
1.4.1 操作系统的功能 8
1.4.2 操作系统的特性 10
1.5 操作系统的类型 10
1.5.1 多道批处理操作系统 11
1.5.2 分时操作系统 11
1.5.3 实时系统 12
1.5.4 网络操作系统 13
1.5.5 多处理操作系统 14
1.5.6 分布式操作系统 15
1.5.7 嵌入式操作系统 15
1.5.8 多核系统 15
1.6 操作系统的设计 16
1.6.1 设计的目标和原则 16
1.6.2 操作系统设计 17
1.7 操作系统的结构 18
1.7.1 模块接口法 18
1.7.2 层次结构设计法 20
1.7.3 微内核结构 22
1.7.4 微内核的实现 24
本章小结 25
习题 26
第2章 操作系统的运行环境 28
2.1 硬件环境 28
2.1.1 中央处理器 28
2.1.2 主存储器 31
2.1.3 缓冲技术 33
2.1.4 中断技术 34
2.1.5 时钟、时钟队列 37
2.2 操作系统与其他系统软件的关系 39
2.2.1 作业、作业步、进程的关系 39
2.2.2 重定位的概念 40
2.2.3 绝对装入程序与相对装入程序 41
2.3 操作系统与用户的接口 43
2.3.1 作业控制语言 43
2.3.2 联机作业控制 45
2.4 固件——微程序设计概念 47
2.4.1 微程序设计的概念 47
2.4.2 微程序设计与操作系统 48
本章小结 48
习题 49
第3章 进程管理 50
3.1 进程的概念 50
3.1.1 进程的引入 50
3.1.2 进程的定义 51
3.2 进程的状态 52
3.2.1 进程的状态及其变化 52
3.2.2 进程的挂起和解除挂起的状态 54
3.3 进程的描述和管理 56
3.3.1 进程的描述 56
3.3.2 进程管理 57
3.4 进程控制 58
3.4.1 进程的控制原语 58
3.4.2 操作系统与进程控制的执行 61
3.5 UNIX SVR4的进程管理 63
本章小结 66
习题 67
第4章 多线程 68
4.1 线程的概念 68
4.1.1 线程的引入 68
4.1.2 线程的概念 69
4.2 线程的状态和线程管理 71
4.2.1 线程的状态 71
4.2.2 线程的描述 72
4.2.3 线程的管理 74
4.3 多线程的实现 75
4.3.1 概述 75
4.3.2 用户级线程 76
4.3.3 内核级线程 78
4.3.4 KLT和ULT结合的方法 79
4.3.5 线程库 79
4.4 Solaris操作系统的线程机制 80
4.4.1 Solaris的多线程结构 80
4.4.2 轻质进程 81
4.4.3 内核线程 82
4.4.4 用户线程 82
4.4.5 线程的执行 82
4.4.6 内核中断线程 84
本章小结 84
习题 85
第5章 互斥与同步 86
5.1 概述 86
5.2 临界区 87
5.2.1 临界区的提出 88
5.2.2 临界区的互斥要求 89
5.3 互斥 90
5.3.1 互斥的软件解决方法 90
5.3.2 互斥的硬件解决方法 92
5.4 信号量 94
5.4.1 信号量 94
5.4.2 信号量及同步原语 94
5.4.3 同步原语的不可分割性 96
5.4.4 用信号量实现进程间互斥 96
5.4.5 生产者和消费者问题 96
5.4.6 读者和写者问题 98
5.5 管程 99
5.5.1 管程的定义 99
5.5.2 用管程实现同步 100
5.6 进程间的通信 102
5.6.1 消息通信 102
5.6.2 间接通信模式 103
5.6.3 其他消息通信模式 104
5.7 UNIX的进程同步和通信 105
5.7.1 管道 105
5.7.2 消息 106
5.7.3 共享主存 107
5.7.4 信号量 108
5.7.5 信号或软中断 109
本章小结 110
习题 110
第6章 死锁 112
6.1 死锁问题的提出 112
6.2 死锁的必要条件 113
6.2.1 资源的概念 113
6.2.2 死锁的必要条件 114
6.3 死锁的预防 115
6.3.1 预先静态分配法 115
6.3.2 有序资源使用法 115
6.4 死锁的避免和银行家算法 116
6.4.1 单资源的银行家算法 116
6.4.2 多资源的银行家算法 117
6.5 死锁检测与恢复 120
6.5.1 死锁的检测 120
6.5.2 死锁的恢复 121
6.6 资源分配图 121
6.6.1 资源分配图 121
6.6.2 利用资源分配图进行死锁分析 122
6.6.3 资源分配图化简法 123
本章小结 124
习题 124
第7章 实存储器管理技术 126
7.1 引言 126
7.1.1 主存储器的物理组织 126
7.1.2 主存储器的管理功能 127
7.2 固定分区 127
7.3 可变分区多道管理技术 129
7.3.1 可变分区存储管理的概念 129
7.3.2 存储分配算法 131
7.3.3 存储器的压缩和程序浮动 132
7.3.4 可变分区多道管理的地址变换 132
7.4 简单分页 134
7.5 简单分段 136
7.6 内核主存管理 138
7.6.1 内核主存管理概述 138
7.6.2 二次幂空闲表分配器 139
7.6.3 伙伴系统 139
本章小结 140
习题 141
第8章 虚拟存储管理 143
8.1 虚拟存储系统的基本概念 143
8.2 请求页式存储管理 144
8.2.1 地址转换 144
8.2.2 硬件支持 148
8.3 请求分段存储管理 150
8.3.1 请求分段概述 150
8.3.2 分段的实现 151
8.4 段页式存储管理 152
8.4.1 请求段页式存储管理的基本概念 152
8.4.2 请求段页式存储管理的地址转换 152
8.4.3 段页式存储管理算法 154
8.4.4 请求段页式存储管理的优缺点 155
8.5 页面置换算法 156
8.5.1 页面访问失效及处理 156
8.5.2 页面置换算法 156
8.5.3 交换区 159
8.6 页框分配策略 160
8.6.1 物理主存 160
8.6.2 空闲页面链表 160
8.6.3 页架分配中的有关策略 160
8.6.4 分页环境中程序的行为特性 163
8.7 UNIX SVR4的存储管理 164
本章小结 166
习题 167
第9章 设备管理 169
9.1 概述 169
9.2 I/O子系统的层次模型 170
9.2.1 I/O子系统的设计目标 170
9.2.2 I/O子系统的层次模型 171
9.3 I/O硬件组成 172
9.3.1 设备和设备控制器 172
9.3.2 直接存储器访问 174
9.3.3 通道方式与输入输出处理器 175
9.4 设备驱动程序 176
9.4.1 设备和驱动程序分类 176
9.4.2 设备开关表 176
9.4.3 设备驱动程序框架 178
9.5 I/O子系统 179
9.5.1 设备命名 180
9.5.2 输入输出缓冲区 181
9.5.3 I/O子系统独立于设备的工作 183
9.6 流 184
9.6.1 流的概念 184
9.6.2 消息和队列 186
9.6.3 流I/O 188
9.7 磁盘调度 189
9.7.1 磁盘的硬件特性 189
9.7.2 磁盘调度算法 191
9.8 虚拟设备和SPOOLing系统 195
9.9 RAID技术 196
本章小结 198
习题 199
第10章 文件系统 201
10.1 文件 202
10.1.1 文件的命名 202
10.1.2 文件的结构 202
10.1.3 文件的类型 204
10.1.4 文件的属性 205
10.1.5 文件的操作 206
10.2 目录 207
10.2.1 目录内容 207
10.2.2 文件目录的结构 208
10.2.3 路径名 211
10.2.4 符号链接 212
10.2.5 目录操作 213
10.3 文件系统的实现 213
10.3.1 文件空间的分配和管理 213
10.3.2 UNIX系统的目录实现 217
10.3.3 磁盘空间管理 217
10.3.4 文件系统在主存的数据结构和打开操作 219
10.3.5 文件系统挂载 220
10.4 安全性和保护 221
10.4.1 用户确认技术 222
10.4.2 保护机制——数据安全性 223
10.4.3 其他 224
10.4.4 文件的转储和恢复 225
本章小结 226
习题 226
第11章 分布式系统 228
11.1 概述 228
11.1.1 什么是分布式系统 228
11.1.2 分布式系统的优点 229
11.2 进程通信 230
11.2.1 进程通信的概念 230
11.2.2 TCP/IP通信协议 231
11.2.3 分布式环境的客户/服务器模式 234
11.2.4 分布式进程通信 236
11.3 分布式文件系统 240
11.3.1 分布式文件系统概述 240
11.3.2 分布式文件系统的组成 241
11.3.3 分布式文件系统的体系结构 242
11.3.4 客户机高速缓存和一致性 244
11.4 分布式系统中的互斥与死锁 245
11.4.1 逻辑钟和逻辑时 246
11.4.2 时间戳算法(Lamport算法) 247
11.4.3 令牌传送算法 248
11.5 进程迁移 249
11.5.1 进程迁移的原因 249
11.5.2 进程迁移机制 249
本章小结 250
习题 250
第12章 Windows NT操作系统 252
12.1 Windows NT操作系统概述 252
12.2 Windows NT的系统模型 253
12.3 Windows NT的基元成分 256
12.3.1 对象 256
12.3.2 进程 258
12.3.3 线程 260
12.3.4 进程管理程序 262
12.4 Windows NT的线程状态及调度 263
12.4.1 线程状态转换 263
12.4.2 内核调度程序 264
12.4.3 进程和线程的优先级 265
12.5 Windows NT的同步对象 266
12.5.1 线程同步概述 266
12.5.2 用Windows NT对象同步 267
12.6 虚拟存储管理 269
12.6.1 进程的虚拟地址空间 269
12.6.2 虚拟分页 270
12.6.3 页面调度策略和工作集 273
12.6.4 页架状态和页架数据结构 274
12.6.5 主存映射文件和视图 275
12.7 输入输出系统 278
12.7.1 输入输出系统的结构 278
12.7.2 统一的驱动程序模型 279
12.7.3 异步I/O操作和I/O请求处理过程 280
12.7.4 映像文件I/O 280
12.8 Windows NT的内装网络 281
12.8.1 Windows NT内装网络的特色 281
12.8.2 Windows NT内装网络的体系结构 281
12.9 对象管理程序 282
12.10 本地过程调用 283
12.11 Windows NT的安全性 284
12.11.1 Windows NT的安全性 284
12.11.2 存取令牌和安全描述体 284
本章小结 285
习题 286
第13章 Linux操作系统 287
13.1 Linux操作系统概述 287
13.1.1 Linux的诞生和发展 287
13.1.2 Linux的版本 287
13.1.3 Linux内核的组成 288
13.1.4 Linux的特点 290
13.2 Linux进程管理 291
13.2.1 Linux进程概述 291
13.2.2 Linux进程的状态 292
13.2.3 Linux进程的标识 293
13.2.4 Linux进程的调度 294
13.2.5 Linux进程的创建和撤销 295
13.3 Linux的存储管理 296
13.3.1 Linux的虚拟存储空间 296
13.3.2 Linux的地址映射 297
13.3.3 Linux物理内存的管理 298
13.3.4 页面分配算法 298
13.3.5 缺页中断 300
13.3.6 缓存和刷新机制 301
13.4 Linux文件管理 301
13.4.1 Linux虚拟文件系统概述 301
13.4.2 VFS超级块 302
13.4.3 VFS索引节点对象 303
13.4.4 目录项对象 307
13.4.5 文件对象 308
13.5 EXT文件系统 308
13.5.1 EXT2/EXT3/EXT4文件系统的特点 309
13.5.2 EXT2文件系统的磁盘结构 310
13.5.3 EXT2超级块 311
13.5.4 组描述符 312
13.5.5 块位图 313
13.5.6 EXT2文件系统inode结构 313
13.5.7 Linux文件系统的控制 316
13.6 Linux设备管理 319
13.6.1 Linux设备管理概述 319
13.6.2 Linux I/O子系统的设计 320
13.6.3 Linux的字符设备管理 321
13.6.4 Linux的块设备管理 322
13.6.5 缓冲区与buffer结构 323
本章小结 324
习题 325
参考文献 326