Operating System Concepts Essentials, Second Edition
出版者的话
译者序
前言
第一部分 概论
第1章 导论 2
1.1 操作系统的功能 2
1.1.1 用户视角 2
1.1.2 系统视角 3
1.1.3 操作系统的定义 4
1.2 计算机系统的组成 4
1.2.1 计算机系统的运行 5
1.2.2 存储结构 6
1.2.3 I/O结构 8
1.3 计算机系统的体系结构 9
1.3.1 单处理器系统 9
1.3.2 多处理器系统 10
1.3.3 集群系统 12
1.4 操作系统的结构 13
1.5 操作系统的执行 14
1.5.1 双重模式与多重模式的执行 15
1.5.2 定时器 16
1.6 进程管理 17
1.7 内存管理 17
1.8 存储管理 18
1.8.1 文件系统管理 18
1.8.2 大容量存储器管理 19
1.8.3 高速缓存 19
1.8.4 I/O系统 21
1.9 保护与安全 21
1.10 内核数据结构 22
1.10.1 列表、堆栈及队列 22
1.10.2 树 23
1.10.3 哈希函数与哈希表 23
1.10.4 位图 24
1.11 计算环境 24
1.11.1 传统计算 24
1.11.2 移动计算 25
1.11.3 分布计算 26
1.11.4 客户机-服务器计算 26
1.11.5 对等计算 27
1.11.6 虚拟化 28
1.11.7 云计算 29
1.11.8 实时嵌入式系统 29
1.12 开源操作系统 30
1.12.1 历史 31
1.12.2 Linux 31
1.12.3 BSD UNIX 32
1.12.4 Solaris 32
1.12.5 用作学习的开源操作系统 33
1.13 小结 33
复习题 35
实践题 35
习题 35
推荐读物 36
参考文献 37
第2章 操作系统结构 38
2.1 操作系统的服务 38
2.2 用户与操作系统的界面 40
2.2.1 命令解释程序 40
2.2.2 图形用户界面 41
2.2.3 界面的选择 42
2.3 系统调用 43
2.4 系统调用的类型 46
2.4.1 进程控制 46
2.4.2 文件管理 49
2.4.3 设备管理 50
2.4.4 信息维护 50
2.4.5 通信 50
2.4.6 保护 51
2.5 系统程序 51
2.6 操作系统的设计与实现 52
2.6.1 设计目标 52
2.6.2 机制与策略 53
2.6.3 实现 53
2.7 操作系统的结构 54
2.7.1 简单结构 54
2.7.2 分层方法 55
2.7.3 微内核 56
2.7.4 模块 57
2.7.5 混合系统 58
2.8 操作系统的调试 60
2.8.1 故障分析 60
2.8.2 性能优化 60
2.8.3 DTrace 61
2.9 操作系统的生成 63
2.10 系统引导 64
2.11 小结 64
复习题 65
实践题 65
习题 65
编程题 66
编程项目 66
推荐读物 69
参考文献 70
第二部分 进程管理
第3章 进程 72
3.1 进程概念 72
3.1.1 进程 72
3.1.2 进程状态 73
3.1.3 进程控制块 73
3.1.4 线程 74
3.2 进程调度 75
3.2.1 调度队列 75
3.2.2 调度程序 77
3.2.3 上下文切换 78
3.3 进程运行 79
3.3.1 进程创建 79
3.3.2 进程终止 82
3.4 进程间通信 83
3.4.1 共享内存系统 85
3.4.2 消息传递系统 86
3.5 IPC系统例子 89
3.5.1 例子:POSIX共享内存 89
3.5.2 例子:Mach 91
3.5.3 例子:Windows 92
3.6 客户机/服务器通信 93
3.6.1 套接字 93
3.6.2 远程过程调用 96
3.6.3 管道 98
3.7 小结 102
复习题 103
实践题 103
习题 104
编程题 105
编程项目 107
推荐读物 110
参考文献 111
第4章 线程 112
4.1 概述 112
4.1.1 动机 112
4.1.2 优点 113
4.2 多核编程 114
4.2.1 编程挑战 115
4.2.2 并行类型 115
4.3 多线程模型 116
4.3.1 多对一模型 116
4.3.2 一对一模型 116
4.3.3 多对多模型 116
4.4 线程库 117
4.4.1 Pthreads 118
4.4.2 Windows线程 119
4.4.3 Java线程 121
4.5 隐式多线程 122
4.5.1 线程池 123
4.5.2 OpenMP 124
4.5.3 大中央调度 125
4.5.4 其他方法 125
4.6 多线程问题 125
4.6.1 系统调用fork()和exec() 125
4.6.2 信号处理 126
4.6.3 线程撤销 127
4.6.4 线程本地存储 128
4.6.5 调度程序激活 128
4.7 操作系统例子 129
4.7.1 Windows线程 129
4.7.2 Linux线程 130
4.8 小结 131
复习题 131
实践题 131
习题 131
编程题 133
编程项目 135
推荐读物 136
参考文献 136
第5章 进程同步 138
5.1 背景 138
5.2 临界区问题 140
5.3 Peterson解决方案 141
5.4 硬件同步 142
5.5 互斥锁 144
5.6 信号量 144
5.6.1 信号量的使用 145
5.6.2 信号量的实现 145
5.6.3 死锁与饥饿 147
5.6.4 优先级的反转 147
5.7 经典同步问题 148
5.7.1 有界缓冲问题 148
5.7.2 读者-作者问题 149
5.7.3 哲学家就餐问题 150
5.8 管程 151
5.8.1 使用方法 152
5.8.2 哲学家就餐问题的管程解决方案 153
5.8.3 采用信号量的管程实现 154
5.8.4 管程内的进程重启 155
5.9 同步例子 156
5.9.1 Windows同步 156
5.9.2 Linux同步 157
5.9.3 Solaris同步 158
5.9.4 Pthreads同步 159
5.10 替代方法 160
5.10.1 事务内存 161
5.10.2 OpenMP 162