描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111606482
内容简介
本书是经典教材《操作系统概念》的精简版,强调基础概念,更适合本科阶段的教学。全书共六部分,不仅详细讲解了进程管理、内存管理、存储管理、保护与安全等概念,而且涵盖重要的理论结果和案例研究,并且给出了供读者深入学习的推荐读物。这一版新增了多核系统和移动计算的内容,每一章都融入了新的技术进展,并且更新了习题和编程项目。本书既适合高等院校计算机相关专业的学生学习,也是专业技术人员的有益参考。
目 录
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
出版者的话
译者序
前言
部分 概论
第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
前 言
前 言Operating System Concepts Essentials, Second Edition其中的基本概念仍然比较清晰,这些概念就是本书讨论的基础。
本书是面向操作系统导论课程的教科书,适用于大三、大四学生和一年级研究生,同时也可供工程技术人员参考。本书清晰地描述了操作系统的概念。作为先决条件,我们假设读者熟悉基本数据结构、计算机组成和一种高级语言(如C或Java)。本书第1章包括了学习操作系统所需的硬件知识,还包括大多数操作系统普遍使用的基础数据结构。代码示例主要使用C和Java,不过,即使读者不具有这些语言的全部知识也能理解这些算法。
本书不仅直观描述了概念,而且包括重要的理论结果,但是省略了大部分的形式化证明。每章结尾的推荐读物给出了相关研究论文,其中有的首次提出或证明了这些理论结果,有的提供深入阅读的材料。本书通过图形和举例来代替证明,以说明为什么有关结果是真实有效的。
本书描述的基本概念和算法通常用于商用和开源的操作系统。我们的目标是,按照通用的(而非特定的)操作系统来描述这些概念和算法。另外,我们提供了受欢迎和创新的操作系统的大量例子,包括Linux、Microsoft Windows、Apple Mac OS X和Solaris。我们还给出了两个主要移动操作系统(Android和iOS)的示例。
本书的编写综合了我们从事操作系统教学的多年经验以及IEEE计算机协会和ACM共同出版的课程指南。另外,还考虑了多位审稿人员提供的反馈意见,以及以前版本读者和学生的许多意见和建议。
本书内容本书包括六大部分:
概论。第1章和第2章解释了操作系统是什么,它们能做什么,以及它们是如何设计与构造的。这一部分讨论了操作系统的常见功能是什么,以及操作系统能为用户提供什么。我们不仅讨论PC和服务器的传统操作系统,而且讨论移动设备的操作系统。描述主要以启发和解释为主,避免讨论内部实现细节。因此,这部分适合低年级学生或类似读者,以便了解操作系统是什么而无需关注内部算法细节。
进程管理。第3~6章描述了进程概念和并发,这是现代操作系统的核心。进程是系统内的工作单元。这种系统包括一组并发执行进程,其中一些是操作系统进程(执行系统代码的进程),其余的是用户进程(执行用户代码的进程)。这一部分包括进程调度、进程间通信、进程同步及死锁处理等的方法,还包括线程分析以及多核系统和并行编程的有关分析。
内存管理。第7章和第8章是关于进程执行期间的内存管理的。为了改进CPU的使用率及其对用户的响应速度,计算机必须在内存中同时保存多个进程。内存管理具有很多不同方案,反映了内存管理的各种方法;而特定算法的有效性取决于应用情形。
存储管理。第9~12章描述了现代计算机系统如何处理文件系统、大容量存储和I/O。文件系统提供了一种机制,以对数据和程序进行在线存储与访问。这一部分描述了存储管理的经典内部算法和结构,并且深入讨论了这些算法,比如它们的特性、优点和缺点。由于连到计算机的I/O设备种类如此之多,操作系统需要为应用程序提供大量的功能,以控制这些设备的方方面面。这一部分深入讨论了I/O系统,包括I/O系统设计、接口及系统内部的结构和功能。在许多方面,I/O设备也是计算机中慢的主要组件。因为设备通常是性能瓶颈,所以这一部分也讨论了I/O设备的性能问题。
保护与安全。第13章和第14章讨论了计算机系统保护与安全的必需机制。操作系统的进程活动必须互相保护,为此,我们必须确保只有获得操作系统适当授权的进程才能使用系统的文件、内存、CPU和其他资源。保护是一种机制,用于控制程序、进程和用户对计算机系统资源的访问,这种机制必须提供指定控制和实施控制的手段。安全机制保护系统存储的信息(数据和代码)的完整性和计算机的物理资源,从而避免未经授权的访问、恶意破坏或修改以及意外引入的不一致。
案例研究。本书的第15章详细研究了Linux操作系统的实际案例。虽然本书前面章节也有Linux的讨论,但是案例研究提供了更多细节。
操作系统概念精要本书以2012年《操作系统概念》的第9版为蓝本,希望为读者提供一本强调当代操作系统基本概念的教科书。通过关注基本概念,我们相信,学生能够更轻松、更快速地掌握现代操作系统的基本特征。
为了做到这一点,本书删减了《操作系统概念》第9版的如下内容:
删除了深入讨论死锁的第7章,但是在第5章中概述了死锁。
删除了第17章“Windows 7”。
删除了第18章“有影响的操作系统”。
如果你希望更全面地学习操作系统,则可以参阅《操作系统概念》第9版。下面介绍本书所做的更新。
第2版在编写本书第2版时,我们考虑了影响操作系统的两个重要领域的新发展:
多核系统移动计算为了强调这两个重要领域的新发展,我们在新版本中融入了相关讨论。另外,我们几乎重写了每章内容以反映变化,并且删除不再有趣或有关的材料。
我们也做了大量调整,例如删除了实时系统一章,但在其他章节中整合了对这些系统的适当讨论;我们还重新安排了存储管理的相关章节,并将进程同步放在进程调度之前。大多数调整都是基于我们讲授操作系统课程的经验。
下面简要描述各章的主要修改:
第1章,导论,包括关于多处理器和多核系统以及内核数据结构的新内容。此外,计算环境的讨论现在包括移动系统和云计算。我们还增加了对实时系统的概述。
第2章,操作系统结构,增加了移动设备(包括iOS和Android)用户界面的讨论,并扩展了Mac OS X(一种混合系统)的讨论。
第3章,进程,现在包括移动操作系统的多任务讨论、Google Chrome浏览器的多进程模型支持以及UNIX的僵尸和孤儿进程。
第4章,线程,扩展了并行性和阿姆达尔定律的相关内容,也提供了关于隐式线程的小节,包括OpenMP和Apple的Grand Central Dispatch。
第5章,进程同步,增加了互斥锁、OpenMP以及函数式语言的同步讨论。
第6章,CPU调度,增加了Linux CFS调度器和Windows用户模式调度,还整合了实时调度算法的讨论。
第7章,内存,增加了移动系统以及Intel 32位和64位架构的内存交换的讨论,还增加新的一节讨论ARM架构。
第8章,虚拟内存,更新了内核内存管理,以包括Linux SLUB和SLOB内存分配器。
第9章,大容量存储结构,增加了固态磁盘的讨论。
第10章,文件系统接口,根据当前技术发展进行了更新。
第11章,文件系统实现,根据当前技术发展进行了更新。
第12章,I/O系统,更新了技术与性能参数,扩展了同步/异步和阻塞/非阻塞I/O的讨论,并增加了向量I/O的内容。
第13章,保护,没有重大变化。
第14章,安全,采用现代符号修改了密码学的相关内容,并改进了对各种加密方法及其用途的描述,还增加了Windows 7的安全讨论。
第15章,Linux系统,增加了Linux 3.2内核的讨论。
编程环境本书使用许多操作系统的实际示例来说明操作系统的基本概念。虽然主要关注Linux和Microsoft Windows,但是我们也参考各种版本的UNIX(包括Solaris、BSD和Mac OS X)。
本书还提供了用C和Java编写的许多程序示例。这些程序可运行于如下编程环境:
POSIX。POSIX(Portable Operating System Interface,可移植操作系统接口)为一套标准,主要用于基于UNIX的操作系统。虽然Windows系统也可以运行一些POSIX程序,但是我们的POSIX讨论主要关注UNIX和Linux系统。POSIX兼容系统必须实现POSIX核心标准(POSIX.1),Linux、Solaris和Mac OS X都是POSIX兼容系统的例子。POSIX还定义了多个扩展标准,包括实时扩展(POSIX1.b)和线程库扩展(POSIX1.c,常称为Pthreads)。我们提供了多个用C编写的程序示例,以说明POSIX基本API、Pthreads和实时编程扩展。这些程序示例采用gcc 4.0编译器,在Linux 2.6和Linux 3.2系统、Mac OS X 10.7和Solaris 10上进行了测试。
Java。Java是一种应用广泛的编程语言,具有丰富的API以及对线程创建与管理的内置语言支持。Java程序可运行在支持JVM(Java Virtual Machine,Java虚拟机)的任何操作系统上。我们采用Java程序来说明各种操作系统和网络概念,并采用Java 1.6 JVM来测试。
Windows系统。Windows系统的主要编程环境是Windows API,它提供了一整套函数来管理进程、线程、内存和外设。我们提供多个C程序来说明如何使用这种API。这些程序在Windows XP和Windows 7上进行了测试。
我们选择了这三个编程环境,因为我们相信它们能代表两个受欢迎的操作系统模型,即Windows和UNIX/Linux,以及应用广泛的Java环境。大多数程序示例都是用C编写的,希望读者能够熟悉C语言。熟悉C语言和Java语言的读者,应该很容易理解本书的大多数程序。
在有些情况下,如线程创建,我们使用所有三个编程环境来说明特定概念,以便读者在处理相同任务时可以比较三种不同的库。在其他情况下,我们可能只使用一种API来演示概念。例如,我们只使用POSIX API来说明共享内存,使用Java API来解释TCP/IP的套接字编程。
Linux虚拟机为了帮助学生更好地学习Linux系统,我们提供了Linux虚拟机及Linux源代码,可从本书支持网站(www.os-book.com)下载。该虚拟机还包括带有编译器和编辑器的gcc开发环境。本书的大部分编程作业可以在此虚拟机上完成,但是需要Java或Windows API的作业除外。
我们还提供了三个编程项目,以便通过内核模块修改Linux内核:
添加基本内核模块到Linux内核。
添加使用各种内核数据结构的内核模块。
添加迭代Linux系统任务的内核模块。
我们打算不断在支持网站上补充额外的内核模块作业。
支持网站本书支持网站www.os-book.com包括以下资源:
Linux虚拟机C与Java源代码教学大纲样例PPT插图集FreeBSD和Mach的案例研究各章的复习题实践题答案学生学习指南勘误表教师注意事项在本书网站上,我们提供多个教学大纲样例,用于采用本书的各种初级与高级课程。作为一般规律,我们鼓励教师按章节顺序进行教学,因为这会提供透彻的操作系统研究路线。不过,通过大纲样例,教师可以选择不同的章节顺序(或章节内容)。
本版添加了60多道新的习题以及20多个新的编程题和编程项目。大多数新的编程作业涉及进程、线程、进程同步和内存管理。有些涉及添加内核模块到Linux系统,这可以采用本书附带的Linux虚拟机或其他适当的Linux发行版来完成。
对于采用本书来讲授操作系统的教师,可以获得每章复习题、习题和编程题的答案。要获得这些补充材料,请联系当地的John Wiley & Sons销售代表。
学生注意事项我们鼓励你利用好每章末尾的复习题和实践题,这些题目的答案可从网站www.os-book.com下载。我们也鼓励你阅读由我们的一位学生准备的学生学习指南。后,对于不熟悉UNIX和Linux系统的学生,建议你下载并安装支持网站的Linux虚拟机。这不仅为你提供了新的计算体验,而且Linux的开放源码能帮助你轻松分析这个流行操作系统的内部细节。
祝你在学习操作系统的旅程中一切顺利。
联系我们我们努力消除本书的错误。然而,像新版的软件一样,错误几乎肯定存在。本书的网站提供了的勘误表。如果你能通知我们尚未出现在勘误表中的任何错误或遗漏,我们将不胜感激。
我们很乐意收到关于本书的改进建议。我们也欢迎任何可能对其他读者有用的材料,如编程题、项目建议、在线实验室和教程以及教学建议等。可发送邮件到[email protected]。
致谢本书源自以前的多个版本,其中前三个版本是与James Peterson合著的。帮助完成以前版本的人员包括:Hamid Arabnia、Rida Bazzi、Randy Bentson、David Black、Joseph Boykin、Jeff Brum鹐ld、Gael Buckley、Roy Campbell、P. C. Capon、John Carpenter、Gil Carrick、Thomas Casavant、Bart Childs、Ajoy Kumar Datta、Joe Deck、Sudarshan K. Dhall、Thomas Doeppner、Caleb Drake、M. Racsit Eskiciolu、Hans Flack、Robert Fowler、G. Scott Graham、Richard Guy、Max Hailperin、Rebecca Hartman、Wayne Hathaway、Christopher Haynes、Don Heller、Bruce Hillyer、Mark Holliday、Dean Hougen、Michael Huang、Ahmed Kamel、Morty Kewstel、Richard Kieburtz、Carol Kroll、Morty Kwestel、Thomas LeBlanc、John Leggett、Jerrold Leichter、Ted Leung、Gary Lippman、Carolyn Miller、Michael Molloy、Euripides Montagne、Yoichi Muraoka、Jim M. Ng、Banu Ozden、Ed Posnak、Boris Putanec、Charles Qualline、John Quarterman、Mike Reiter、Gustavo Rodriguez-Rivera、Carolyn J. C. Schauble、Thomas P. Skinner、Yannis Smaragdakis、Jesse St. Laurent、John Stankovic、Adam Stauffer、Ste-ven Stepanek、John Sterling、Hal Stern、Louis Stevens、Pete Thomas、David Umbaugh、Steve Vinoski、Tommy Wagner、Larry L. Wear、John Werth、James M. Westall、J. S. Weston与Yang Xiang。
Robert Love更新了第15章和全书Linux的描述,并回答了Android相关的许多问题。Jonathan Katz贡献了第14章。Salahuddin Khan更新了14.9节,以提供新的Windows 7安全功能。
第15章来自Stephen Tweedie的未发表手稿。Arvind Krishnamurthy提供了一些习题及其解答。Andrew DeNicola准备了我们网站上的学生学习指南。Marilyn Turnamian提供了一些幻灯片。
Mike Shapiro、Bryan Cantrill和Jim Mauro回答了多个Solaris相关的问题。Sun Micro-systems的Bryan Cantrill提供了有关ZFS的帮助。Josh Dees和Rob Reynolds提供了微软.NET的描述。John Trono(Saint Michael学院)提供了POSIX消息队列的项目。
Judi Paige帮助准备了插图和幻灯片。Thomas Gagne为本版准备了新的插图。Mark Wogahn确保了生成本书的软件(LATEX和字体)可以正常工作。Ranjan Kumar Meher重写了用于生成本书的一些LATEX软件。
执行编辑Beth Lang Golub在我们编写本书时提供了专家指导。在Katherine Willis的协助下,她很好地管理了项目细节。高级制作编辑Joyce Poh处理了所有的成书细节。
Susan Cyr为封面绘画师,Madelyn Lesure为封面设计师。Beverly Peavler复制了手稿。Katrina Avery为自由校对员,WordCo,Inc.为自由索引公司。
Abraham Silberschatz, New Haven, CT, 2013Peter Baer Galvin, Boston, MA, 2013Greg Gagne, Salt Lake City, UT, 2013
本书是面向操作系统导论课程的教科书,适用于大三、大四学生和一年级研究生,同时也可供工程技术人员参考。本书清晰地描述了操作系统的概念。作为先决条件,我们假设读者熟悉基本数据结构、计算机组成和一种高级语言(如C或Java)。本书第1章包括了学习操作系统所需的硬件知识,还包括大多数操作系统普遍使用的基础数据结构。代码示例主要使用C和Java,不过,即使读者不具有这些语言的全部知识也能理解这些算法。
本书不仅直观描述了概念,而且包括重要的理论结果,但是省略了大部分的形式化证明。每章结尾的推荐读物给出了相关研究论文,其中有的首次提出或证明了这些理论结果,有的提供深入阅读的材料。本书通过图形和举例来代替证明,以说明为什么有关结果是真实有效的。
本书描述的基本概念和算法通常用于商用和开源的操作系统。我们的目标是,按照通用的(而非特定的)操作系统来描述这些概念和算法。另外,我们提供了受欢迎和创新的操作系统的大量例子,包括Linux、Microsoft Windows、Apple Mac OS X和Solaris。我们还给出了两个主要移动操作系统(Android和iOS)的示例。
本书的编写综合了我们从事操作系统教学的多年经验以及IEEE计算机协会和ACM共同出版的课程指南。另外,还考虑了多位审稿人员提供的反馈意见,以及以前版本读者和学生的许多意见和建议。
本书内容本书包括六大部分:
概论。第1章和第2章解释了操作系统是什么,它们能做什么,以及它们是如何设计与构造的。这一部分讨论了操作系统的常见功能是什么,以及操作系统能为用户提供什么。我们不仅讨论PC和服务器的传统操作系统,而且讨论移动设备的操作系统。描述主要以启发和解释为主,避免讨论内部实现细节。因此,这部分适合低年级学生或类似读者,以便了解操作系统是什么而无需关注内部算法细节。
进程管理。第3~6章描述了进程概念和并发,这是现代操作系统的核心。进程是系统内的工作单元。这种系统包括一组并发执行进程,其中一些是操作系统进程(执行系统代码的进程),其余的是用户进程(执行用户代码的进程)。这一部分包括进程调度、进程间通信、进程同步及死锁处理等的方法,还包括线程分析以及多核系统和并行编程的有关分析。
内存管理。第7章和第8章是关于进程执行期间的内存管理的。为了改进CPU的使用率及其对用户的响应速度,计算机必须在内存中同时保存多个进程。内存管理具有很多不同方案,反映了内存管理的各种方法;而特定算法的有效性取决于应用情形。
存储管理。第9~12章描述了现代计算机系统如何处理文件系统、大容量存储和I/O。文件系统提供了一种机制,以对数据和程序进行在线存储与访问。这一部分描述了存储管理的经典内部算法和结构,并且深入讨论了这些算法,比如它们的特性、优点和缺点。由于连到计算机的I/O设备种类如此之多,操作系统需要为应用程序提供大量的功能,以控制这些设备的方方面面。这一部分深入讨论了I/O系统,包括I/O系统设计、接口及系统内部的结构和功能。在许多方面,I/O设备也是计算机中慢的主要组件。因为设备通常是性能瓶颈,所以这一部分也讨论了I/O设备的性能问题。
保护与安全。第13章和第14章讨论了计算机系统保护与安全的必需机制。操作系统的进程活动必须互相保护,为此,我们必须确保只有获得操作系统适当授权的进程才能使用系统的文件、内存、CPU和其他资源。保护是一种机制,用于控制程序、进程和用户对计算机系统资源的访问,这种机制必须提供指定控制和实施控制的手段。安全机制保护系统存储的信息(数据和代码)的完整性和计算机的物理资源,从而避免未经授权的访问、恶意破坏或修改以及意外引入的不一致。
案例研究。本书的第15章详细研究了Linux操作系统的实际案例。虽然本书前面章节也有Linux的讨论,但是案例研究提供了更多细节。
操作系统概念精要本书以2012年《操作系统概念》的第9版为蓝本,希望为读者提供一本强调当代操作系统基本概念的教科书。通过关注基本概念,我们相信,学生能够更轻松、更快速地掌握现代操作系统的基本特征。
为了做到这一点,本书删减了《操作系统概念》第9版的如下内容:
删除了深入讨论死锁的第7章,但是在第5章中概述了死锁。
删除了第17章“Windows 7”。
删除了第18章“有影响的操作系统”。
如果你希望更全面地学习操作系统,则可以参阅《操作系统概念》第9版。下面介绍本书所做的更新。
第2版在编写本书第2版时,我们考虑了影响操作系统的两个重要领域的新发展:
多核系统移动计算为了强调这两个重要领域的新发展,我们在新版本中融入了相关讨论。另外,我们几乎重写了每章内容以反映变化,并且删除不再有趣或有关的材料。
我们也做了大量调整,例如删除了实时系统一章,但在其他章节中整合了对这些系统的适当讨论;我们还重新安排了存储管理的相关章节,并将进程同步放在进程调度之前。大多数调整都是基于我们讲授操作系统课程的经验。
下面简要描述各章的主要修改:
第1章,导论,包括关于多处理器和多核系统以及内核数据结构的新内容。此外,计算环境的讨论现在包括移动系统和云计算。我们还增加了对实时系统的概述。
第2章,操作系统结构,增加了移动设备(包括iOS和Android)用户界面的讨论,并扩展了Mac OS X(一种混合系统)的讨论。
第3章,进程,现在包括移动操作系统的多任务讨论、Google Chrome浏览器的多进程模型支持以及UNIX的僵尸和孤儿进程。
第4章,线程,扩展了并行性和阿姆达尔定律的相关内容,也提供了关于隐式线程的小节,包括OpenMP和Apple的Grand Central Dispatch。
第5章,进程同步,增加了互斥锁、OpenMP以及函数式语言的同步讨论。
第6章,CPU调度,增加了Linux CFS调度器和Windows用户模式调度,还整合了实时调度算法的讨论。
第7章,内存,增加了移动系统以及Intel 32位和64位架构的内存交换的讨论,还增加新的一节讨论ARM架构。
第8章,虚拟内存,更新了内核内存管理,以包括Linux SLUB和SLOB内存分配器。
第9章,大容量存储结构,增加了固态磁盘的讨论。
第10章,文件系统接口,根据当前技术发展进行了更新。
第11章,文件系统实现,根据当前技术发展进行了更新。
第12章,I/O系统,更新了技术与性能参数,扩展了同步/异步和阻塞/非阻塞I/O的讨论,并增加了向量I/O的内容。
第13章,保护,没有重大变化。
第14章,安全,采用现代符号修改了密码学的相关内容,并改进了对各种加密方法及其用途的描述,还增加了Windows 7的安全讨论。
第15章,Linux系统,增加了Linux 3.2内核的讨论。
编程环境本书使用许多操作系统的实际示例来说明操作系统的基本概念。虽然主要关注Linux和Microsoft Windows,但是我们也参考各种版本的UNIX(包括Solaris、BSD和Mac OS X)。
本书还提供了用C和Java编写的许多程序示例。这些程序可运行于如下编程环境:
POSIX。POSIX(Portable Operating System Interface,可移植操作系统接口)为一套标准,主要用于基于UNIX的操作系统。虽然Windows系统也可以运行一些POSIX程序,但是我们的POSIX讨论主要关注UNIX和Linux系统。POSIX兼容系统必须实现POSIX核心标准(POSIX.1),Linux、Solaris和Mac OS X都是POSIX兼容系统的例子。POSIX还定义了多个扩展标准,包括实时扩展(POSIX1.b)和线程库扩展(POSIX1.c,常称为Pthreads)。我们提供了多个用C编写的程序示例,以说明POSIX基本API、Pthreads和实时编程扩展。这些程序示例采用gcc 4.0编译器,在Linux 2.6和Linux 3.2系统、Mac OS X 10.7和Solaris 10上进行了测试。
Java。Java是一种应用广泛的编程语言,具有丰富的API以及对线程创建与管理的内置语言支持。Java程序可运行在支持JVM(Java Virtual Machine,Java虚拟机)的任何操作系统上。我们采用Java程序来说明各种操作系统和网络概念,并采用Java 1.6 JVM来测试。
Windows系统。Windows系统的主要编程环境是Windows API,它提供了一整套函数来管理进程、线程、内存和外设。我们提供多个C程序来说明如何使用这种API。这些程序在Windows XP和Windows 7上进行了测试。
我们选择了这三个编程环境,因为我们相信它们能代表两个受欢迎的操作系统模型,即Windows和UNIX/Linux,以及应用广泛的Java环境。大多数程序示例都是用C编写的,希望读者能够熟悉C语言。熟悉C语言和Java语言的读者,应该很容易理解本书的大多数程序。
在有些情况下,如线程创建,我们使用所有三个编程环境来说明特定概念,以便读者在处理相同任务时可以比较三种不同的库。在其他情况下,我们可能只使用一种API来演示概念。例如,我们只使用POSIX API来说明共享内存,使用Java API来解释TCP/IP的套接字编程。
Linux虚拟机为了帮助学生更好地学习Linux系统,我们提供了Linux虚拟机及Linux源代码,可从本书支持网站(www.os-book.com)下载。该虚拟机还包括带有编译器和编辑器的gcc开发环境。本书的大部分编程作业可以在此虚拟机上完成,但是需要Java或Windows API的作业除外。
我们还提供了三个编程项目,以便通过内核模块修改Linux内核:
添加基本内核模块到Linux内核。
添加使用各种内核数据结构的内核模块。
添加迭代Linux系统任务的内核模块。
我们打算不断在支持网站上补充额外的内核模块作业。
支持网站本书支持网站www.os-book.com包括以下资源:
Linux虚拟机C与Java源代码教学大纲样例PPT插图集FreeBSD和Mach的案例研究各章的复习题实践题答案学生学习指南勘误表教师注意事项在本书网站上,我们提供多个教学大纲样例,用于采用本书的各种初级与高级课程。作为一般规律,我们鼓励教师按章节顺序进行教学,因为这会提供透彻的操作系统研究路线。不过,通过大纲样例,教师可以选择不同的章节顺序(或章节内容)。
本版添加了60多道新的习题以及20多个新的编程题和编程项目。大多数新的编程作业涉及进程、线程、进程同步和内存管理。有些涉及添加内核模块到Linux系统,这可以采用本书附带的Linux虚拟机或其他适当的Linux发行版来完成。
对于采用本书来讲授操作系统的教师,可以获得每章复习题、习题和编程题的答案。要获得这些补充材料,请联系当地的John Wiley & Sons销售代表。
学生注意事项我们鼓励你利用好每章末尾的复习题和实践题,这些题目的答案可从网站www.os-book.com下载。我们也鼓励你阅读由我们的一位学生准备的学生学习指南。后,对于不熟悉UNIX和Linux系统的学生,建议你下载并安装支持网站的Linux虚拟机。这不仅为你提供了新的计算体验,而且Linux的开放源码能帮助你轻松分析这个流行操作系统的内部细节。
祝你在学习操作系统的旅程中一切顺利。
联系我们我们努力消除本书的错误。然而,像新版的软件一样,错误几乎肯定存在。本书的网站提供了的勘误表。如果你能通知我们尚未出现在勘误表中的任何错误或遗漏,我们将不胜感激。
我们很乐意收到关于本书的改进建议。我们也欢迎任何可能对其他读者有用的材料,如编程题、项目建议、在线实验室和教程以及教学建议等。可发送邮件到[email protected]。
致谢本书源自以前的多个版本,其中前三个版本是与James Peterson合著的。帮助完成以前版本的人员包括:Hamid Arabnia、Rida Bazzi、Randy Bentson、David Black、Joseph Boykin、Jeff Brum鹐ld、Gael Buckley、Roy Campbell、P. C. Capon、John Carpenter、Gil Carrick、Thomas Casavant、Bart Childs、Ajoy Kumar Datta、Joe Deck、Sudarshan K. Dhall、Thomas Doeppner、Caleb Drake、M. Racsit Eskiciolu、Hans Flack、Robert Fowler、G. Scott Graham、Richard Guy、Max Hailperin、Rebecca Hartman、Wayne Hathaway、Christopher Haynes、Don Heller、Bruce Hillyer、Mark Holliday、Dean Hougen、Michael Huang、Ahmed Kamel、Morty Kewstel、Richard Kieburtz、Carol Kroll、Morty Kwestel、Thomas LeBlanc、John Leggett、Jerrold Leichter、Ted Leung、Gary Lippman、Carolyn Miller、Michael Molloy、Euripides Montagne、Yoichi Muraoka、Jim M. Ng、Banu Ozden、Ed Posnak、Boris Putanec、Charles Qualline、John Quarterman、Mike Reiter、Gustavo Rodriguez-Rivera、Carolyn J. C. Schauble、Thomas P. Skinner、Yannis Smaragdakis、Jesse St. Laurent、John Stankovic、Adam Stauffer、Ste-ven Stepanek、John Sterling、Hal Stern、Louis Stevens、Pete Thomas、David Umbaugh、Steve Vinoski、Tommy Wagner、Larry L. Wear、John Werth、James M. Westall、J. S. Weston与Yang Xiang。
Robert Love更新了第15章和全书Linux的描述,并回答了Android相关的许多问题。Jonathan Katz贡献了第14章。Salahuddin Khan更新了14.9节,以提供新的Windows 7安全功能。
第15章来自Stephen Tweedie的未发表手稿。Arvind Krishnamurthy提供了一些习题及其解答。Andrew DeNicola准备了我们网站上的学生学习指南。Marilyn Turnamian提供了一些幻灯片。
Mike Shapiro、Bryan Cantrill和Jim Mauro回答了多个Solaris相关的问题。Sun Micro-systems的Bryan Cantrill提供了有关ZFS的帮助。Josh Dees和Rob Reynolds提供了微软.NET的描述。John Trono(Saint Michael学院)提供了POSIX消息队列的项目。
Judi Paige帮助准备了插图和幻灯片。Thomas Gagne为本版准备了新的插图。Mark Wogahn确保了生成本书的软件(LATEX和字体)可以正常工作。Ranjan Kumar Meher重写了用于生成本书的一些LATEX软件。
执行编辑Beth Lang Golub在我们编写本书时提供了专家指导。在Katherine Willis的协助下,她很好地管理了项目细节。高级制作编辑Joyce Poh处理了所有的成书细节。
Susan Cyr为封面绘画师,Madelyn Lesure为封面设计师。Beverly Peavler复制了手稿。Katrina Avery为自由校对员,WordCo,Inc.为自由索引公司。
Abraham Silberschatz, New Haven, CT, 2013Peter Baer Galvin, Boston, MA, 2013Greg Gagne, Salt Lake City, UT, 2013
评论
还没有评论。