预计阅读本页时间:-
13.2.2 范型
一旦确定了目标,就可以开始设计了。一个良好的起点是考虑客户将怎样审视该系统。最为重要的问题之一是如何将系统的所有功能特性良好地结合在一起,并且展现出经常所说的体系结构一致性(architectural coherence)。在这方面,重要的是区分两种类型的操作系统“客户”。一方面,是用户,他们与应用程序打交道;另一方面,是程序员,他们编写应用程序。前者主要涉及GUI,后者主要涉及系统调用接口。如果打算拥有遍及整个系统的单一GUI,就像在Macintosh中那样,设计应该在此处开始。然而,如果打算支持许多可能的GUI,就像在UNIX中那样,那么就应该首先设计系统调用接口。首先设计GUI本质上是自顶向下的设计。这时的问题是GUI要拥有什么功能特性,用户将怎样与它打交道,以及为了支持它应该怎样设计系统。例如,如果大多数程序在屏幕上显示图标然后等待用户在其上点击,这暗示着GUI应该采用事件驱动模型,并且操作系统或许也应该采用事件驱动模型。另一方面,如果屏幕主要被文本窗口占据,那么进程从键盘读取输入的模型可能会更好。
首先设计系统调用接口是自底向上的设计。此时的问题是程序员通常需要哪些种类的功能特性。实际上,并不是需要许多特别的功能特性才能支持一个GUI。例如,UNIX窗口系统X只是一个读写键盘、鼠标和屏幕的大的C程序。X是在UNIX问世很久以后才开发的,但是并不要求对操作系统做很多修改就可以使它工作。这一经历验证了这样的事实:UNIX是十分完备的。
1.用户界面范型
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
对于GUI级的接口和系统调用接口而言,最重要的方面是有一个良好的范型(有时称为隐喻),以提供观察接口的方法。台式计算机的许多GUI使用我们在第5章讨论过的WIMP范型。该范型在遍及接口的各处使用定点-点击、定点-双击、拖动以及其他术语,以提供总体上的体系结构一致性。对于应用程序常常还有额外的要求,例如要有一个具有文件(FILE)、编辑(EDIT)以及其他条目的菜单栏,每个条目具有某些众所周知的菜单项。这样,熟悉一个程序的用户就能够很快地学会另一个程序。
然而,WIMP用户界面并不是惟一可能的用户界面。某些掌上型计算机使用一种程式化的手写界面。专用的多媒体设备可能使用像VCR一样的界面。当然,语音输入具有完全不同的范型。重要的不是选择这么多的范型,而是存在一个单一的统领一切的范型统一整个用户界面。
不管选择什么范型,重要的是所有应用程序都要使用它。因此,系统设计者需要提供库和工具包给应用程序开发人员,使他们能够访问产生一致的外观与感觉的过程。用户界面设计非常重要,但它并不是本书的主题,所以我们现在要退回到操作系统接口的主题上。
2.执行范型
体系结构一致性不但在用户层面是重要的,在系统调用接口层面也同样重要。在这里区分执行范型和数据范型常常是有益的,所以我们将讨论两者,我们以前者为开始。
两种执行范型被广泛接受:算法范型和事件驱动范型。算法范型(algorithmic paradigm)基于这样的思想:启动一个程序是为了执行某个功能,而该功能是事先知道的或者是从其参数获知的。该功能可能是编译一个程序、编制工资册,或者是将一架飞机飞到旧金山。基本逻辑被硬接线到代码当中,而程序则时常发出系统调用获取用户输入、获得操作系统服务等。图13-1a中概括了这一方法。

