Pennant的日常
分享工作上的点点滴滴

2.3 Eager Acquisition模式

      Eager Acquisition(预先获取)模式描述了如何通过在实际使用资源前预先获取并初始化资源来使运行时资源获取具有可预测性和快速性。

 

1.问题

      具有软实时约束的系统需要严格规定何时以及如何获取资源。这类系统的例子有:关键工业系统,高可伸缩性的Web应用程序,甚至桌面应用程序的图形用户界面(GUI)。在每个例子中,这样的系统的用户都会对系统的可预测性、延迟和性能作出一些假定。但是,如果执行任何用户发出的请求都会导致昂贵的资源获取(比如动态获取线程和内存),那么就可能会带来不可预期的时间开销。具有软实时约束的系统如何获取资源且依然可以满足约束呢?为了解决问题,需要关注以下几个问题点:

      1)性能(Performance)。资源使用者获取资源时必须要快。

      2)可预测性(Predictability)。资源使用者获取资源必须具有可预测性——每次获取资源时花的时间应该一样。

      3)初始化开销(Initialization overhead)。需要避免在应用程序运行时执行资源初始化。

      4)稳定性(Stability)。需要避免在应用程序运行时资源耗尽。

      5)公平性(Fairness)。解决方案必须对其他试图获取资源的资源使用者公平。

 

2.解决方案

      在实际使用之前先获取资源。在使用资源之前(最好是在启动时),资源提供者代理已经从资源提供者那里预先获取了资源。然后,资源就被保存在高效的容器中。当资源提供者代理截获来自资源使用者的获取资源请求时,就可以访问容量并返回请求的资源。

      获取资源的时间可以用不同的策略来配置。这些策略应该考虑到不同的因素,比如何时会实际使用资源、资源的数目、资源的依赖性,以及获取资源会花多长时间。可能的选择有在系统启动时获取,或者在系统启动完之后一个特定的可能是计算好的时间来获取。不管使用何种策略,目标都是确保在实际使用资源之前获取资源并且资源可用。

 

3.结构

      资源使用者获取并使用资源。

      资源是一个内存或线程之类的实体。

      提供者代理截获用户对资源的获取请求,并立刻把一开始就获取好的资源交给资源使用者。

      资源提供者管理并提供多种资源。 

       

 

       

 

4.实现

1)选择需要预先获取的资源。决定需要预先获取的资源的类型,以便确保整个系统的行为的可预测性。判定那些昂贵的资源,比如连接、内存和线程。获取这样的资源最可能带来不可预测性,所以它们是理想的预先获取候选才。

2)估计资源用量。估计用户在生命周期中会获取多少资源。如果事前并不知道,那么进行试运行以衡量最大的资源用量。如果你无法预测资源用量,那么将其变为一个可配置的参数,从而可以在部署之后简单地调整。为操作者提供关于预先获取的资源的实际使用情况的信息,比如日志之类。

3)实现提供者代理。提供者代理负责透明地集成Eager Acquisition模式。在实际的设计中,可以有几种方式来包含它,比如使用Virtual Proxy模式或者Interceptor(截取器)模式。资源使用者可以从Abstract Factory获取提供者代理。如果不需要透明性,那么资源使用者可以直接从资源提供者获取资源,在这种情况下不需要提供者代理。

4)实现容器。实现一个容器,比如哈希表,用于存放预先获取的资源。容量应当支持可预测的查找,比如哈希表可以提供常数时间的复杂度查找。

5)决定时间策略。就提供者代理何时预先获取资源选定策略:

     ·在系统启动时。实现一个钩子,使得预先获取资源的代码在启动时就被执行。这样做的好处是不会影响系统的运行时行为,但是这要求可以预测资源的使用。

     ·在运行时抢先获取。用Reflection(映像)模式来检测可能会导致资源使用者在未来需要获取资源的系统状态。抢先行为的好处是可以更贴切地处理获取资源的需求。但是,抢先获取行为的代价是更高的复杂性以及持续监控系统状态的执行开销。

6)决定初始化语义。决定如何初始化获取的资源,以避免额外的初始化开销。对于某些资源,让资源提供者来在获得时执行完全的初始化是不可能的。在这样的情况下,需要考虑运行时的初始化开销。

 

5.结论

优点:

1)可预测性(Predictability)。资源的可获得性是可预测的,因为来自用户的获取资源请求会被截获并即时处理。这就避免了操作系统造成的获取资源时不确定的延时之类的问题。

2)性能(Performance)。因为资源在需要时已经可用,所以可以很快地用确定的时间来获取。

3)灵活性(Flexibility)。可以很容易地定制资源获取资格。截获用户的资源获取请求可以让提供者代理策略化地获取资源,这对于避免内存碎片化之类的副作用很有帮助。

4)透明性(Transparency)。因为资源是从资源提供者预先获取的,不需要使用者的干预,所以这一解决方案对使用者是透明的。

 

缺点:

1)管理职责(Management responsibility)。管理预先获取的资源成了一个重要方面,因为不是所有的资源都会立刻同资源使用者相关联,所以就需要管理。可以用Caching模式和Pooling模式来提供可能的管理方案。

2)静态配置(Static configuration)。系统变得更为静态化,因为必须预先估计需要的资源数目。必须避免过分预取资源,以保证资源的公平利用并避免资源枯竭。

3)过度获取(Over-acquisition)。子系统可能会预先获取太多的资源,而实际上用不了那么多。这可能会导致不必要的资源枯竭。但是,正确调整好的资源获取策略有助于解决这个问题。也可以用Pooling模式来限制预先获取的资源。

4)减慢系统启动(Slow system start-up)。如果系统启动时需要获取很多资源,预先获取就可能会给系统带来比较长的延迟。如果资源不是在系统启动时就获取,而是稍后获取,带是会有相应的开销。 

posted on 2012-10-11 08:53  汝熹  阅读(339)  评论(0编辑  收藏  举报