第1部分 原理篇 2
第1章 操作系统概论 2
1.1 什么是操作系统 2
1.2 操作系统的发展历史 3
1.2.1 早期的计算机和人工操作方式 3
1.2.2 脱机输入/输出和批处理系统 4
1.2.3 缓冲、中断和DMA技术 4
1.2.4 SPOOLING 5
1.2.5 多道程序设计 6
1.3 现代操作系统类型 7
1.3.1 分时系统 7
1.3.2 实时操作系统 8
1.3.3 微机操作系统 8
1.3.4 多处理机、分布式和网络操作系统 10
1.4 操作系统的概念、特征和功能 11
1.4.1 作业和进程 11
1.4.2 操作系统的特征 11
1.4.3 操作系统的功能 12
1.5 UNIX操作系统概述 14
1.5.1 UNIX系统历史 14
1.5.2 UNIX系统特点 15
1.5.3 UNIX系统基本结构 16
习题1 17
第2章 存储管理 18
2.1 存储管理基础 18
2.1.1 虚拟地址与物理地址 18
2.1.2 地址定位方式 18
2.2 基本存储管理方法 20
2.2.1 单一连续区存储管理 20
2.2.2 固定分区存储管理 21
2.3 可变分区存储管理 22
2.3.1 空闲存储区表 22
2.3.2 首次适应法 23
2.3.3 循环首次适应法 25
2.3.4 最佳适应算法 25
2.3.5 最差适应法 26
2.3.6 多重分区 26
2.4 内存扩充技术 26
2.4.1 覆盖 26
2.4.2 交换技术 27
2.4.3 虚拟存储器 28
2.5 纯分页的存储管理 29
2.5.1 分页存储管理的基本思想 29
2.5.2 地址变换 30
2.5.3 联想存储器和快表 30
2.5.4 空闲内存页的管理 31
2.6 请求分页系统 32
2.6.1 请求分页的基本原理 32
2.6.2 页面淘汰 32
2.7 段式存储管理 35
2.8 段页式存储管理 36
2.9 Linux存储管理 37
2.9.1 Linux存储管理的思想及特点 37
2.9.2 Linux中的页表 38
2.9.3 页面的分配和回收 38
2.9.4 存储映射与请求分页 40
2.9.5 页交换进程与页面的换入换出 41
习题2 42
第3章 进程管理 43
3.1 进程概述 43
3.1.1 进程的概念 43
3.1.2 进程的组成 43
3.1.3 进程的状态及其变化 44
3.2 进程控制块 45
3.3 调度 50
3.3.1 调度概述 50
3.3.2 进程调度策略 51
3.3.3 进程调度算法 51
3.4 UNIX系统的进程调度 54
3.4.1 进程的切换调度算法 54
3.4.2 切换调度程序 56
3.4.3 进程的对换调度 57
3.5 进程的控制 58
3.5.1 进程的挂起 58
3.5.2 UNIX系统中的进程睡眠和唤醒 58
3.5.3 进程的终止和等待终止 61
3.6 进程的创建和图像改换 62
3.6.1 进程的创建 62
3.6.2 进程图像的改换 63
3.7 线程 64
3.7.1 进程和线程 65
3.7.2 多线程 65
3.7.3 线程的状态与功能 66
3.7.4 用户级和核心级线程 67
3.8 Linux进程管理 69
3.8.1 Linux进程结构 69
3.8.2 进程调度 71
3.8.3 进程使用的虚拟内存 73
3.8.4 创建进程 73
3.8.5 Linux的线程 74
习题3 75
第4章 进程通信 77
4.1 进程的同步与互斥 77
4.1.1 同步与互斥的概念 77
4.1.2 临界段问题 77
4.2 进程间互斥控制方法 78
4.2.1 锁的表示和操作 78
4.2.2 锁的安全控制 78
4.2.3 用纯软件实现进程的互斥 80
4.3 信号灯和Wait、Signal操作 82
4.4 信号灯的应用 83
4.4.1 利用信号灯实现互斥 83
4.4.2 阻塞/唤醒协议 84
4.4.3 两个进程间的同步 85
4.4.4 生产者和消费者问题 86
4.4.5 读者/写者问题 87
4.5 进程间的数据通信 88
4.5.1 消息通信 88
4.5.2 共享存储区 88
4.5.3 管道通信 89
4.6 软中断和信号机构 90
4.6.1 信号的产生与类型 90
4.6.2 信号的处理方式及设置 91
4.6.3 信号的传送 92
4.7 死锁 93
4.7.1 产生死锁的原因 93
4.7.2 产生死锁的条件 94
4.7.3 死锁的预防 95
4.7.4 死锁的避免 96
4.7.5 死锁的检测 97
4.7.6 死锁的解除 98
4.8 Linux进程间通信 99
4.8.1 信号 99
4.8.2 管道 101
4.8.3 IPC机制 102
习题4 104
第5章 设备管理 106
5.1 引言 106
5.1.1 设备的概念和分类 106
5.1.2 I/O设备控制与驱动 107
5.1.3 设备管理的设计要求和任务 108
5.2 操作系统与中断处理 108
5.2.1 中断的基本概念 108
5.2.2 中断的类型 109
5.2.3 中断的响应和实现过程 111
5.2.4 中断处理程序和驱动程序 111
5.2.5 中断的返回与恢复 112
5.3 操作系统与时钟系统 113
5.3.1 时钟的概念 113
5.3.2 UNIX系统中的时钟管理 113
5.4 操作系统对I/O操作的控制 114
5.4.1 I/O设备的资源分配 114
5.4.2 I/O通道技术 115
5.4.3 I/O缓冲技术 115
5.4.4 设备的驱动 116
5.5 设备管理的数据结构 116
5.5.1 设备控制表 116
5.5.2 设备开关表 117
5.6 磁盘调度 118
5.6.1 物理特性 118
5.6.2 磁盘调度算法 118
5.6.3 系统设计应考虑的几个问题 120
5.7 UNIX系统V的设备管理 120
5.7.1 块设备管理的主要数据结构 121
5.7.2 缓冲区管理 122
5.7.3 块设备管理 126
5.7.4 字符设备管理 128
5.8 设备分配 129
5.8.1 设备分配方式 130
5.8.2 设备分配的原则 130
5.9 Linux的设备管理 131
5.9.1 概述 131
5.9.2 设备驱动器与内核的接口 132
5.9.3 网络设备的管理 134
习题5 135
第6章 文件系统 136
6.1 概述 136
6.1.1 文件的术语 136
6.1.2 文件的操作 137
6.1.3 文件的组织和存取 137
6.1.4 文件系统结构 140
6.2 文件目录 141
6.2.1 目录的内容 141
6.2.2 目录的结构 142
6.2.3 存取权限 143
6.2.4 并发存取控制 143
6.3 文件存储资源分配 144
6.4 文件的系统调用 145
6.4.1 文件的创建、打开、关闭和取消 146
6.4.2 文件的读/写 148
6.4.3 调整文件读/写位置lseek 149
6.4.4 创建任何类型文件mknod 149
6.4.5 其他的文件系统调用 150
6.5 文件的标准子例程 151
6.5.1 标准I/O的概念 151
6.5.2 流文件的打开和关闭 152
6.5.3 流文件的读写 153
6.5.4 调整和获取流文件的读写位置 154
6.5.5 格式输入与输出 154
6.5.6 流的单字符I/O操作 155
6.5.7 行的输入与输出 156
6.5.8 存储区中的格式转化 156
6.5.9 程序的执行 156
6.6 UNIX文件系统的内部结构 157
6.6.1 索引节点 157
6.6.2 文件索引结构 157
6.6.3 目录结构 159
6.6.4 打开文件结构 160
6.6.5 文件系统存储资源管理 162
6.7 管道文件和管道通信 166
6.7.1 管道通信概念 166
6.7.2 管道文件 166
6.7.3 管道的读写和关闭 167
6.7.4 有名管道 168
6.8 Linux文件系统 170
6.8.1 虚拟文件系统 170
6.8.2 Ext2文件系统 174
6.8.3 Ext3文件系统 177
习题6 177
第7章 Windows操作系统 179
7.1 Windows操作系统发展历程 179
7.1.1 Windows的开发过程及历史 179
7.1.2 Windows主要版本的特点 179
7.2 Windows 2000/XP 181
7.2.1 系统体系结构 181
7.2.2 存储系统 184
7.2.3 进程、线程及处理器管理 190
7.2.4 I/O系统 194
7.2.5 文件系统 197
7.2.6 网络系统 200
7.3 Windows 2003 204
7.3.1 系统概述 204
7.3.2 系统功能更新 205
7.4 基于Windows的企业网规划与构建 209
7.4.1 活动目录规划 209
7.4.2 组策略规划 212
7.4.3 安全管理规划 214
7.5 小结 216
习题7 216
第8章 分布式和网络操作系统 217
8.1 分布式操作系统概述 217
8.2 网络通信机制 220
8.3 网络同步 222
8.4 网络操作系统 223
习题8 224
第2部分 应用和开发篇 226
第9章 UNIX使用基础 226
9.1 登录和退出系统 226
9.2 Shell基础 227
9.2.1 Shell的家族 227
9.2.2 简单命令和命令表 227
9.2.3 标准输入和标准输出 228
9.2.4 输入/输出转向 228
9.2.5 后台命令与后台进程 229
9.2.6 管道 230
9.2.7 特殊字符 230
9.3 文件系统基本知识 231
9.3.1 文件的类型 231
9.3.2 目录结构 232
9.3.3 文件存取控制模式 232
9.3.4 目录存取方式 233
9.4 UNIX文件系统结构 233
9.4.1 根文件系统结构 234
9.4.2 /usr文件系统 234
习题9 235
第10章 UNIX实用程序 236
10.1 目录操作命令 236
10.1.1 显示工作目录(pwd命令) 236
10.1.2 改变工作目录(cd命令) 236
10.1.3 列目录内容(ls命令) 236
10.1.4 创建新目录(mkdir命令) 237
10.1.5 删除目录项(rmdir命令) 237
10.2 文件操作命令 237
10.2.1 复制文件(cp命令) 237
10.2.2 移动或重新命名文件(mv命令) 238
10.2.3 删除文件(rm命令) 238
10.2.4 文件的链接(ln命令) 238
10.2.5 符号链接(ln-s命令) 238
10.2.6 报告两个文件的差别(diff命令) 239
10.2.7 推测文件的类型(file命令) 240
10.2.8 查找文件(find命令) 240
10.2.9 改变文件的属主(chown命令) 241
10.2.10 改变文件的存取权限(chmod命令) 241
10.2.11 设置文件创建方式屏蔽码(umask命令) 242
10.2.12 存取DOS文件命令 242
10.3 显示和打印命令 243
10.3.1 回应命令行上的参数(echo命令) 243
10.3.2 连接并显示文件(cat命令) 243
10.3.3 分页显示(more命令和pg命令) 243
10.3.4 显示文件的头部(head命令)和尾部(tail命令) 244
10.3.5 打印文件(lp命令) 244
10.3.6 查看打印作业状态(lpstat命令) 245
10.3.7 取消一个打印作业(cancel命令) 245
10.3.8 格式化打印文件(pr命令) 245
10.3.9 卸出文件(od命令) 245
10.4 过滤器 246
10.4.1 正则表达式 246
10.4.2 排序或合并文件(sort命令) 248
10.4.3 抽取指定模式的行(grep命令) 249
10.4.4 流编辑程序(sed命令) 250
10.4.5 模式扫描和处理语言(awk) 251
10.4.6 裁剪指定的列(cut命令) 252
10.4.7 组合数据列(paste命令) 252
10.4.8 建立“三通”(tee命令) 253
10.5 设备操作 253
10.5.1 显示或设置日期和时间(date命令) 253
10.5.2 显示磁盘空间(df命令) 254
10.5.3 显示磁盘使用情况(du命令) 254
10.5.4 显示或设置终端参数(stty命令) 254
10.5.5 磁带归档(tar命令) 255
10.6 用户信息与进程控制 256
10.6.1 获取用户信息 256
10.6.2 显示进程状态(ps命令) 256
10.6.3 挂起一段时间(sleep命令) 257
10.6.4 统计一个作业的执行时间(time命令) 257
10.6.5 等待进程完成(wait命令) 257
10.6.6 杀死一个进程(kill命令) 257
10.6.7 忽略挂起和退出方法执行(nohup命令) 257
10.6.8 设置命令的执行环境(env命令) 258
10.7 压缩和解压缩 258
10.7.1 compress 258
10.7.2 zip 258
10.7.3 gzip 259
10.7.4 pack 260
10.8 其他命令 260
10.8.1 联机手册(man命令) 260
10.8.2 检查拼写错误(spell命令) 261
10.8.3 文件加密crypt命令和des命令 261
10.8.4 规范化C程序格式(cb命令) 261
习题10 262
第11章 软件开发工具 263
11.1 文本编辑器vi 263
11.1.1 vi概要 263
11.1.2 屏幕编辑命令 264
11.1.3 底行命令 268
11.1.4 在vi程序中执行Shell命令 271
11.2 C编译系统 272
11.2.1 C编译基本过程 272
11.2.2 预处理程序 273
11.2.3 编译程序 275
11.2.4 汇编程序 275
11.2.5 连接/装入程序 275
11.2.6 一个使用cc的综合例子 277
11.3 库的维护 277
11.3.1 库的概念 277
11.3.2 库的维护 278
11.3.3 动态库 279
11.4 维护程序的程序(Make) 280
11.4.1 Make使用初步 280
11.4.2 Make的内部规则 282
11.4.3 Make中的宏 283
11.4.4 用Make维护库 284
11.4.5 一个综合例子 285
11.4.6 Make命令选项和参数 287
11.5 调试程序 288
11.5.1 调用sdb 288
11.5.2 sdb的调试命令 288
11.5.3 删除调试信息strip 290
11.6 源代码控制系统(SCCS) 290
11.6.1 创建SCCS的初始版本 290
11.6.2 提取一个版本 291
11.6.3 建立一个新版本 292
11.6.4 显示SCCS文件的历史 292
11.6.5 SCCS的版本号结构 292
11.6.6 ID关键字 293
11.6.7 其他的SCCS的命令 294
11.7 其他的软件开发工具 294
11.7.1 C程序检查器Lint 294
11.7.2 词法分析器和语法分析器 294
习题11 295
第12章 UNIX通信与环球网WWW 296
12.1 检查计算机的连接情况 296
12.2 获取远程用户信息 296
12.2.1 显示谁在本地计算机登录(rwho) 296
12.2.2 显示远程用户的信息(finger) 297
12.2.3 用户名目录服务(whois) 297
12.3 用户间通话 297
12.3.1 给用户发信息(write) 297
12.3.2 广播式的消息传送工具(Wall) 298
12.3.3 远程用户对话(talk) 298
12.4 远程登录和执行 298
12.4.1 基于UNIX系统的远程登录(RLogin) 299
12.4.2 通用的远程登录(telnet) 299
12.4.3 远程Shell(RSH) 299
12.5 远程文件拷贝和传输 300
12.5.1 远程文件拷贝(RCP) 300
12.5.2 文件传输(FTP) 301
12.6 环球网WWW和浏览器 302
12.6.1 超文本和超媒体 303
12.6.2 超文本传输协议HTTP 303
12.6.3 统一资源定位器URL 303
12.6.4 超文本标记语言HTML 304
12.6.5 Form与CGI 305
12.6.6 网站设计语言 305
12.6.7 WWW的浏览程序 306
习题12 308
第13章 UNIX系统程序设计 309
13.1 文件系统程序设计 309
13.1.1 获取文件的状态 309
13.1.2 搜索目录树 310
13.2 用文件的系统调用实现进程通信 312
13.2.1 利用文件的系统调用实现信号灯 312
13.2.2 利用管道实现进程间通信 314
13.3 高级进程间通信 316
13.3.1 消息通信 316
13.3.2 共享内存 319
13.3.3 信号灯 320
13.4 远程进程间通信 323
13.4.1 Socket通信概述 323
13.4.2 Socket系统调用 324
13.4.3 Socket通信程序设计 326
13.5 一个系统程序综合设计的例子 329
习题13 340
第14章 Shell程序设计 341
14.1 Shell程序和参数 341
14.1.1 Shell程序 341
14.1.2 Shell程序的位置参数 342
14.2 Shell变量 342
14.2.1 用户定义变量 342
14.2.2 系统定义变量 343
14.2.3 Shell定义变量 345
14.2.4 参数替换 345
14.2.5 引号机制 346
14.3 测试和求值 346
14.3.1 测试 346
14.3.2 求值 348
14.4 控制结构 348
14.4.1 顺序控制结构 348
14.4.2 if语句 349
14.4.3 case语句 351
14.4.4 for语句 352
14.4.5 while和until语句 353
14.4.6 break、continue、exit和return语句 354
14.4.7 递归 354
14.5 Shell内部命令 354
14.6 Shell函数 357
14.7 Shell环境 357
14.8 Linux的BASH Shell 358
14.8.1 命令编辑和历史 359
14.8.2 别名和特征变量 360
14.8.3 BASH Shell的环境文件 360
习题14 361
第15章 嵌入式Linux操作系统 362
15.1 Linux与嵌入式操作系统 362
15.1.1 嵌入式系统的定义 362
15.1.2 嵌入式操作系统的特点 363
15.1.3 嵌入式Linux发展与应用 364
15.1.4 嵌入式Linux操作系统实现方法 365
15.2 嵌入式Linux操作系统构建 365
15.2.1 Linux系统的软件层次 365
15.2.2 裁剪编译内核 366
15.2.3 准备Root文件系统 367
15.2.4 Root文件系统裁剪 368
15.2.5 制作root文件系统映像 370
15.3 嵌入式Linux操作系统安装 372
15.3.1 嵌入式系统的启动 372
15.3.2 安装嵌入式系统引导程序 373
15.3.3 x86系统上嵌入式Linux映像安装 375
15.4 嵌入式Linux软件开发与调试 377
15.4.1 开发系统与目标系统 377
15.4.2 交叉编译环境 378
15.4.3 嵌入式Linux软件调试方法 380
15.5 嵌入式Linux操作系统实时性 382
15.5.1 嵌入式操作系统的实时性要求 382
15.5.2 Linux内核与实时性 384
15.5.3 嵌入式Linux实时化技术 386
习题15 388
第3部分 系统和网络管理篇 390
第16章 UNIX系统管理 390
16.1 系统的启动和关闭 390
16.1.1 系统自举 390
16.1.2 系统的运行级 390
16.1.3 初始化程序执行的脚本(inittab) 391
16.1.4 系统初始化过程 392
16.1.5 系统的关闭 392
16.2 用户管理 393
16.2.1 用户管理涉及的文件 393
16.2.2 加入新用户的过程 394
16.2.3 添加用户命令(useradd) 395
16.2.4 删除用户的注册(userdel) 395
16.3 誊清(更新)系统缓冲区 396
16.4 检查和修复文件系统 396
16.5 构造、安装和拆卸文件系统 398
16.5.1 建立特别文件(mknod) 398
16.5.2 构造文件系统(mkfs) 398
16.5.3 安装文件系统(mount) 399
16.5.4 拆卸一个文件系统(umount) 399
16.6 定时运行程序 400
16.6.1 在指定时刻运行Shell程序(at) 400
16.6.2 时钟精灵(cron) 400
习题16 401
第17章 UNIX系统网络管理 402
17.1 配置TCP/IP 402
17.1.1 网络软件的安装 402
17.1.2 设置TCP/IP文件 402
17.1.3 设置监听程序 404
17.2 网络服务监控进程 405
17.3 域名服务系统 406
17.3.1 域名服务 406
17.3.2 域名系统 406
17.3.3 域名解析 407
17.3.4 逆向域名解析 407
17.3.5 DNS数据库 408
17.3.6 域名服务器的配置 409
17.4 网络文件系统NFS 410
17.4.1 NFS的概念和原理 410
17.4.2 NFS服务器的设置 410
17.4.3 NFS客户机的设置 411
17.5 电子邮政系统 413
17.5.1 邮件信箱 413
17.5.2 电子邮政设置文件 413
17.5.3 sendmail的设置文件 414
17.5.4 sendmail命令的参数 416
17.6 WWW服务器的配置 416
17.6.1 WWW服务 417
17.6.2 虚拟主机服务 420
17.6.3 代理服务器 421
习题17 421
参考文献 423