另一种执行范型是图13-1b所示的事件驱动范型(event-driven paradigm)。在这里程序执行某种初始化(例如通过显示某个屏幕),然后等待操作系统告诉它第一个事件。事件经常是键盘敲击或鼠标移动。这一设计对于高度交互式的程序是十分有益的。
这些做事情的每一种方法造就了其特有的程序设计风格。在算法范型中,算法位居中心而操作系统被看作是服务提供者。在事件驱动范型中,操作系统同样提供服务,但是这一角色与作为用户行为的协调者和被进程处理的事件的生产者相比就没那么重要了。
3.数据范型
执行范型并不是操作系统导出的惟一范型,同等重要的范型是数据范型。这里关键的问题是系统结构和设备如何展现给程序员。在早期的FORTRAN批处理系统中,所有一切都是作为连续的磁带而建立模型。用于读入的卡片组被看作输入磁带,用于穿孔的卡片组被看作输出磁带,并且打印机输出被看作输出磁带。磁盘文件也被看作磁带。对一个文件的随机访问是可能的,只要将磁带倒带到对应的文件并且再次读取就可以了。
使用作业控制卡片可以这样来实现映射:
MOUNT(TAPE08,REEL781)
RUN(INPUT,MYDATA,OUTPUT,PUNCH,TAPE08)
第一张卡片指示操作员去从磁带架上取得磁带卷781,并且将其安装在磁带驱动器8上。第二张卡片指示操作系统运行刚刚编译的FORTRAN程序,映射INPUT(意指卡片阅读机)到逻辑磁带1,映射磁盘文件MYDATA到逻辑磁带2,映射打印机(称为OUTPUT)到逻辑磁带3,映射卡片穿孔机(称为PUNCH)到逻辑磁带4,并且映射物理磁带驱动器8到逻辑磁带5。
FORTRAN具有读写逻辑磁带的语法。通过读逻辑磁带1,程序获得卡片输入。通过写逻辑磁带3,输出随后将会出现在打印机上。通过读逻辑磁带5,磁带卷781将被读入,如此等等。注意,磁带概念只是集成卡片阅读机、打印机、穿孔机、磁盘文件以及磁带的一个范型。在这个例子中,只有逻辑磁带5是一个物理磁带,其余的都是普通的(假脱机)磁盘文件。这只是一个原始的范型,但它却是正确方向上的一个开端。
后来,UNIX问世了,它采用“所有一切都是文件”的模型进一步发展了这一思想。使用这一范型,所有I/O设备都被看作是文件,并且可以像普通文件一样打开和操作。C语句
fd1=open("file1",O_RDWR);
fd2=open("/dev/tty",O_RDWR);
打开一个真正的磁盘文件和用户终端。随后的语句可以使用fd1和fd2分别读写它们。从这一时刻起,在访问文件和访问终端之间并不存在差异,只不过在终端上寻道是不允许的。
UNIX不但统一了文件和I/O设备,它还允许像访问文件一样通过管道访问其他进程。此外,当支持映射文件时,一个进程可以得到其自身的虚拟内存,就像它是一个文件一样。最后,在支持/proc文件系统的UNIX版本中,C语句
fd3=open("/proc/501",O_RDWR);
允许进程(尝试)访问进程501的内存,使用文件描述符fd3进行读和写,这在某种程度上是有益的,例如对于一个调试器。
Windows Vista更进一步,它试图使所有一切看起来像是一个对象。一旦一个进程获得了一个指向文件、进程、信号量、邮箱或者其他内核对象的有效句柄,它就可以在其上执行操作。这一范型甚至比UNIX更加一般化,并且比FORTRAN要一般化得多。
统一的范型还出现在其他上下文中,其中在这里值得一提的是Web。Web背后的范型是充满了文档的超空间,每一个文档具有一个URL。通过键入一个URL或者点击被URL所支持的条目,你就可以得到该文档。实际上,许多“文档”根本就不是文档,而是当请求到来时由程序或者命令行解释器脚本生成的。例如,当用户询问一家网上商店关于一位特定艺术家的CD清单时,文档由一个程序即时生成;在查询未做出之前该文档的确并不存在。
至此我们已经看到了4种事例,即所有一切都是磁带、文件、对象或者文档。在所有这4种事例中,意图是统一数据、设备和其他资源,从而使它们更加易于处理。每一个操作系统都应该具有这样的统一数据范型。