第1章 操作系统概述 1
1.1 操作系统简介 1
1.1.1 计算机系统层次结构 1
1.1.2 操作系统的定义 3
1.1.3 操作系统的发展 3
1.2 操作系统的功能 6
1.2.1 操作系统在计算机系统中的地位及运行环境 6
1.2.2 操作系统的特征 6
1.2.3 操作系统的功能 8
1.2.4 操作系统的结构设计模式 9
1.2.5 操作系统的设计规范 11
1.3 操作系统的分类和发展 12
1.3.1 操作系统的分类 12
1.3.2 操作系统的发展 16
1.3.3 操作系统的实例 18
1.4 操作系统的实现 21
1.4.1 操作系统开发与升级 21
1.4.2 操作系统的安装 21
1.4.3 系统启动与关机 22
本章小结 22
习题1 23
第2章 Linux操作系统简介 26
2.1 Linux操作系统概述 26
2.1.1 Linux操作系统的历史 26
2.1.2 Linux操作系统的特点 27
2.1.3 Linux操作系统的设计原理 29
2.1.4 Linux操作系统的内核模块 31
2.2 Linux操作系统的使用 33
2.2.1 Linux系统引导 33
2.2.2 文件存取权限和所有权限 41
2.2.3 常用命令 42
2.2.4 vi的用法 44
2.2.5 实例——Linux运行一个用户程序 46
本章小结 51
习题2 51
第3章 进程管理 53
3.1 并发控制 53
3.1.1 多道程序设计 53
3.1.2 程序的并发执行 54
3.2 进程的定义和特征 56
3.2.1 进程的定义 56
3.2.2 进程的特征 56
3.2.3 进程与程序的区别和联系 57
3.2.4 进程与作业的区别 58
3.2.5 操作系统与进程的控制执行 58
3.3 内核中进程的实现 61
3.3.1 进程控制块PCB 61
3.3.2 进程上下文 62
3.3.3 进程三态转换分析 63
3.3.4 进程的组织 65
3.3.5 内核创建进程 66
3.4 线程模型 69
3.4.1 多线程 70
3.4.2 内核线程和用户线程 70
3.4.3 线程与进程的主要区别 71
3.5 Linux的进程管理 71
3.5.1 Linux进程的组成 71
3.5.2 进程描述符 72
3.5.3 进程状态 72
3.5.4 进程链表 73
3.5.5 进程控制 74
3.5.6 Linux线程 74
3.5.7 Linux进程的创建与撤销 75
3.5.8 实例——使用库函数clone()与pthread_create()在Linux环境下创建两种不同执行模式的线程程序 77
3.5.9 实例——Linux操作系统下守护进程的编程方法 80
本章小结 83
习题3 84
第4章 进程控制 88
4.1 同步和互斥 88
4.1.1 并发问题 88
4.1.2 进程同步和互斥的基本概念 90
4.1.3 信号量机制 92
4.1.4 信号量的应用 93
4.2 经典的进程同步问题 95
4.2.1 生产者—消费者问题 96
4.2.2 哲学家进餐问题 97
4.2.3 读者—写者问题 98
4.3 管程机制 100
4.3.1 管程的定义 100
4.3.2 利用管程解决进程之间的同步与互斥 101
4.4 进程通信 102
4.4.1 进程通信的类型 103
4.4.2 消息缓冲通信 106
4.4.3 信箱通信机制 108
4.5 线程间的同步和通信 109
4.5.1 互斥锁 109
4.5.2 条件变量 109
4.5.3 信号量机制 110
4.6 Linux进程通信机制 110
4.6.1 信号 110
4.6.2 管道 111
4.6.3 消息队列 111
4.6.4 信号量 113
4.6.5 共享内存 114
本章小结 114
习题4 115
第5章 处理器调度 118
5.1 处理器调度的基本概念 118
5.1.1 作业的状态及三级调度的概念 118
5.1.2 调度队列模型 120
5.1.3 选择调度方式和算法的若干原则 121
5.2 调度算法 124
5.2.1 先来先服务和短作业(进程)优先调度算法 124
5.2.2 高优先权优先调度算法 125
5.2.3 基于时间片的轮转调度算法 128
5.2.4 反馈调度算法 128
5.2.5 Linux中的进程调度 130
5.2.6 实例——批处理操作系统中作业调度 131
本章小结 134
习题5 134
第6章 死锁 139
6.1 死锁的定义和死锁产生的必要条件 139
6.1.1 死锁的定义 139
6.1.2 死锁产生的必要条件 142
6.1.3 资源分配图 145
6.2 死锁的预防 146
6.3 死锁的避免 148
6.3.1 系统安全状态 148
6.3.2 银行家算法 149
6.4 死锁的检测和恢复 153
6.4.1 死锁的检测 153
6.4.2 死锁的解除 154
6.5 实例——银行家算法的模拟 155
本章小结 158
习题6 159
第7章 存储管理 164
7.1 存储管理概述 164
7.1.1 存储管理的基本概念 164
7.1.2 程序的装入和链接 165
7.1.3 重定位技术 168
7.1.4 存储管理的目的和功能 168
7.2 连续模式 170
7.2.1 覆盖与交换技术 170
7.2.2 单一连续区 171
7.2.3 固定式分区 172
7.2.4 可变式分区和动态存储分配技术 174
7.3 页式管理 180
7.3.1 基本的分页存储管理 180
7.3.2 虚拟存储器 186
7.3.3 请求分页存储管理 188
7.3.4 页面置换 192
7.4 分段管理 198
7.4.1 分段存储管理 198
7.4.2 段页式管理 200
7.4.3 请求分段存储管理方式 201
7.5 实例——请求页式存储管理中页面置换算法的模拟 203
7.6 Linux内存管理 209
7.6.1 Linux的内存管理原理 209
7.6.2 i386的页式主存管理机制 210
7.6.3 Linux主存管理的基本框架 211
7.6.4 存储器管理中的几个重要数据结构 212
7.6.5 主存页框的调度 216
7.6.6 缺页异常处理 217
本章小结 217
习题7 218
第8章 设备管理 226
8.1 I/O系统 226
8.1.1 I/O设备 226
8.1.2 设备控制器 227
8.1.3 I/O通道 229
8.1.4 总线系统 230
8.2 I/O控制方式 231
8.2.1 程序I/O方式 231
8.2.2 中断控制方式 231
8.2.3 DMA控制方式 232
8.2.4 通道控制方式 233
8.2.5 中断技术 235
8.3 缓冲管理 238
8.3.1 缓冲技术的引入 238
8.3.2 缓冲区的分类 239
8.4 设备分配 242
8.4.1 设备分配中的数据结构 243
8.4.2 设备分配的原则 244
8.4.3 设备分配的独立性 246
8.4.4 设备分配的流程 247
8.4.5 SPOOLing技术 248
8.5 设备驱动程序 250
8.6 磁盘存储器管理 251
8.6.1 磁盘调度策略 252
8.6.2 磁盘容错技术 256
8.6.3 磁盘高速缓存 260
8.7 实例——独占设备的分配和回收模拟 261
8.8 Linux设备管理 265
8.8.1 设备驱动程序环境 265
8.8.2 设备文件 268
8.8.3 设备驱动程序概述 268
本章小结 269
习题8 270
第9章 外存管理和文件系统 276
9.1 文件的管理 276
9.1.1 文件基本概念 276
9.1.2 文件系统基本概念 278
9.1.3 文件的组织与存取 279
9.1.4 目录管理 284
9.1.5 外存空间空闲存储块的管理 290
9.1.6 文件的安全管理 294
9.1.7 文件的系统基本模型 298
9.2 虚拟文件系统 301
9.2.1 虚拟文件系统的设计思路 301
9.2.2 虚拟文件系统VFS框架 302
9.2.3 Linux虚拟文件系统的数据结构 302
9.2.4 对虚拟文件系统的管理 303
9.3 实例——文件系统模拟 304
本章小结 313
习题9 313
附录 实训练习 318
参考文献 340