我是荔园微风,作为一名在IT界整整25年的老兵,今天给大家讲讲操作系统。
当今的操作系统趋向于越来越复杂,因为它们提供许多服务,并支持各种硬件和软件资源(请参见“操作系统思想:尽量保持简单”,以及“系统设计师与系统工程师”)。通过将操作系统的组件组织起来,并指定每一个组件的执行权限,操作系统体系结构能够帮助设计人员管理这些复杂性。在单内核设计中,操作系统的每一个组件都包含在内核中;在微内核设计中,只有必要的组件包含在内核中。(请参见“操作系统思想:体系结构”)。
操作系统思想:
尽量保持简单(Keep It Simple,KIS)
复杂系统在设计、实现、测试、调试和维护等方面的费用都很昂贵。操作系统设计人员经常选择最简单的几种方法解决某一特定问题。尽管有时采用更复杂的方法可能会具有更好的性能,或者因为有一些其他改进值得采用这样一种方法。这种折中在计算方面是很普遍的。
对数组进行简单的线性搜索在程序中不算什么,但是与更精确和更复杂的二进制搜索相比,其运行速度要慢一些。树形数据结构比数组操作起来更复杂,但是它可以更容易、更快速地完成某些类型的插入和删除。
一般情况下,在解决操作系统问题和开发资源管理策略时,我们会交替考虑一些方法。当我们阅读这些讨论时,就会明白在简单性和复杂性之间的权衡折衷。当我们阅读这些解决方案时,可能倾向于喜欢某些方法。我们将来所使用的系统可能要求采用不同的方法。我们的原则是对普遍采用的一些方法从正反两方面列出其优缺点,帮助大家亲自做出业界最好的判断。
系统设计师与系统工程师
如果我们跻身于操作系统开发领域,并具有较高的地位,那么就可能会拥有一个头衔,例如系统设计师或系统工程师。几年前,在一次会议上,一名软件同行的专家作为来宾在会上进行演讲,他被介绍为系统设计师。他说道:“你们可能想知道系统设计师与系统工程师有什么区别”。
他用建筑做类比,谦逊地对这种差别做了解释,“当一名工程师建造一座大楼时,尽管它的构造非常棒,但却太难看,人们将其拆毁了;当一名设计师建造一座大楼时,虽然它的外观非常漂亮,但它却倒塌了!”
对操作系统设计者的启示:我们需要将体系结构和工程两方面综合起来考虑,这样才能确保系统既有好的构造,又有优美的外观。相比之下,前者更为重要。
操作系统思想:
体系结构
就像建筑师使用不同的方法设计大楼一样,操作系统设计人员也采用不同的方法来设计操作系统体系结构。有时,这些方法并不混杂使用,整个系统只使用一种体系结构方法。有时则混合使用这些方法,可以取几种体系结构风格的优点。设计人员所选择的方法在操作系统初始实现及演化中起着举足轻重的作用。以后进一步开发时再要改变采用的方法就会越来越困难,因此,在系统开发早期选择一个合理的方法是很重要的。一般地说,第一次就正确建造一座大楼比起造好之后再做修改要容易得多。
在软件系统中,比如操作系统,最常采用的体系结构方法之一是分层。采用这种方法,将软件分成模块,这些模块称为层,每一层都完成某些任务。每一层都调用它下一层所提供的服务,而这一层的实现却对它上面的一层隐藏起来。分层方法同时具有模块性和信息隐藏的软件工程技术的优点,为构建高质量的系统奠定了坚实的基础。整本书中都要讨论分层软件方法,我们先从计算机先驱 Dijkstra 曾经研制的THE系统谈起,接下来,分别介绍 Linux和 Windows XP 操作系统是如何使用分层方法的。
单内核体系结构
单内核操作系统(monolithic operating system)是最早出现的也是最常用的操作系统体系结构。在这种结构中,操作系统的每一个组件都包含在内核中,并能够直接与其他任何组件进行通信(即简单地通过函数调用来实现通信)。
一般情况下,内核执行可以不受限制地访问计算机系统。OS/360,VMS 和Linux 等操作系统明显地具有单内核操作系统的特性。由于组件之间直接进行通信,所以单内核操作系统效率很高。因为单内核操作系统将组件集合在一起,所以无论如何,要查出bug和其他错误的来源都不是一件容易的事。而且,由于所有代码的执行都可以不受限制地访问系统,所以单内核系统尤其容易受到错误代码或者恶意代码的破坏。
分层体系结构
随着操作系统变得越来越大,越来越复杂,完全使用单内核设计就不太适用了。对操作系统进行分层可以解决这一问题,这种方法将执行相似功能的那些组件分组成层。每一层都只能与其相邻的上层或相邻的下层进行通信。较低的层使用一个将其实现隐藏起来的接口为较高的层提供服务。
分层的操作系统比单内核操作系统具有更好的模块性,因为对每一层的实现进行修改时,都不需要修改其他层。模块化系统具有整个系统都可以重用的自含式组件。每一个组件都将其完成作业的具体方式隐藏起来,并提供了一个标准接口,其他组件可以使用此接口请求这一组件的服务。模块性使操作系统具有结构化和一致性。
但是,采用分层方法,一个用户进程的请求可能需要传过许多层才能得到服务;因为必须调用额外的方法,才能将数据从一个层传递到邻接的层,所以与单内核操作系统相比,其性能会有所降低。在单内核操作系统中,要为与此相似的请求提供服务,可能只需要执行一次调用。另外,由于所有的层都可以不受限制地访问系统,所以分层的内核也容易遭到错误代码或恶意代码的破坏。THE操作系统是分层式操作系统的一个早期范例。107今天的许多操作系统,包括 Windows XP 和 Linux,都在一定程度上实施了分层。
微内核体系结构
微内核操作系统(microkernel operating system)体系结构只提供少量的服务,力图使内核较小,且可伸缩。一般情况下,这些服务包括底层内存管理、进程间通信以及基本的进程同步(进程同步使进程能够协作完成任务)。在微内核设计中,大多数操作系统组件(例如,进程管理、网络连接、文件系统交互和设备管理)在内核的外部执行,它们具有较低的权限级别。
微内核展示了高度的模块性,这样的系统可扩展、可移植和可伸缩。而且,因为微内核的执行并不依赖于每一个组件,所以如果一个或多个组件发生故障,也不会引起操作系统故障。但是,这种模块性的获得是以增加模块间的通信级数为代价的,这就降低了系统性能。虽然当今流行的操作系统很少有完全基于微内核设计的系统,但是,Linux和Windows XP等操作系统都包含模块组件。
网络操作系统和分布式操作系统
电信技术的发展深刻地影响了操作系统。网络操作系统(network operating system)使其进程能够访问驻留在网络上的其他计算机上的资源(例如,文件)。许多网络操作系统和分布式操作系统的结构经常是基于客户机/服务器模型的。在这种网络中,客户机借助于合适的网络协议请求资源,例如,文件和处理器时间。操作系统设计人员在设计这样的网络时,必须仔细地考虑如何管理数据和计算机之间的通信。
有些操作系统具有明显的网络操作系统的特性。在网络环境中,一个进程可以在创建此进程的计算机上执行,或者也可以在网络中的其他计算机上执行。在有些网络操作系统中,用户可以精确地指定他们的进程在哪里运行;在另外一些网络操作系统中,则由操作系统确定进程在哪里执行。例如,系统可能确定,如果一个进程在具有轻负载的计算机上执行,则会有更高的效率。
网络文件系统是网络操作系统的一个重要组件。在最低层次上,用户获得另一台机器上的资源是通过显式地连接到那台机器并检索文件获得的。较高层的网络文件系统使用户能够访问远程文件,就好像这些文件在本地系统上一样。网络文件系统的范例包括 Sun公司的网络文件系统(Network File System,NFS)以及卡内基·梅隆大学(CMU)的 Andrew 和Coda 文件系统。
分布式操作系统(distributed operating system)是一个单一的操作系统,它管理多个计算机系统上的资源。分布式系统(distributed system)给人一种假像,将多台计算机视为单一的一台功能强大的计算机,这样一个进程可以访问所有的系统资源,而与进程在分布式系统的计算机网络内的位置无关。分布式操作系统常常很难实现,并且需要复杂的算法才能使进程进行通信和共享数据。分布式操作系统的范例有麻省理工学院(MIT)的Chord 操作系统和阿姆斯特丹自由大学(Vrije Universiteit in Amsterdam)的Amoeba 操作系统。
作者简介:荔园微风,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。