本书源于Jean Bacon的《并发系统》(Concurrent Systems)第一版和第二版。专门为英国Open大学改写的第三版也刚刚出版,该校从1999年起就将这本书用做 “软件系统及其开发”课程的教科书(课程编号M301)。这门课程并不涉及操作系统设计的具体细节,因此在第三版里删去了书中的这些细节。
本书扩充了《并发系统》中关于操作系统的内容,使之更适合作为一门标准的操作系统课程的教材。《并发系统》第一版和第二版建立了理解软件系统的最基本的原则。本书有如下特点:
● 全书通过Java语言提供面向对象概念、并发算法和分布式编程的范例
● 对操作系统设计和实例分析等内容进行了更新和扩充
● 安排专门一章讲述安全性问题,并补充了涉及分布式系统的内容
● 第四部分的实例分析将经典版本的UNIX系统与当前版本分别讨论,并引进了新的一章讲解可扩展操作系统。“万维网”与重新写作的“中间件”部分,展示了分布式系统近年来的新发展
本书仍然沿用强调系统分析的思路和讲述方式。自1993年以来,这种思路在这个不断发展的领域中得到了广泛应用。
本书的目的在于让学生获得对现代软件系统的整体认识。模块化、并发与分布式是全书的主题,这既表现在操作系统的设计中,也表现在操作系统所支持的系统中。本书不是从编程的角度,而是从系统的角度来讲解的,因为并发和分布式编程是紧密嵌入在系统设计中的。编程语言是系统设计人员的实现工具,本书从这个角度处理编程语言。
本书的结构如下:
● 系统设计需求 介绍真实世界中各种系统的类型和建立基于计算机的系统的基本要求。
● 第一部分 探索技术与系统设计之间的关系。详细讲解操作系统的基本功能,建立作为并发进程的共同体系的抽象和实现。介绍分布式系统的基本属性和这类系统中的安全性问题。
● 第二部分 着重讲述操作系统和应用层系统中的并发控制,以及在系统设计语境下的进程间通信(IPC)。为了便于分别讲解,这部分的主题专注于在主存内怎样实现对象调用方法的原子操作。我们通过对被调用对象是永久对象或远程对象案例的讨论,得到了结论;也仔细讨论了分布式IPC。
● 第三部分 这一部分的主题是并发复合操作或事务处理。这些观点的传统应用领域是数据库系统,但是这里叙述了这些系统概念的一般应用能力。
● 第四部分 用本书中所建立的视角进行一些案例研究。
计算机系统课程
分布式系统近年来得到非常广泛的应用,大学本科的最后一年或研究生课程中经常包含这部分内容。分布式系统现在是很常见的,比起集中式的分时系统,学生更倾向于使用分布式系统。在一门入门课程中想要覆盖共享、集中式操作系统中大多数细节似乎不太现实,特别是技术的快速发展使得我们必须对传统的处理和算法进行持续不断地评估。
总之,专才培养与通才培养之间似乎有一种越来越紧密的联系,甚至在本科阶段也是如此。尽早对系统的各个部分及其之间关系有一个概要性地了解是可取的:
● 操作系统包含通信处理
● 语言运行时系统与操作系统紧密联系,又被后者所约束
● 实时系统要求专门设计的操作系统
. ● 专用的通信处理计算机需要专门设计的操作系统
● 数据库管理系统需要运行在操作系统上,并且需要并发性和文件管理方面的特殊保证
● 并发程序需要运行在操作系统上
● 操作系统(及其部件)本身就是并发程序
● 视窗系统需要并发进程
● 许多系统部件都要使用数据库
● 分布式系统要使用分布式数据库
● 分布式数据库需要通信
● 分布式操作系统需要“事务处理”
本书采用模块化结构(全书使用一个简单的对象模型),并发控制和分布式建立起一个通用的框架来整合上面的要求。
作者自从1988年起就在剑桥大学计算机系的一个三年制本科计划的课程里使用了这套讲解方式。在该三年制计划中的第二年,并发系统课程是分布式操作系统、通信与网络、并发理论和许多实例研究与工程的先修课程。图P.1给出了系统知识的关系。实时和嵌入式控制系统的一般课程也自然成为这门课的后继课程。
在IEEE的计算机分会和ACM出版的《计算课程体系91》(Curriculum 91 Computing)(Denning等,1989; Tucker 1991)中,“操作系统”的范畴包括了分布式操作系统和通信。《计算课程体系91》规定了计算这个领域的三大主要部分:植根于数学理论;植根于实验科学方法的抽象(建模);植根于工程学的设计。理论讨论计算领域背后潜在的数学原理。 抽象使我们可以对大的复杂系统进行建模从而能认识它们的结构和行为,并且对之进行实验。设计是针对某个具体问题实现一个系统的过程。这里所采用的处理方法涵盖了抽象和设计,并建立了理论基础。
2001年12月,IEEE-CS/ACM出版了用于计算机科学的计算课程体系2001。用于计算机工程、软件工程和信息系统的《课程体系》也随后出版。该学会指出,由于这个领域在过去十年中有了长足的进展,应该规定一个最小的核心课程体系列表,然后在这个基础上进行多种扩展。操作系统课程的18个最小课时核心主题(和所占课时)是:操作系统概论(2课时);操作系统原理(2课时);并发(6课时);调度和分派(3课时);内存管理(5课时)。在网络为中心计算课程的15个最小课时里,核心的主题是:概论(2课时);网络和通信(7课时);网络安全(3课时);网络作为客户-服务器模式的实例(3课时)。在信息管理课程的10个最小课时里,核心的主题则把事务处理作为一个简单的扩展。“对象先导”(Object First)是三个所建议编程入门的模式之一[另外两个是“要事先导”(Imperative First)和“功能先导”(Functional First)]。这里表达的整体观点包含了对系统主题核心内容的整合和扩展。
关于本书的读者
本书的读者应该至少具有一些系统和编程语言的知识和经验。计算机系本科生第一年的编程和系统软件课程就是比较合适的先修课程。同时它也可以作为通信和数据库专业的教材使用。本书也是系统研究方向研究生的合适入门课程,为当前多种多样本科专业的学生提供了综合的、概要性的学习机会。在系统设计(包括系统程序设计)领域中的从业者会在本书中找到有关课题的基本原理。研究并行理论的研究生也可以在本书中得到其课题的实践基础。
内容概要
第1章叙述了多种系统类型,指出了支持它们所需的条件。软件系统可以利用硬件的各种拓扑和体系结构。虽然本书不会详细讨论这个课题,但会引用这些系统的特征。
第一部分包括第2章至第8章。系统设计和实现需要软件的工程化。有很多著作专门讨论软件工程;软件工程涵盖了软件系统的规格说明、设计、实现、维护以及演化。在此简要地叙述了模块化软件结构的背景知识,并建立了本书中所使用的对象模型。
第2章叙述模块化系统结构,建立起操作系统的模块化结构。并引入下面的观点:最小化的内核,也称“微内核”,能为高性能的专门化服务提供一个合适的基础。本章也叙述用于实现软件动态执行的进程和协议的概念。
第3章讨论设备和通信的处理。之所以把这些课题放在一起讨论,是为了突出它们的共性(通信和其他设备之间)和差异(通信软件比设备支持软件更大,而且更复杂)。在操作系统中,通信处理子系统本身就是一个并发(子)系统,在给定时间内,该系统可能需要处理跨网络的、不同来源的多个输入流,以及来自本地的客户端的网络通信请求。
第4章详细给出了操作系统“进程”这个抽象概念的具体基础。一旦进程抽象作为操作系统功能被创建之后,就可以展示如何利用进程来实现系统其余部分的动态执行。进程可用于操作系统自身的模块,而用户进程则用于应用程序模块。本书讨论了若干种可选的设计方案。本书后半部分涉及语言系统,特别是对并发执行支持的讨论。有关操作系统和语言系统之间的关系也会详细讨论。
第5章讲述内存管理。进程的地址空间是一个重要的概念,有关地址空间共享部分的机制也同样重要。
第6章给出了文件系统的基本概念。文件系统的实现涉及到内存和磁盘上持久存储器的数据结构。操作系统的内存管理和文件管理子系统需要同时处理不同软件的I/O请求,以及不同硬件的服务请求,所以它们也是并发系统。
第7章介绍分布式软件系统。首先着重讨论它们的基本性质,然后较为具体地讨论了时间和命名处理。后续章节可以看成在前面所叙述的各项功能的具体讨论。
第8章讨论了集中式和分布式系统的安全问题。
第一部分所涉及的是技术以及它们对系统设计的影响。这里所介绍的知识,对于深入理解软件系统是必需的。当在语言和理论模型层次考虑问题时必须小心,要确保所做的假设对实现系统所用的操作系统和硬件来说是合理的。
第二部分讨论系统设计的一个主要需求:并发控制。在此阐明了保证一个进程在执行时不受任何其他进程干扰的机制。需要注意的是,一个进程可能需要与别的进程协作(并需要与它们同步),或者与别的进程竞争某些资源。
第二部分包括第9章至第16章。在这一部分,有时候会暂时忽略复合操作和某些任务需要同时访问多个资源等问题,而把讨论集中于内存中某个对象的单个方法调用上。“单一抽象操作”是一种非正式的提法,与系统的模块化结构密切相关。一般说来,一个进程可以读写内存中的一个字而无需担心其他进程的干扰。这样的读或写是不可分的。在实际中,编程语言层次的变量或者像数组、列表和记录这样的数据抽象并不支持这样原子化的读写操作。本书第二部分关注的是在并发进程中对这种共享数据抽象的访问。第9章到第14章主要关注运行在单一或者分布式内存中的即时执行系统。第15章和第16章开始考虑系统构件错误的影响,以及涉及持久存储器的进程交互。
第9章讨论了共享内存,以及运行于公共地址空间的进程与非共享内存进程之间的主要区别。这里所给出的例子说明了这两种方式都是必需的。
第10章考虑了支持进程交互所需最底层的机制。这涉及到计算机和系统自身的体系结构。我们必须了解计算机是否提供某些“读-改-写”的复合指令,也必须掌握系统采用的是共享内存多处理器还是单处理器体系结构。本章讨论了无硬件支持的并发控制,并引入了信号量。
第11章在底层支持的基础之上构造了解决经典系统问题的算法。在编程中正确地使用信号量并不容易。对该难点的讨论引出了下一章中有关支持并发高级语言的讨论。
第12章考察了高级并发程序设计语言引入的原语。一个潜在的假设是进程在共享的地址空间中执行。本章还叙述了Java语言对并发程序设计的支持。
第13章对比了在提供共享地址空间与不提供共享地址空间的两种系统中进程间通信(IPC)的机制。这两种情况中,进程都需要访问公共信息并且同步它们的活动。
第14章讨论在不同地址空间中的进程间通信。讨论了管道和消息传递机制。本章的内容与分布式IPC高度相关,但是把IPC与通信服务的集成安排在第16章中讨论。
第15章叙述了系统随时崩溃的可能性,并且概要讲述了恢复机制。在这一章中对涉及持久数据的操作进行初步讨论。
第16章中集中讨论IPC和分布式系统,同时讨论在第7章中引入的那些基本特征。读者将看到,在分布式系统中如何通过远程过程调用协议在某一节点上调用另一个节点上的功能。有关节点崩溃与重启,以及网络故障等已经有所考虑。虽然分布式IPC是本章的重点,但本章也包含了关于分布式系统中的命名、定位以及将命名绑定至定位的一般性讨论。作为实际的例子,本章给出了Java中的套接字编程以及远程方法调用(RMI)。
第三部分包括第17章到第23章,这里把所讨论的内容推广到复合操作(事务处理),以及构成它们的子操作的并发执行。相关的对象可能存在于内存、持久存储器或分布式系统中。
第17章引入了事务并发这个问题并且说明了相关研究的背景。复合操作可以跨越分布式系统并且涉及到持久存储器。
第18章讨论动态资源分配的需求,以及由此引发的系统死锁的可能。初步探讨了资源的分配与管理,包括检测与避免死锁的算法。
第19章讨论了在存在并发与崩溃环境下复合操作的执行,并且确立了事务基本属性的概念。这里采用了一个基于抽象数据对象的模型。
第20章讨论了事务处理的并发控制。阐述了二阶段锁、时间戳排序以及乐观并发控制等,并对它们进行比较。
第21章主要考虑崩溃的恢复,同时,并发控制所需的中止事务的能力也是一个相关的问题。本章给出了一个具体的实现。
第22章把用于事务的对象模型推广到了分布式系统中,并且重新考虑了实现并发控制的方法。讨论了分布式原子操作提交的问题。作为一个例子,给出了一个两阶段提交协议,也给出了一个用于乐观并发控制的验证协议。
第23章包含了分布式计算可能用到的算法。
第四部分包括第24章到第30章,进行实例分析。相比之前给出的例子而言,这里可以进行更加深入的讨论。其目的是要说明,在本书中给出的各种方法会对读者理解大型的复杂系统有所帮助。
第24章叙述了基本UNIX第7版的设计,即“经典UNIX”。评价了其设计,特别指出了其进程管理和进程间通信方面的问题。
第25章说明了Linux,Solaris和现代UNIX如何解决有关经典UNIX的这些问题。
第26章是关于可扩展操作系统的内容,考察了更多基本的操作系统结构,包括微内核结构。
第27章探讨了采用面向对象方法设计的Windows 2000。目前个人计算机的硬件已经能够提供支持多应用、多用户所需的保护机制,并且足以支持大规模的应用。
第28章讨论了Web编程,这个课题是近几年来才出现的,并得到了广泛的发展。这种编程模式主导了相当部分的分布式系统设计与开发。
第29章讨论了多种类型的中间件,并对基于同步对象调用和基于异步消息传递的中间件技术进行了对比。前者包括Java,OMG的OMA和CORBA;后者包括IBM的MQseries和TIBCO TIB/Rendezvous。另外,本章也概述了微软的DCOM和 .NET技术。
第30章首次从进程、IPC和通信的角度讨论了事务处理监控程序的实现。本章给出了用于电子资金转移的几个事务处理系统的例子,例如国际自动柜员机(ATM)网络。
本书的附录A叙述了在技术和商业背景下软件系统的历史和功能上的发展。 也包含了在没有任何硬件支持的情况下如何实现并发控制的技术以及习题。
讲授顺序
图P.2展示了各部分内容之间的依赖关系,并且说明了如何选用本书中的章节用于操作系统和分布式系统的课程,以及作为并发编程、系统编程或数据库课程的补充资料。
第二部分的内容可以按照不同的顺序讲授。虽然在本书写作中,这些章节就存在目前这样的顺序,但事实上并没有内在的理由要求共享内存IPC必须在无共享内存IPC之前讲授,尽管分布式系统自然遵从后者。
对于并发编程的课程,可以在第一部分和第二部分的基础上补充用于课程设计的编程语言的详细知识,选择Java是很自然的。也应该把第三部分的第17章和第18章包含在讲授范围内。
关于数据库系统中并发控制的课程,可以使用第三部分的内容,而涉及操作系统的前面一些章节为数据库提供了很好的背景知识。
图P.2 本书的讲授顺序
进一步学习
本书很自然地把读者引导至更高级的课程:专用操作系统、嵌入式实时控制系统、大规模分布式系统、分布式数据库等。本书建立了并发控制、分布式、命名、定位、部署、保护、认证、加密等的概念框架,为进一步研究系统设计做好了准备。
本书的目标
本书主要强调系统设计(其中操作系统占主要部分),如何理解现有的系统以及设计新的系统。在特定的操作系统上,用特定的语言是无法完成某些任务的。本书解释了这种情况背后的原理。计算机已经商业化了。因而像“实时操作系统”这样的名字与其实际含义已经几乎没有关系了。为了在遇到销售人员时能够保持清醒,读者必须知道自己需要什么,并且必须注意到所提供的系统有哪些缺陷。作者希望本书能够帮助系统设计人员选择适合自己需要的硬件和软件。
教师指南
本书配有《习题解答手册》。解答中还包含各种不同设计在实际应用中的范例(关于《习题解答手册》的获取,请参见书后所附的“教学支持说明”)。
致谢
感谢Open大学教师队伍的贡献。Robin Laney,Pete Thomas和Janet van der Linden在Open大学的课程“软件系统及其开发”中使用本书先前版本的教学经验为本书提供许多改进建议。作者采用了他们提供的关于用Java语言进行并发和分布式编程的材料以及一些思考题。作者也要感谢剑桥大学选择本书作为教材的同学们的反馈意见,以及在系统研究领域的研究生和同事们的意见。感谢那些在教学中采用了本书,并且对本书的发展提供帮助的人们。感谢Ken Moddy为本书讨论的各个方面,特别是为数据库所提供的材料。感谢Austin Donnelly校订了UNIX相关的章节。感谢培生教育集团在整个出版过程中所提供的帮助、推动和鼓励。
Jean Bacon与Tim Harris
2002年7月