第1章 绪论

设计傻瓜都会用的产品时,大家常犯的一种错误是低估彻头彻尾的傻瓜的智商。1

——Douglas Adams(1952—2001)

1该句引用自Mostly Harmless(Tor Books出版社, 1993)。

资源是一种实体,其供应有限,因此存在请求方和机制,其中请求方为资源用户,需要使用该实体来执行特定功能,而机制为资源提供方,应请求提供该实体。在软件系统中,资源可以是内存、同步原语、文件句柄、网络连接、安全令牌、数据库会话、本地服务和分布式服务等。资源可以是应用服务器组件[VSW02]等重量级对象,也可以是文件句柄等精致的轻量级对象。

有时候,要确定资源是什么是件极具挑战性的工作。例如,在编程环境中,图像(如JPEG或GIF文件)常被称为资源,但实际上并没有定义获取和释放图像的语义。相反,这种资源由组成图像的数据构成,因此更准确的做法是,将图像占用的内存视为资源,在加载图像时获取该资源,并在不再需要图像时释放它。

对资源进行分类的方式有很多,其中最简单的方式是,将资源分为可重用的不可重用的。通常从资源提供方那里获取可重用的资源,使用完毕后将其释放;这种资源被释放后,可被再次获取和使用。内存就是一种可重用的资源,由操作系统分配,使用完毕后归还给操作系统。其他可重用的资源包括文件句柄和线程。可重用的资源是最重要的资源种类,因为资源提供方拥有的资源通常有限,所以重用未被消耗掉的资源合乎常理。相反,不可重用的资源会被消耗掉,因此获取这样的资源后,要么不释放,要么隐式地释放。计算网格中的处理时间[Grid04]就是一种不可重用的资源,处理时间被获取并使用后就消失了,无法归还。

还可根据访问或使用方式对资源进行分类。获取后,资源要么可供多名用户同时使用,要么只能供一位用户使用。可供多名用户同时访问的资源包括服务、队列和数据库。如果可供多名用户同时访问的资源包含可修改的状态,则需要对资源访问进行同步。相反,如果可供多名用户同时访问的资源没有状态,则不需要同步。J2EE EJB[Sun04b]应用程序服务器的无状态会话bean是一种不需要同步的资源,而网络通信套接字是一种需要同步的资源。可供多名用户同时访问的资源不要求每位用户都显式地获取它,相反,资源用户可共享资源引用,因此有一名用户获取资源引用后,其他用户就可直接使用它。

相反,如果资源只能供单个用户使用,则被称为独占式资源。一个独占式资源的例子是服务的处理时间。可将处理时间视为不可重用的独占式资源,由服务(即资源提供方)提供。资源用户可从服务那里获取处理时间,而服务本身可被视为另一项资源。获取服务意味着获取处理时间。

独占式资源可以是可重用的,也可以是不可重用的。然而,如果资源是不可重用的,则肯定是独占式的,因为它只能供一位资源用户使用。另外,如果独占式资源是可重用的,则只能依次重用它,即在不同的时间使用。

将资源分成不同类别常常不那么简单,甚至毫无意义。例如,与服务的处理时间一样,CPU处理时间也可以被认为是宝贵资源。你可能认为它是一种不可重用的独占式资源,由线程(资源用户)获取,但实际上,CPU处理时间不受任何应用程序的控制,而由操作系统控制。从应用程序的角度看,CPU处理时间由操作系统分配给线程,因此线程并不需要将它作为一种资源进行获取。

资源常常依赖于其他资源。例如,文件句柄是一种表示文件的资源,而文件本身也可被视为一种资源。另一个例子是组件提供的服务,它由线程和内存资源组成。这种资源依存关系可使用包含多个资源提供方的图形表示。

下表对资源分类进行了总结,并为每种资源提供了一个例子。

可重用 不可重用
独占式 内存 处理时间
非独占式 只读式对象 -

目录