UNIX系统结构对软件架构的启示
简介:本文关心的是怎样构造一个能适应用户需求变化的软件,本文从对UNIX系统结构的分析出发,分析了UNIX系统用怎样的方式满足了多种多样的用户需求,并在此基础上提出了一种软件架构模式。
众所周知,软件开发中的一个难题是怎样面对用户的多种需求,即(1)、怎样满足多个不同用户的不同需求;即(2)、怎样满足用户不断变化的需求。而有操作系统中,UNIX系统(或类UNIX系统如LINUX)在满足不同用户需求上的可裁剪性即在满足用户不断改变的需求上的可扩展性给我们留下了深刻的印象,我们不禁要问:UNIX系统这种可裁剪性和可扩展性是怎样取得的呢?答案是因为UNIX具有特殊的系统结构。
一、UNIX系统结构分析:
SHELL程序
|
提供给用户的服务程序(包括多个正文处理程序)
|
协调用户和核心之间的实用程序
|
OS核心
如上图所示,UNIX操作系统是一种层次结构。
在这个层次结构中,处于最底层的是UNIX系统的核心(即UNIX操作系统常驻内存的部分),在核心之上是用以协调用户和核心之间的实用程序,UNIX系统结构最底层的两个层次构成了UNIX操作系统的基本部分,这个基本部分能够运行(例如能够成功启动)但不能提供给用户任何服务,严格的说,这样的操作系统对用户来说是毫无用处的,用户需要的是操作系统提供给他的服务,为此,UNIX系统提供了大量的服务程序供用户调用(通过命令行或GUI方式),这些服务程序构成了UNIX系统的第三层即提供给用户的服务程序。UNIX系统的前三层构成了一个实用的操作系统,但这个操作系统虽然提供有许多服务程序供用户使用,但这显然不能满足用户多种需求以及需求的变化(面对庞大的用户群和不断变化的需求,再多的服务程序都不能满足用户的要求),为了更好的满足用户的需求,UNIX系统在服务程序上提供了SHELL程序,使得用户可以按照自己的需求编写脚本程序,以完成特定的任务(最简单的如批量执行命令),这就是UNIX系统的最上一层,即SHELL程序层。
相对于其它操作系统,UNIX操作系统的系统核心提供的服务较少,它根本不替用户干任何事情,它只负责系统最核心的工作——系统资源的管理,如进程调度、内存和磁盘的分配,主存和外部设备之间数据的传递并且受理进程所需要的服务,这些工作是每一个操作系统都必须要做而且经常要做的工作,因此,其效率和正确性将直接影响整个系统的性能,为此,UNIX构造一个高效的、健壮的系统核心,而将为用户提供的服务交由协调用户和核心之间关系统的实用程序来完成,这使得UNIX一方面是高效的和稳定的(因为其具有高效稳定的系统核心)另一方面也是可扩展的、可裁剪的和可修改的(对系统的扩展、裁剪和修改只需修改实用程序,这显然要比修改系统核心容易得多)。OS核心+协调用户和核心之间关系的实用程序构成了UNIX操作系统的基本部分。为了提供更多的服务,UNIX提供了大量的服务程序供用户调用,这些实用程序都是精炼的,往往只关心用户需求中很小的一部分。但为并不是UNIX的特色,UNIX与其它操作系统(如DOS和WINDOWS)的最大不同,是它提供了一种机制,这种机制使得用户可以随心所欲的组合操作系统提供的服务程序,以满足用户的特殊需要。为了提供这种机制,UNIX操作系统做了三方面的工作,首先,在操作系统基本部分的功能中,首先将外设与文件作出了相同的处理并提供了输入输出重定向机制,这使得用户可以其它途径(例如一个文本文件)为一个服务程序提供输入(由此,可以实现输入的自动化),即将一个服务程序的输出重定向到其它方向而非标准输出(屏幕)(这使得服务程序的输出能够作为另一个服务程序的输入,也使得一个服务程序的输出能够被程序自动分析)。其次,在系统的第三层,即提供给用户的服务程序中提供了大量的正文处理程序,通过有机的组合使用这些正文处理程序,用户可以对非常复杂的文本文件进行分析,这为分析一个服务程序的输入、输出提供了前提条件。最后,在系统的最外层,UNIX提供给用户一个脚本程序框架,通过编写UNIX SHELL脚本程序,用户可以十分方便的使用系统提供的服务程序,与DOS/WINDOWS提供的批处理相比,UNIX SHELL是真正的脚本程序,它提供了一个程序设计语言所应具备的所有功能,如流程控制、函数与子程序等功能,同时,它是一个解释程序,其执行程序(也是源程序)就是一个拥有执行权限的文本文件,这使得编写、阅读、修改、使用都很容易。而且UNIX将SHELL程序与系统本身提供的服务程序(这些程序大都是二进制程序以保证其执行效率)同等对待,具有相同的调用方式,一个编写好的SHELL程序可以作为UNIX系统提供的服务一样供用户调用,因此,编写SHELL本身就是对UNIX系统的扩展,事实上,在UNIX系统的基本部分中,就存在大量的SHELL程序(如系统的初始化脚本中)。
二、对软件架构的一点启发
仿照UNIX系统结构我们可以构造一种能够满足用户需求变化的软件系统结构——层次结构。UNIX操作系统为这种结构提供了一个成功的范例。
这个层次结构由三层构成:
1、一个小巧、健壮、高效的系统核心。
2、一组提供基本功能的可调用的服务。
3、一种能够组合、灵活调用基本服务的平台。
系统核心必须小巧、健壮、高效,为此,他必然只能关注系统的最基本部分,一般地,它可以只管理和调度系统的核心资源。
对服务(程序),我们要求它功能单一(这能减小其复杂性——将复杂性交由组合平台处理同时增加其正确性,而且还满足模块划分的要求),健壮,高效,接口统一规范明确(具有相同的输入、输出方式),在这一层,可以不考虑用户界面的问题,而将用户界面交由组合平台处理。
最后,作为层次结构的最顶层,组合平台必须具有灵活的分析机制(如正文处理功能)、使用简单、方便编写、阅读、修改、扩展,因此,最好是基于描述,如果可能,可以直接套用UNIX的重定向+正文处理+SHELL脚本程序设计语言模式。