1.5 操作系统的研究与发展
操作系统是计算机科学发展的一条主线,它与计算机研究领域和工业界紧密相关。每一个成功的操作系统都需要经过几年甚至几十年的发展和检验。尽管在计算机科学发展的几十年间,有大量的操作系统问世,但真正对研究领域和工业界产生影响并能够长久流传下来的并不多。UNIX是一个典型的代表,它于1969年在贝尔实验室问世以来,已经发展出许多分支,形成了各种版本,包括UNIX System V、BSD、Solaris、HP-UX、AIX和IRIX等。其中有些系统已经公开源代码,而另一些则完全由商业公司控制。UNIX操作系统经过了40年的发展,几乎在各种硬件体系结构上都有它的版本,它已经被广泛应用于各个领域,尤其在大型数据处理和计算领域,始终占据着重要的地位。UNIX操作系统仍然在发展,除了在技术方面与硬件体系结构和Internet的发展保持同步以外,在软件发行和许可证管理方面也在发展,以迎合现代信息社会对系统软件的多样性需求。
在UNIX操作系统大家族中,有三种完全开放源代码的UNIX类操作系统:Linux、BSD(Berkeley Software Distribution)和Minix,它们与教育研究领域的关系尤为密切。Linux是20世纪90年代初为Intel 386体系结构开发的UNIX类操作系统,目前已被移植到几乎所有的硬件体系结构平台,它可以运行在个人计算机、PC服务器、中大型计算机系统上。Linux也是Internet发展的产物,其核心代码来自于自由软件爱好者们的贡献,Linux的发行遵从GPL(General Public License)许可,该许可要求凡是在Linux源代码基础上扩展的新技术也必须公开源代码。BSD使用了简化的许可证管理模式,它包含多个版本,其中比较常见的是三个发行版:FreeBSD、NetBSD和OpenBSD。FreeBSD侧重于对个人计算机体系结构的支持,主要运行在Intel 386体系结构平台上;NetBSD支持大量的硬件体系结构,为用户提供一个规模小、可移植性强的操作系统选择;OpenBSD的重点是系统安全性,其开发人员针对软件错误(bug)和安全漏洞审核源代码,它的目标是用于安全性要求高的场合,比如防火墙。Minix是一个基于微内核结构的UNIX类操作系统,其作者Andrew S.Tanenbaum编写Minix的目的是用于操作系统教学。Minix在教学中的运用激发了Linux的诞生,并且也影响了Linux在构造过程中的许多设计决策。
与UNIX类操作系统的发展完全不同的是,Windows是一个完全由商业公司来管理和控制的操作系统,在2006年以前它不开放任何源代码。目前它开放的研究内核源代码(即WRK)仍然侧重于教育目的。Windows比UNIX晚了整整20年,它的定位是个人计算机操作系统。由于硬件技术的飞速发展,Windows操作系统也适用于服务器系统,甚至构建大型集群系统。目前Windows仍然是一个活跃的、发展中的操作系统。
在现代操作系统的发展历程中,先后有多种内核结构被提了出来。最原始的内核结构是大内核(macrokernel或monolithic kernel)结构。使用大内核结构的操作系统,其本身是一个程序,所有基本的OS服务都运行在同一内存空间中,包括设备驱动程序提供的服务。在20世纪80年代以前构建的操作系统都是大内核操作系统,即使到今天,大内核仍然是操作系统主流的内核结构,像大多数UNIX类操作系统、Windows 9x和Linux系统都属于大内核操作系统。大内核操作系统的优点是,内核组件之间直接通过函数调用进行通信,所以执行效率高,内核中所有的操作都在特权模式下进行;但是它的缺点也不可忽略:系统组件和设备驱动程序运行在同一内存空间中,一旦发生错误(bug),则整个系统崩溃;另一方面,大内核内部组件之间的依赖性容易导致系统难以维护,以及出现意外的错误。
为了解决大内核操作系统日益增长的复杂性及其带来的各种问题,研究人员提出了微内核(microkernel)结构。在微内核操作系统中,只有直接建立在硬件基础上的一组最小系统服务(例如内存管理、多任务支持和进程间通信)由内核来实现,其他常见的服务,包括网络服务、文件系统等,都在用户进程中实现,它们通过内核提供的进程间通信(IPC)服务进行通信。微内核结构的优势是易于维护,小的内核更容易验证和测试其正确性,而更多的系统服务可以以高级语言来编写,并且可以在运行时动态替换或恢复;但是微内核结构达成这些优势的代价是牺牲效率:大量的处理器模式切换以及进程环境切换,使得其系统开销比大内核结构中的函数调用要大得多。纯粹的微内核结构并不多,Minix[MINIX]、QNX[QNX]和Mach[MACH]是微内核操作系统的典型代表。L4是一个微内核接口,代表了一族采用此内核接口的操作系统[L4-OS]。在实践中,有些操作系统综合了大内核和微内核的优势,将有些系统组件转移到了用户模式下,但仍然维护一个不小的内核,以达到在内核结构的简化和性能两方面的合理折中,这被称为混合内核(hybrid kernel)结构。Windows NT和Linux虽然常常被当做大内核操作系统,但实际上它们属于混合内核结构。
与微内核结构较为接近但又独树一帜的是exokernel,称为外核结构[EXOKERNEL]。与传统操作系统理念不同的是,exokernel提供尽可能少的硬件抽象,从而使应用程序开发人员对于硬件的使用有尽可能多的自主决策权。所以,exokernel结构中的内核比微内核还要小,本质上它们仅仅提供硬件资源的保护和共享使用。应用程序通过一些库操作系统(library operating system)来使用系统的硬件资源。Exokernel使得应用程序可以以最有效的方式来使用系统的硬件,避免因过于通用而带来的性能损失。然而,exokernel内核结构自1995年发表以来,仍然是一个理论模型,尚无重要的商用操作系统采用此模型。
对硬件进行抽象是操作系统的本质任务,而硬件抽象的一个极端是硬件虚拟化(virtualization)。硬件虚拟化的做法是,在给定的硬件平台上运行一个控制程序(称为宿主软件,host software),该程序为一个或多个客体软件(guest software)建立一个模拟环境,此模拟环境称为虚拟机(virtual machine)。所以,硬件虚拟化也称为虚拟机,而控制程序称为VMM(Virtual Machine Monitor)。虚拟机技术需要系统软件和硬件平台的有机结合才有可能,IBM在20世纪六七十年代已经在IBM S/370系统中引入了虚拟机技术[IBM-S370]。在Intel x86系统环境中,VMware在不利用硬件特性支持的情况下,使用“二进制代码翻译(binary translation)”技术自动修改x86软件中的指令,达到了完全虚拟化。2005年,Intel在x86处理器中引入了专门的虚拟化支持(称为Intel VT),从而使虚拟机模拟环境的执行效率更高。在Intel x86平台上,VMware和Microsoft Virtual PC是完全虚拟化的典型代表。本书附录A介绍了如何通过Virtual PC来调试虚拟机中的Windows系统。另一类值得一提的虚拟化是paravirtualization(仿虚拟化),典型的代表是Xen虚拟机[XEN],它的VMM并非全是模拟硬件,而是提供了一个特殊的API供客体OS使用,因而客体OS能够更加高效地使用宿主OS中的硬件资源,但是,这种虚拟机技术要求修改客体OS,这在某种程度上限制了它的应用范围。
从功能角度来看,现代操作系统的发展已经渐趋成熟,但是,随着网络环境的发展,以及硬件平台的多样化,现代操作系统也迫切需要一些新的结构模型或技术来迎合市场和用户的需求,其中安全性是现代操作系统发展过程中越来越被重视的一个特性。Singularity是Microsoft研究人员按照现代软件的安全性需求重新设计的一个操作系统原型[SINGULARITY],它使用类型安全的编程语言和抽象指令集合使得系统的进程之间有严格的隔离保证,其进程称为SIP(Software Isolated Process)。每一个程序、设备驱动程序或系统的扩展功能模块都运行在自己独有的SIP中,每个SIP有自己的对象空间、GC(垃圾回收器)和运行库。另一方面,从计算能力角度来看,现在的个人计算机正朝着多处理器和多核的方向发展,所以,操作系统如何更好地安排这些计算资源,以便于应用程序有机会发挥这些处理器的硬件优势,已成为一个新的研究课题。仅仅在原有操作系统基础上简单地扩展线程调度和进程管理模块,并不一定是最有效的做法,例如Corey原型系统证明了让应用程序来控制处理器(或核)之间的数据共享,比使用Linux的多任务调度机制有显著的性能提高[COREY]。
操作系统的研究既是一个老的主题,也仍然是一个活跃的主题。近几年随着云计算、移动网络、智能手机等一些相关研究领域的兴起,操作系统正面临着更多的挑战和机遇。在客户端,操作系统和浏览器技术的结合[GOOGLE-OS]有可能会改变用户使用计算机或手持设备的模式;而在服务器端(或云端),应用程序或服务的运行环境将变得更加复杂,甚至完全独立于实际的硬件环境。有关操作系统的最新研究状况,感兴趣的读者可以参考最近几年在USENIX、ACM、IEEE Computer Society等组织的一些有关计算机系统的会议或定期刊物上发表的文章。