体系结构

Author Avatar
YZ 4月 06, 2018
  1. 软件开发过程:

    1
    问题定义—需求分析---体系结构设计—软件设计—软件编码—软件测试---维护升级

  2. 体系结构

    • 定义

      1
      2
      3
      4
      5
      6
      7
      8
      Booch&Rumbaugh & Jacobson定义:软件体系结构={组织,元素,子系统,风格}
      Bass定义:体系结构是一个或多个结构,包括构件、构件的外部可视属性和构件之间的关系
      Shaw定义:结构模型、框架模型、动态模型、过程模型
      Garlan&Shaw定义:体系结构={构件,连接件,约束}
      Perry&Wolf定义:体系结构={元素,形式,准则}
      Garlan&Perry定义:是一个程序/系统各构件的结构,相互关系以及进行设计的原则和指导方针
      Soni&Nord&Hofmeister定义:概念,模块互连,执行,代码
      Boehm模型:{构件,连接件,约束,不同人员的需求,准则}
    • 发展阶段

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      “无体系结构”设计阶段 1946ENIAC计算机问世-ALGOL68诞生前,汇编语言为主,软件应用以军用和科学计算为主;软件规模小,很少明确考虑体系结构;

      萌芽阶段:1970-1980 提出结构化编程的思想,软件工程的思想被广泛应用;出现一批结构化程序设计语言;体系结构成为系统开发中的一个明确概念;
      优:走向商用、民用;规模达到数(十)万行;软件开发成为一种职业,程序员;
      困境:软硬件之间的鸿沟,软件质量的下降,大量的重复劳动;

      初级阶段:80年代初-90年代初,面向对象技术,语言;软件以对象作为基本元素,系统由离散的对象构成;统一建模语言UML提出;
      优:易于表述概念,易于相互交流;作为描述、分析和建立文档的手段,提高软件的易读性、可维护性和可重用性;继承封装多态性;
      困境:基于对象的重用属于代码重用,需要对类的内部设计、实现有清晰的认识;软件的升级、维护等需要重新编译、调试,无法实现动态升级;难以实现设计重用,缺乏描述体系结构的语言。

      高级阶段:90年代初-现在,软件开发强调构件化技术和体系结构技术;EJB、WebService的提出;软件=构件+基于体系结构的构件组装;作为开发文档和中间产品出现在软件开发过程中;
      优:构件实现了可执行二进制代码的重用;构件的实现与实现语言无关;构件可以单独开发、编译、调试;基于构件的软件系统可以实现动态升级和维护;体系结构提供了设计重用的可能性;
    • 意义

      1
      2
      3
      4
      有利于系统分析:借助体系结构,使问题进一步抽象;是软件系统相关各方交流的平台;
      有利于软件开发:体系结构是系统实现的基本约束,决定了开发和维护项目的组织结构,有利于软件质量的控制;
      有利于软件复用:构件复用,软件子系统复用,设计复用
      有利于软件系统的演化:局部的,非局部的,体系结构级的。

  3. 构件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    定义:构件是具有一定功能、可明确辨识的数据单位或计算单元;(语义完整,语法正确,可重用,封装性,独立性)
    常见构件:模块、对象、过滤器、过程、数据文件、数据库、文档

    构件开发:1.从现有构件库中获取符合要求的构件,直接使用或经过简单修改,得到可重用的构件;
    2.通过遗产工程,将具有潜在重用价值的构件提取出来;
    3.从市场购买现成的商品软件或者第三方厂商开发的中间件;
    4.基于COM,CORBA,WebService等技术规范,自行开发所需的构件。

    信息管理例子:
    1. 利用现有设计方案,重新编码测试;
    2. 将现有的编码方案中三家银行共同的部分抽象成父类,分别定义子类;利用继承实现信息共享;
    3. 在有区别的地方,如名称等地方加入宏定义。

    Alt text

  4. 设计模式

    1
    2
    3
    4
    5
    四个基本要素:
    模式名称:用一两个词来描述模式的问题、解决方案和效果;
    问题:描述了应该在何时使用模式;
    解决方案:描述了设计的组成部分,相互关系和各自的职责和协作方式;
    效果:描述了模式应用的效果及使用模式应该权衡的问题
    1
    2
    3
    4
    5
    6
    7
    8
    访问者模式:
    使用场景:1.定义对象结构的类很少改变,但经常需要在此结构上定义新的操作;2.对象需要添加很多不同的并且不相关的操作。
    //1.对同一集合对象的操作并不是唯一的,对相同的元素对象可能存在多种不同的操作方式;2.操作方式不稳定,可能还需要增加新的操作,以满足业务需求。

    参与者:抽象访问者,具体访问者,抽象元素,具体元素,对象结构

    优点:1.增加新操作意味着增加一个新的访问者类,容易;无需修改原系统,良好的可扩展性;2.将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中;3.可以跨越几个类的等级结构访问属于不同的等级结构的成员类;
    缺点:1.破坏封装,访问者访问并调用每一个节点对象的操作意味着:节点对象暴露一些自己的操作和内部状态;访问者对象会积累访问操作所需的状态,使这些状态不再存储在节点对象中,也是破坏封装的;2.增加新的节点类变得困难,每增加一个新的节点都意味着在抽象访问者中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作。
  5. 变量存活分析

    1
    2
    3
    c的存活分析
    正向分析&逆向分析
    变量存活分析和访问者模式的关系
  6. 视图

    avatar

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    4+1模型:
    逻辑视图:强调系统的功能性需求;使用类、对象来表示,从问题域出发,采取面向对象分析方法,按照面向对象原则,获得代表问题抽象的对象和类;//最终用户,功能
    进程视图:关注系统的非功能性需求,如性能,可用性。强调系统的并发性、分布性、容错,以及逻辑视图的类如何对应到进程;//集成者,性能,可扩展;面向系统内部
    开发视图:强调开发环境下,如何将软件划分为不同模块或子系统,以便分配给程序员或团队开发;通常以层次方式组织。分割、编组、可视化;//开发者,软件管理
    物理视图:如何将软件映射到不同的物理硬件上;//系统工程师,拓扑,通信
    场景视图:将前4个视图串联,场景是发现软件体系结构元素的驱动者,是体系结构设计结束后验证和演示的最好角色;【构件用实线表示】

    逻辑结构的四种架构:
    逻辑架构:层,子系统、类、接口、协作关系
    开发架构:程序包(含SDK和框架)、文件组织结构、编译依赖关系、目标单元
    运行架构:进程、线程、主动类、通信方式
    物理架构:安装单元、节点、网络、基础设施选型

    开发架构/物理架构 —> 动态分布 磁盘上的关系
    逻辑架构/运行架构 —> 软件内部定义的各个组件

    avatar

  7. 符号执行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    第一种架构:
    记录状态,每个状态记录执行过程中的一条程序路径;
    状态的内容:PC计数器,符号(符号变量),具体变量和具体值,约束

    第二种架构:
    不记录状态,符号执行与具体执行同时进行;每次先具体执行一条路径,再由符号执行求解出另外路径的输入,来执行另外一条路径...知道所有路径都被执行到为止。
    stack:0值改成1表示它的truefalse分支都执行过了,约束和栈一一对应的,多少约束条件就对应栈里的多少个数字

    内存管理:
    具体值可以放在寄存器或内存;符号只能放在内存;PC指向指令

  8. 机器学习框架

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #会话(Session)
    with tf.Session() as sess:
    result = sess.run([product])
    print result
    #设备(device)
    with tf.Session() as sess:
    # 指定在第二个gpu上运行
    with tf.device("/gpu:1"):
    matrix1 = tf.constant([[3.,3.]])
    matrix2 = tf.constant([[2.],[2.]])
    product = tf.matmul(matrix1,matrix2)

    Tensorflow架构带来的高性能:
    py执行构建数据流时神经网络不执行,不需要很大的数据量,所以构建数据流基本以本地的一台机器完成即可;开session运行时,想办法将其分布在复杂的网络机器上;
    设计架构上:先定义数据流图,1.对于用户来说,清晰定义神经网络;2.后台实施角度来说,可以根据定义好的部分分配资源。

    整体架构:
    设备层 通信层:实现TF设备异构:CPU、GPU、Mobile
    数据操作层:以Tensor为处理对象,进行操作计算
    图计算层:本地计算流图和分布式计算流图
    API层:对TF功能模块的接口封装
    应用层