操作系统概念精要(原书第2版)
作者 : [美] 亚伯拉罕·西尔伯沙茨(Abraham Silberschatz) 彼得·B. 高尔文(Peter B. Galvin) 格雷格·加涅(Greg Gagne) 著
译者 : 郑扣根 唐杰 李善平 译
丛书名 : 计算机科学丛书
出版日期 : 2018-08-08
ISBN : 978-7-111-60648-2
定价 : 95.00元
教辅资源
扩展信息
语种 : 简体中文
页数 : 517
开本 : 16
原书名 : Operating System Concepts Essentials, Second Edition
原出版社: John Wiley & Sons(SIN)
属性分类: 教材
包含CD : 无CD
绝版 :
图书简介

本书是操作系统领域的经典教程,全面细致地介绍操作系统的基本概念。精华版是对全版内容的浓缩,第2版更新内容包括多核系统和并行编程,以及移动操作系统iOS和Android,并对Linux和Windows的相关内容进行了梳理。

图书特色

图书前言

其中的基本概念仍然比较清晰,这些概念就是本书讨论的基础。
本书是面向操作系统导论课程的教科书,适用于大三、大四学生和一年级研究生,同时也可供工程技术人员参考。本书清晰地描述了操作系统的概念。作为先决条件,我们假设读者熟悉基本数据结构、计算机组成和一种高级语言(如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的开放源码能帮助你轻松分析这个流行操作系统的内部细节。
祝你在学习操作系统的旅程中一切顺利。
联系我们
我们努力消除本书的错误。然而,像新版的软件一样,错误几乎肯定存在。本书的网站提供了最新的勘误表。如果你能通知我们尚未出现在最新勘误表中的任何错误或遗漏,我们将不胜感激。
我们很乐意收到关于本书的改进建议。我们也欢迎任何可能对其他读者有用的材料,如编程题、项目建议、在线实验室和教程以及教学建议等。可发送邮件到os-book-authors@cs.yale.edu。
致谢
本书源自以前的多个版本,其中前三个版本是与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, 2013
Peter Baer Galvin, Boston, MA, 2013
Greg Gagne, Salt Lake City, UT, 2013

上架指导

计算机\操作系统

封底文字

《操作系统概念》系列书籍一直是该领域的“圣经”,从第1版至今全程记录了操作系统的发展历史,被国内外众多高校选作教材。
本书是《操作系统概念》的精简版,强调基础概念,更适合本科阶段的教学。书中延续了之前版本的优点并进行了全面更新:理论讲解采用简洁、直观的方式来呈现重要的研究结果,不展开复杂的形式化证明;案例分析涵盖Linux、Windows、Mac OS X、Android、iOS等各大主流系统;代码部分要求读者对C或Java语言有一定的了解;教辅资源同步升级,包括复习题、实践题、编程题、推荐读物、源代码和PPT等(请访问www.hzbook.com查看和下载)。

重点更新
·简化了关于死锁的内容,删除了关于Windows 7的详细案例研究,删除了对一些非主流操作系统的介绍。
·新增关于多核系统和移动计算的内容。
·针对移动设备的大量普及,新增了相关的操作系统、用户界面和内存管理等内容。
·针对大容量存储的发展,新增了固态硬盘等内容。
·更新了进程、线程、同步、内存管理、文件系统、I/O系统、Linux系统等方面的新技术。
·在编程环境方面,同时考虑POSIX、Java和Windows系统。
·更新了大量习题和编程项目。

作者简介

[美] 亚伯拉罕·西尔伯沙茨(Abraham Silberschatz) 彼得·B. 高尔文(Peter B. Galvin) 格雷格·加涅(Greg Gagne) 著:---作者简介---
亚伯拉罕·西尔伯沙茨(Abraham Silberschatz) 著名计算机科学家,ACM、IEEE和AAAS会士。现任耶鲁大学计算机科学系教授,之前曾任贝尔实验室信息科学研究中心副主管。除本书外,他还是知名教材《数据库系统概念》的作者之一。
彼得·B. 高尔文(Peter B. Galvin) 现任Pluribus Networks首席解决方案架构师,之前曾任系统集成商Corporate Technologies的首席技术官,还曾在波士顿大学担任讲师。
格雷格·加涅(Greg Gagne) 威斯敏斯特学院计算机科学系主任,操作系统、计算机网络、并行编程和软件工程方面的资深专家。

---译者简介---
郑扣根,浙江大学计算机学院教授、博士生导师。1994年起于浙江大学任教至今,长期从事操作系统、计算理论、形式化方法、计算机网络等方面的教学和科研工作。

译者序

计算机科学与技术的发展如此迅猛,人工智能、深度学习、大数据、云计算、物联网等让人应接不暇。但到目前为止,无论世界如何变化,操作系统一直是计算机的重要基础,“操作系统”课程也一直是计算机专业的核心必修课程之一。当然,操作系统本身也在不断发展,所以此书的完整版从第1版到现在已经发展到了第9版,精要版也已经升级为第2版。
为什么要再三翻译此书呢?第一,如之前版本译者序中所言,这是一本操作系统的“圣经”;第二,操作系统对计算机专业的学生实在是非常基础和重要;第三,我们长期从事计算机专业教学的使命使然,绵薄之力也当奉献。
较之前的版本,此版本的特点如下:
新增了多核系统和移动计算的内容。
每一章都融入了操作系统的新发展,并删除了一些过时的内容:
在计算环境中考虑了移动计算、云计算等时下热点的内容。针对移动设备大量普及应用的环境,增加了相关的操作系统、用户界面、内存管理等内容。针对大容量存储的发展,新增了固态硬盘等内容。
在进程、线程、同步、内存管理、文件系统及实现、I/O系统、Linux系统等方面,根据技术发展做了更新。
在编程环境方面,同时考虑POSIX、Java、Windows系统。
更新了习题、编程项目等,以方便学生巩固和测试对新内容的学习。
本书原作者Abraham Silberschatz、Peter B. Galvin和Greg Gagne都是操作系统界的大师级人物。《操作系统概念》系列版本一向是操作系统经典图书中的经典,从第1版至今,可以说完美记录了操作系统的发展历史。这一版本延续了之前版本的优点,并加入了操作系统的新发展动向,相信读者能从中受益。
本书既适合作为计算机专业大三、大四本科学生的教材,也适用于相关专业人员完整理解计算机操作系统原理。建议读者根据自身情况阅读全书或部分章节。
科技图书的翻译一般都力求忠于原著。作为长期从事计算机专业教学的高校教师,总是希望作品能少出错,并能给读者以最大的帮助。但中文实在博大精深,译者水平有限,且时间仓促,翻译过程难免出错,欢迎读者批评指正,在此先表感谢!
本书由郑扣根(浙江大学)、唐杰(南京大学)和李善平(浙江大学)翻译。翻译过程中得到家人的理解与支持,在此表示深深的谢意。

图书目录

出版者的话
译者序
前言
第一部分 概论
第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
5.10.3 函数式编程语言 162
5.11 死锁 163
5.11.1 系统模型 163
5.11.2 死锁特征 164
5.11.3 死锁处理方法 167
5.12 小结 168
复习题 168
实践题 168
习题 169
编程题 172
编程项目 174
推荐读物 178
参考文献 178
第6章 CPU调度 180
6.1 基本概念 180
6.1.1 CPU-I/O执行周期 180
6.1.2 CPU调度程序 181
6.1.3 抢占调度 181
6.1.4 调度程序 182
6.2 调度准则 182
6.3 调度算法 183
6.3.1 先到先服务调度 183
6.3.2 最短作业优先调度 184
6.3.3 优先级调度 186
6.3.4 轮转调度 187
6.3.5 多级队列调度 189
6.3.6 多级反馈队列调度 190
6.4 线程调度 191
6.4.1 竞争范围 191
6.4.2 Pthreads调度 191
6.5 多处理器调度 193
6.5.1 多处理器调度的方法 193
6.5.2 处理器亲和性 193
6.5.3 负载平衡 194
6.5.4 多核处理器 194
6.6 实时CPU调度 196
6.6.1 最小化延迟 196
6.6.2 优先级调度 197
6.6.3 单调速率调度 198
6.6.4 最早截止期限优先调度 199
6.6.5 比例分享调度 200
6.6.6 POSIX实时调度 200
6.7 操作系统例子 202
6.7.1 例子:Linux调度 202
6.7.2 例子:Windows调度 204
6.7.3 例子:Solaris调度 206
6.8 算法评估 207
6.8.1 确定性模型 208
6.8.2 排队模型 209
6.8.3 仿真 209
6.8.4 实现 210
6.9 小结 211
复习题 212
实践题 212
习题 213
推荐读物 215
参考文献 216
第三部分 内存管理
第7章 内存 220
7.1 背景 220
7.1.1 基本硬件 220
7.1.2 地址绑定 222
7.1.3 逻辑地址空间与物理地址空间 222
7.1.4 动态加载 223
7.1.5 动态链接与共享库 224
7.2 交换 224
7.2.1 标准交换 224
7.2.2 移动系统的交换 225
7.3 连续内存分配 226
7.3.1 内存保护 226
7.3.2 内存分配 227
7.3.3 碎片 228
7.4 分段 228
7.4.1 基本方法 229
7.4.2 分段硬件 229
7.5 分页 230
7.5.1 基本方法 231
7.5.2 硬件支持 233
7.5.3 保护 236
7.5.4 共享页 237
7.6 页表结构 238
7.6.1 分层分页 238
7.6.2 哈希页表 240
7.6.3 倒置页表 240
7.6.4 Oracle SPARC Solaris 241
7.7 例子:Intel 32位与64位体系结构 242
7.7.1 IA-32架构 242
7.7.2 x86-64 244
7.8 例子:ARM架构 245
7.9 小结 245
复习题 246
实践题 246
习题 247
编程题 249
推荐读物 249
参考文献 250
第8章 虚拟内存 251
8.1 背景 251
8.2 请求调页 253
8.2.1 基本概念 253
8.2.2 请求调页的性能 256
8.3 写时复制 258
8.4 页面置换 259
8.4.1 基本页面置换 260
8.4.2 FIFO页面置换 262
8.4.3 最优页面置换 263
8.4.4 LRU页面置换 263
8.4.5 近似LRU页面置换 265
8.4.6 基于计数的页面置换 266
8.4.7 页面缓冲算法 267
8.4.8 应用程序与页面置换 267
8.5 帧分配 267
8.5.1 帧的最小数 268
8.5.2 分配算法 269
8.5.3 全局分配与局部分配 269
8.5.4 非均匀内存访问 270
8.6 系统抖动 270
8.6.1 系统抖动的原因 271
8.6.2 工作集模型 272
8.6.3 缺页错误频率 273
8.6.4 结束语 274
8.7 内存映射文件 274
8.7.1 基本机制 274
8.7.2 共享内存Windows API 275
8.7.3 内存映射I/O 277
8.8 分配内核内存 278
8.8.1 伙伴系统 278
8.8.2 slab分配 279
8.9 其他注意事项 280
8.9.1 预调页面 280
8.9.2 页面大小 280
8.9.3 TLB范围 281
8.9.4 倒置页表 282
8.9.5 程序结构 282
8.9.6 I/O联锁与页面锁定 283
8.10 操作系统例子 284
8.10.1 Windows 284
8.10.2 Solaris 285
8.11 小结 286
复习题 286
实践题 287
习题 288
编程题 292
编程项目 292
推荐读物 294
参考文献 295
第四部分 存储管理
第9章 大容量存储结构 298
9.1 大容量存储结构概述 298
9.1.1 硬盘 298
9.1.2 固态磁盘 299
9.1.3 磁带 299
9.2 磁盘结构 300
9.3 磁盘连接 300
9.3.1 主机连接存储 300
9.3.2 网络连接存储 301
9.3.3 存储区域网络 301
9.4 磁盘调度 302
9.4.1 FCFS调度 302
9.4.2 SSTF调度 302
9.4.3 SCAN调度 303
9.4.4 C-SCAN调度 304
9.4.5 LOOK调度 304
9.4.6 磁盘调度算法的选择 304
9.5 磁盘管理 305
9.5.1 磁盘格式化 305
9.5.2 引导块 306
9.5.3 坏块 307
9.6 交换空间管理 308
9.6.1 交换空间的使用 308
9.6.2 交换空间位置 308
9.6.3 交换空间管理例子 309
9.7 RAID结构 309
9.7.1 通过冗余提高可靠性 310
9.7.2 通过并行处理提高性能 311
9.7.3 RAID级别 311
9.7.4 RAID级别的选择 314
9.7.5 扩展 315
9.7.6 RAID的问题 315
9.8 稳定存储实现 316
9.9 小结 317
复习题 318
实践题 318
习题 318
编程题 320
推荐读物 320
参考文献 321
第10章 文件系统接口 322
10.1 文件概念 322
10.1.1 文件属性 322
10.1.2 文件操作 323
10.1.3 文件类型 327
10.1.4 文件结构 328
10.1.5 内部文件结构 328
10.2 访问方法 328
10.2.1 顺序访问 329
10.2.2 直接访问 329
10.2.3 其他访问方法 330
10.3 目录与磁盘的结构 331
10.3.1 存储结构 331
10.3.2 目录概述 332
10.3.3 单级目录 332
10.3.4 两级目录 333
10.3.5 树形目录 334
10.3.6 无环图目录 335
10.3.7 通用图目录 337
10.4 文件系统安装 338
10.5 文件共享 339
10.5.1 多用户 339
10.5.2 远程文件系统 340
10.5.3 一致性语义 342
10.6 保护 343
10.6.1 访问类型 343
10.6.2 访问控制 343
10.6.3 其他保护方式 345
10.7 小结 346
复习题 346
实践题 346
习题 347
推荐读物 348
参考文献 348
第11章 文件系统实现 349
11.1 文件系统结构 349
11.2 文件系统实现 350
11.2.1 概述 351
11.2.2 分区与安装 353
11.2.3 虚拟文件系统 353
11.3 目录实现 355
11.3.1 线性列表 355
11.3.2 哈希表 355
11.4 分配方法 356
11.4.1 连续分配 356
11.4.2 链接分配 357
11.4.3 索引分配 359
11.4.4 性能 360
11.5 空闲空间管理 361
11.5.1 位向量 361
11.5.2 链表 362
11.5.3 组 362
11.5.4 计数 362
11.5.5 空间图 363
11.6 效率与性能 363
11.6.1 效率 363
11.6.2 性能 364
11.7 恢复 366
11.7.1 一致性检查 366
11.7.2 基于日志的文件系统 366
11.7.3 其他解决方法 367
11.7.4 备份和恢复 368
11.8 NFS 368
11.8.1 概述 369
11.8.2 安装协议 370
11.8.3 NFS协议 370
11.8.4 路径名称转换 371
11.8.5 远程操作 372
11.9 例子:WAFL文件系统 372
11.10 小结 374
复习题 375
实践题 375
习题 375
编程题 376
推荐读物 377
参考文献 378
第12章 I/O系统 379
12.1 概述 379
12.2 I/O硬件 379
12.2.1 轮询 381
12.2.2 中断 382
12.2.3 直接内存访问 385
12.2.4 I/O硬件小结 386
12.3 应用程序I/O接口 386
12.3.1 块与字符设备 388
12.3.2 网络设备 389
12.3.3 时钟与定时器 389
12.3.4 非阻塞与异步I/O 390
12.3.5 向量I/O 391
12.4 内核I/O子系统 391
12.4.1 I/O调度 391
12.4.2 缓冲 392
12.4.3 缓存 393
12.4.4 假脱机与设备预留 394
12.4.5 错误处理 394
12.4.6 I/O保护 394
12.4.7 内核数据结构 395
12.4.8 电源管理 396
12.4.9 内核I/O子系统小结 397
12.5 I/O请求转成硬件操作 397
12.6 流 399
12.7 性能 400
12.8 小结 402
复习题 403
实践题 403
习题 403
推荐读物 404
参考文献 404
第五部分 保护与安全
第13章 保护 406
13.1 保护目标 406
13.2 保护原则 407
13.3 保护域 407
13.3.1 域结构 408
13.3.2 例子:UNIX 409
13.3.3 例子:MULTICS 410
13.4 访问矩阵 411
13.5 访问矩阵的实现 413
13.5.1 全局表 413
13.5.2 对象的访问列表 413
13.5.3 域的能力列表 414
13.5.4 锁-钥匙机制 414
13.5.5 比较 414
13.6 访问控制 415
13.7 访问权限的撤回 416
13.8 基于能力的系统 417
13.8.1 例子:Hydra 417
13.8.2 例子:剑桥CAP系统 418
13.9 基于语言的保护 418
13.9.1 基于编译程序的实现 419
13.9.2 Java的保护 420
13.10 小结 422
复习题 422
实践题 422
习题 423
推荐读物 423
参考文献 424
第14章 安全 427
14.1 安全问题 427
14.2 程序威胁 429
14.2.1 特洛伊木马 429
14.2.2 后门 430
14.2.3 逻辑炸弹 431
14.2.4 堆栈和缓冲区溢出 431
14.2.5 病毒 433
14.3 系统和网络的威胁 435
14.3.1 蠕虫 436
14.3.2 端口扫描 438
14.3.3 拒绝服务 439
14.4 作为安全工具的密码术 439
14.4.1 加密 440
14.4.2 密码术的实现 445
14.4.3 例子:SSL 445
14.5 用户认证 447
14.5.1 密码 447
14.5.2 密码漏洞 447
14.5.3 密码安全 448
14.5.4 一次性密码 449
14.5.5 生物识别技术 449
14.6 实现安全防御 450
14.6.1 安全策略 450
14.6.2 漏洞评估 450
14.6.3 入侵检测 451
14.6.4 病毒防护 453
14.6.5 审计、记账和日志 455
14.7 保护系统和网络的防火墙 455
14.8 计算机安全等级 456
14.9 例子:Windows 7 457
14.10 小结 459
复习题 459
习题 459
推荐读物 460
参考文献 461
第六部分 案例研究
第15章 Linux系统 466
15.1 Linux历史 466
15.1.1 Linux内核 467
15.1.2 Linux系统 468
15.1.3 Linux发行 468
15.1.4 Linux许可 469
15.2 设计原则 469
15.3 内核模块 471
15.3.1 模块管理 472
15.3.2 驱动程序注册 473
15.3.3 冲突解决 473
15.4 进程管理 473
15.4.1 fork()/exec()进程模型 474
15.4.2 进程与线程 475
15.5 调度 476
15.5.1 进程调度 476
15.5.2 实时调度 477
15.5.3 内核同步 478
15.5.4 对称多处理 479
15.6 内存管理 480
15.6.1 物理内存管理 480
15.6.2 虚拟内存 482
15.6.3 执行与加载用户程序 484
15.7 文件系统 486
15.7.1 虚拟文件系统 486
15.7.2 Linux ext3文件系统 487
15.7.3 日志 489
15.7.4 Linux进程文件系统 489
15.8 输入与输出 490
15.8.1 块设备 491
15.8.2 字符设备 492
15.9 进程间通信 492
15.9.1 同步与信号 492
15.9.2 进程间的数据传递 493
15.10 网络结构 493
15.11 安全 495
15.11.1 认证 495
15.11.2 访问控制 495
15.12 小结 496
复习题 497
实践题 497
习题 497
推荐读物 498
参考文献 499

教学资源推荐
参考读物推荐
作者: Steve Shah
作者: [美]亚伦·纽科姆(Aaron Newcomb) 著
作者: 陈科 编著