层次结构
分层架构将整个系统视为层次结构,其中软件系统被分解为层次结构中不同级别的逻辑模块或子系统。这种方法通常用于设计系统软件,例如网络协议和操作系统。
在系统软件层次结构设计中,低层子系统向其相邻的上层子系统提供服务,上层子系统调用下层的方法。下层提供更具体的功能,例如I/O服务、事务、调度、安全服务等。中间层提供更多领域依赖的功能,例如业务逻辑和核心处理服务。并且,上层以用户界面的形式提供更多抽象功能,例如 GUI、shell 编程工具等。
它还用于在命名空间层次结构中组织类库,例如.NET 类库。所有的设计类型都可以实现这种分层架构,并且经常与其他架构风格相结合。
层次结构风格分为 -
- 主子程序
- 主从
- 虚拟机
主子程序
这种风格的目的是重用模块并自由开发单独的模块或子程序。在这种风格中,根据系统所需的功能,通过自上而下的细化将软件系统划分为子例程。
这些细化是垂直进行的,直到分解的模块足够简单以具有其专有的独立责任。功能可以被上层的多个调用者重用和共享。
有两种方式将数据作为参数传递给子例程,即 -
按值传递- 子例程仅使用过去的数据,但不能修改它。
按引用传递- 子例程使用并更改参数引用的数据的值。
优点
基于层次细化,易于分解系统。
可用于面向对象设计的子系统中。
缺点
由于它包含全球共享数据而容易受到攻击。
紧密耦合可能会导致更多的变化连锁反应。
主从
该方法应用“分而治之”原则并支持故障计算和计算精度。它是对主子程序架构的修改,提供系统的可靠性和容错能力。
在该架构中,从机向主机提供重复的服务,主机通过一定的选择策略在从机中选择特定的结果。从机可以通过不同的算法和方法或完全不同的功能来执行相同的功能任务。它包括并行计算,其中所有从站都可以并行执行。
主从模式的实现遵循五个步骤 -
指定如何将任务的计算划分为一组相等的子任务,并确定处理子任务所需的子服务。
指定如何借助处理各个子任务获得的结果来计算整个服务的最终结果。
为步骤 1 中标识的子服务定义一个接口。它将由从站实现,并由主站使用来委托处理各个子任务。
根据上一步中制定的规范实现从属组件。
根据步骤 1 至 3 中制定的规范实施主站。
应用领域
适用于软件可靠性至关重要的应用。
广泛应用于并行和分布式计算领域。
优点
更快的计算和轻松的可扩展性。
提供鲁棒性,因为从站可以复制。
Slave 可以以不同的方式实现,以尽量减少语义错误。
缺点
通信开销。
并不是所有的问题都可以分解。
难以实施和可移植性问题。
虚拟机架构
虚拟机架构假装了一些功能,这些功能对于实现它的硬件和/或软件来说并不是原生的。虚拟机构建在现有系统之上,并提供虚拟抽象、一组属性和操作。
在虚拟机架构中,主服务器使用从服务器的“相同”子服务,并执行诸如拆分工作、调用从服务器和组合结果等功能。它允许开发人员模拟和测试尚未构建的平台,并模拟“灾难”模式,这些模式对于真实系统的测试来说过于复杂、昂贵或危险。
在大多数情况下,虚拟机将编程语言或应用程序环境与执行平台分开。主要目标是提供可移植性。通过虚拟机对特定模块的解释可能被视为 -
解释引擎从正在解释的模块中选择一条指令。
引擎根据指令更新虚拟机的内部状态,并重复上述过程。
下图展示了单台物理机上标准VM基础架构的架构。
虚拟机管理程序也称为虚拟机监视器,在主机操作系统上运行,并向每个来宾操作系统分配匹配的资源。当来宾进行系统调用时,虚拟机管理程序会拦截并将其转换为主机操作系统支持的相应系统调用。虚拟机管理程序控制每个虚拟机对 CPU、内存、持久存储、I/O 设备和网络的访问。
应用领域
虚拟机架构适用于以下领域 -
如果没有直接的解决方案,适合通过模拟或翻译来解决问题。
示例应用程序包括微编程解释器、XML 处理、脚本命令语言执行、基于规则的系统执行、Smalltalk 和 Java 解释器类型编程语言。
虚拟机的常见示例是解释器、基于规则的系统、语法 shell 和命令语言处理器。
优点
便携性和机器平台独立性。
软件开发的简单性。
通过中断和查询程序的能力提供灵活性。
灾难工作模型的模拟。
在运行时引入修改。
缺点
由于解释器的性质,解释器的执行速度很慢。
由于执行中涉及额外的计算,因此会产生性能成本。
分层风格
在这种方法中,系统被分解为层次结构中的多个较高层和较低层,并且每个层在系统中都有其自己的唯一职责。
每层由一组相关的类组成,这些类封装在包中、部署的组件中或以方法库或头文件的形式封装为一组子例程。
每层向其上方的层提供服务,并充当下方层的客户端,即对第i+1层的请求通过第i层的接口调用由第i层提供的服务。如果任务完成,则可以返回第i+1层;否则,第 i 层将不断调用下面第 i -1 层的服务。
应用领域
分层风格适用于以下领域 -
涉及可以分层组织的不同服务类别的应用程序。
任何可以分解为特定于应用程序和特定于平台的部分的应用程序。
核心服务、关键服务、用户界面服务等之间有明确划分的应用程序。
优点
基于增量抽象级别的设计。
提供增强独立性,因为一层功能的更改最多会影响其他两层。
标准接口与其实现的分离。
通过使用基于组件的技术来实现,这使得系统更容易允许新组件的即插即用。
每层都可以是独立部署的抽象机,支持可移植性。
易于根据任务定义以自上而下的细化方式分解系统
同一层的不同实现(具有相同的接口)可以互换使用
缺点
许多应用程序或系统不容易以分层方式构建。
运行时性能较低,因为客户端的请求或对客户端的响应必须经过潜在的多个层。
每层的数据编组和缓冲开销也存在性能问题。
层间通信的开放可能会导致死锁,“桥接”可能会导致紧耦合。
异常和错误处理是分层架构中的一个问题,因为一层中的错误必须向上传播到所有调用层