体系结构风格有9大类:
1. 数据流系统,包括顺序批处理、管道和过滤器;2. 调用-返回系统,包括主程序和子程序、面向对象系统、层次结构;3. 独立部件,包括通信进程、事件隐式调用;4. 虚拟机,包括解释器、规则基系统;5. 以数据为中心的系统(库),包括数据库、超文本系统、黑板系统;6. 特殊领域风格;例如过程控制、模拟器;7. 特殊结构的风格,例如分布式处理、状态转移系统;8. 不同风格合成建立的异构结构;9. 最初始、最基本的主程序/子程序。
自1964年G. Amdahl首次提出体系结构这个概念,人们对计算机系统开始有了统一而清晰的认识,为从此以后计算机系统的设计与开发奠定了良好的基础。近四十年来, 体系结构学科得到了长足的发展, 其内涵和外延得到了极大的丰富。特别是网络计算技术的发展,使得网络计算体系结构成为当今一种主要的计算模式结构。微电子技术的飞速发展使芯片级体系结构研究成为一个挑战性课题。体系结构与系统软件,应用软件,程序设计语言的紧密结合与相互作用也使今天的计算机与以往有很大的不同,并触发了大量的前沿技术、相关产品开发与基础研究课题。
出现原由
在传统的程序设计领域中,人们使用流程图来表达系统的基本功能和实现的具体逻辑,但是,流程图实际上仅仅是源程序的图形化表示,无法给系统的分析和开发者提供更多的信息,所以没有在实际的系统开发过程中得到广泛的应用。随着软件系统的规模和复杂性的增加,对软件系统的整体结构(数据和控制的逻辑)进行分析和描述成为大型系统开发的一个不可缺少的重要部分,显然,使用流程图是无法达到这个目标的,我们必须使用新的方法和概念来对系统的整体结构进行把握。
系统分析
系统分析实际上包括两个阶段的工作,首先是需求的分析,也就是说,划分出系统和环境之间的界面,将所研究(或者是将要开发)的系统和周围的环境分离,这就是从使用者的观点,将整个系统作为一个整体来考察。其次是系统的设计,根据系统的整体功能和数据,参考实际的物理系统或者类似的系统,设计实际运行的软件系统,这一步骤实际上就是体系结构的分析和确定。 从系统工程的观点看来,任何复杂的系统都是由相对简单的,在当前所分析的系统层次是原始的基本元素(虽然在更进一步的分析中,这些元素可能具有非常复杂的内部结构)组成的,这些基本元素之间存在复杂的相互作用。所以,软件系统的分析和设计的基本任务是:确立系统中的基本元素(完成系统的功能所必不可少的成分);确定这些元素之间相互作用的方式(这就是系统的体系结构)。
基本的体系结构范式
管道和过滤器
每个组件具有输入和输出的集合,从流中读出数据作为输入,产生输出数据的流。整个系统可以看成多个过滤器复合形成的数据处理组件。
过滤器A
过滤器B
过滤器C
过滤器A
过滤器D
管道
特点:
l 过滤器之间是相互独立的(不能共享状态),其中一个过滤器的操作和行为不能影响另外过滤器的操作和行为,流的传送没有副作用。
l 过滤器对所输入流的来源和输出流的去向不关心,不需要知道流的来源和流的去向,来源和去向对于过滤器的数据处理没有任何影响。
l 过滤和流的传送可以是并发的,可以同时有多个流的传送存在于系统之中。
实例:
一个最著名的实例是unix的shell编程,多个对数据进行处理的程序(组件)通过管道联结起来,产生总和的效果;还有传统的编译器,源代码经过词法分析、语法分析、中间代码生成、目标代码生成等步骤生成输出的目标代码。
优点:
l 整个系统的功能是多个过滤器作用的总和,这样可以简化系统的分析和设计,可以经过需求的分析之后将整个系统作为一个过滤器处理,然后再逐步的细化成为多个相互连接的过滤器。
l 支持组件的重用,同一个过滤器可以多次出现在系统的不同位置。
l 易于维护和增强,过滤器可以被替换,可以增加新的过滤器到系统中而不改变原有的过滤器,不改变原来系统的基本功能。
l 本质上的并发性支持,这种体系结构由于本质上是与各个独立的过滤器的状态无关的,与并行的流的通过次序也是无关的,所以并发是一个基本的体系结构自然具有的特性。
缺点:
l 由于过滤器之间本质上是独立的,所以设计者必须独立考虑每一个过滤器的输入、处理和输出的过程,对于过滤器逻辑上的共同点和相互关系无法在设计中加以体现。
l 由于这种体系的批处理特性,所以不适合开发和用户交互的应用程序。
l 系统的多个处理流之间的共同特性无法提取、多个过滤器之间的共同特性也无法提取,所以增加了设计的复杂性。
数据抽象和面向对象的体系
在这种体系中,数据和数据上的操作被封装成抽象数据类型或者对象。系统由大量的对象组成,在物理上,对象之间通过函数或者过程调用相互作用;在逻辑上,对象之间通过集成、复合等方式实现设计的复用。
对象D
对象B
对象A
对象E
对象C
对象调用
对象调用
对象调用
类A
类B
类C
类G
对象A
对象E
类F
复合
继承
物理结构 逻辑结构
特点:
面向对象系统分析和设计的资料已经太多,这里就不再详细说明了。
优点:
由于封装,实现了灵活性和扩充性,隐藏了实现的细节,提高代码的质量;
使用继承和多态、提高了软件的可重用性。
缺点:
最主要的缺点是,由于对象之间的交互是通过明确的对象函数调用进行的,所以当一个对象需要实现一个特定功能的时候,必须知道哪一个对象提供这种服务,这就降低了系统的灵活性。管道和过滤器模型不需要明确指明数据的来源和去向。
在实际开发过程中,简单的判断某一个具体的应用应该采取何种体系结构是非常困难的。从目前的趋势来看:简单的管道、过滤器体系已经非常少见,面向对象的思想已经融合在几乎所有的体系结构之中,而层次化的思想同样也被广泛使用,所以,一个基本的系统分析方法应该是功能和复杂性的分解,也就是说,从横向分解(分模块、子系统),纵向分解中得到系统的基本组件(分类、分层次的功能和对象)。然后根据问题领域的特性选择系统的行为模式(具体的体系结构)。