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)。如果系统启动时需要获取很多资源,预先获取就可能会给系统带来比较长的延迟。如果资源不是在系统启动时就获取,而是稍后获取,带是会有相应的开销。

转载于:https://www.cnblogs.com/pennant/archive/2012/10/11/2717732.html

《面向模式的软件体系结构3-资源管理模式》读书笔记(3)--- Eager Acquisition模式...相关推荐

  1. 面向模式的软件体系结构

    面向模式的软件体系结构,卷2,详细介绍并发网络服务器 C 语言常见问题集 转载于:https://www.cnblogs.com/unixshell/p/3825490.html

  2. 面向模式的软件体系结构(卷1-5

    面向模式的软件体系结构(卷1-5 [一日养生24法].宋爱莉.插图版.pdf: http://www.t00y.com/file/60331740 [一桶金]--颠覆传统赚钱方式的系统创富法则.艾莫. ...

  3. 《软件建模与设计: UML、用例、模式和软件体系结构》一一2.10 UML扩展机制

    本节书摘来自华章计算机<软件建模与设计: UML.用例.模式和软件体系结构>一书中的第2章,第2.10节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区"华章 ...

  4. 《软件建模与设计: UML、用例、模式和软件体系结构》一一

    本节书摘来自华章计算机<软件建模与设计: UML.用例.模式和软件体系结构>一书中的第3章,第3.5节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区"华章计 ...

  5. 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.1 软件生存周期模型...

    本节书摘来自华章计算机<软件建模与设计: UML.用例.模式和软件体系结构>一书中的第3章,第3.1节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区"华章计 ...

  6. 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.2 设计验证和确认...

    本节书摘来自华章计算机<软件建模与设计: UML.用例.模式和软件体系结构>一书中的第3章,第3.2节,作者:(美)Hassan Gomaa,更多章节内容可以访问云栖社区"华章计 ...

  7. 《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者

    <Head First设计模式> 读书笔记16 其余的模式(二) 蝇量 解释器 中介者 蝇量(Flyweight Pattern) 如想让某个类的一个实例能用来提供许多"虚拟实例 ...

  8. 《需求工程-软件建模与分析之读书笔记之三》

    <需求工程-软件建模与分析之读书笔记之三> 第14章<面向对象建模>采用了面向对象方法学的世界观,将系统看作是一系列对象的集合,每个对象具有独立的职责,完成独立的任务,对象之间 ...

  9. 《软件测试方法和技术》 读书笔记

    <软件测试方法和技术> 读书笔记 2014-07-17 第一章 引论   1.3 什么是软件测试   1.4 软件测试与软件开发的关系 第二章 软件测试基本概念   2.1 软件缺陷   ...

最新文章

  1. Spinnaker部署
  2. C++ Bayes‘ theorem贝叶斯定理的实现算法(附完整源码)
  3. Java 垃圾回收算法之G1
  4. 合理抽象灵活运用排列组合(洛谷P2181题题解,Java语言描述)
  5. 软件测试基础知识(三)
  6. 相机标定(1)内\外参矩阵和畸变矩阵
  7. connect mysql (4),mysql用法4
  8. springboot----热部署
  9. Python 基础 - Day 2 Learning Note - 字符转编码操作
  10. 开源新手必看7个小技巧
  11. SQL Server中删除重复数据的几个方法
  12. autojs多分辨率找透明图
  13. CVTE实习求职经历
  14. 华为p20支持手机云闪付吗_华为哪些手机支持云闪付
  15. Pycharm补丁包使用教程
  16. MVC 各种传值方式 ASP.NET MVC view与controller传值方式
  17. 运维工程师如何规划职业发展!
  18. 关于激活Windows10专业版2018长期服务版(神坑的小白一键重装系统)
  19. 山东省第八届acm大赛 F题 (SDUT 3898)
  20. 量子计算笔记|可能会涉及一点点高量的量子力学基础(一)

热门文章

  1. 20210314:力扣第 232 场周赛
  2. java eventbus 原理_事件总线,事件驱动(RxJava,EventBus)与广播(BroadcastReceiver)(2)
  3. mysql join 条件_MySQL Join 竟然可以这么玩?根据条件 进行复制
  4. weblogic集群部署与负载均衡_集群,负载均衡,分布式的讲解和多台服务器代码同步...
  5. 布袋除尘器过滤风速多少_布袋除尘器过滤风速的确定及启动与停机的讲解
  6. weui.picker 乱码处理
  7. 初恋为何成为最美的爱情(下)
  8. 任何时候都不要轻易满仓
  9. 视频直接变漫画!GAN又有了新玩法 | Demo+代码+论文
  10. AI电子宠物Vector,会跑会动会聊天,一天内火遍美国科技圈