软件架构的数据流总结(一)

原创 2015年07月07日 15:14:21


1. Model-View-Controller(MVC框架)

This architecture is used in simpleGUI applications,不管是MFC,还是Matlab,亦或是android,基本上关于界面的开发,都是基于这种软件框架。看来还有web应用程序亦是如此。事件驱动模型。

MVC组件创建的步骤:1) 构建模型(model),然后通过引用包含到组件当中;2)创建view,传入模型的引用;3)作为change listener,view与model进行注册;4) view创建controller作为自己一个引用,并将引用传递至model。

Mostoften you don't need to build such an architecture from scratch. Thearchitectures usually come with visual programming environments (like VisualC++, JBuilder, etc. etc.)

2. Presentation-Abstraction-Control (PAC框架)


几乎大部分现代的复合GUI设计都是基于此软件架构(loosely)。它是MVC组件框架的进一步发展,MVC只能限制在简单的GUI设计:一个或者多个views在一个相同的模型上。而PAC可以通过继承、hierarchical structure来实现复合的GUI设计。我想MFC的设计大致类似此架构。

实际上,我们并不需要真的按照这种架构去从头开始设计,而是大部分的GUI设计都已经提供了这种框架,而理解这种框架对于GUI开发是有益处的。


3. Pipe and Filter(管道过滤器)

//实际上这个已经总结过了。

在体系架构中,Pipe and Filter(管道过滤器架构),如下图所示,所有的Filter并行执行,Pump 或者Producer是data sources,可以是静态的文本文件,也可以是任何输入(比如键盘、网络数据等等); Sink 或者 Consumer是数据目标(data,target),可以是另一个文本文件,或者是数据库、计算机屏幕等。Pipe即是connector,在filter之间传递数据,应当具有data buffer(数据缓存)的作用,以匹配适应filter的处理速度;而Filter则是一个个处理单元,它接收来自pipe的数据,并进行处理(filter or transform),Filter可以有N多个input Pipes,也可以由N多个output Pipes。


典型的应用案例:

Unix编程:一个程序的输出linked to(connected)另一个程序的输入;

DSP6678:一种数据流(data stream)的架构,每个core(内核)可以作为一个Filter,而共享内存等可以作为Pipes。这是DSP多核编程的一种常用架构。

编译器:连贯的过滤器进行词汇分析、语法分析、语义分析和代码生成等。



基于这样的架构(software architecture),所有的filter都可以在不同的线程(thread)、coroutines或者不同的机器上执行,可以是软件上或者是硬件上(FPGA)实现。

缺点:

1). 很明显,当Filter在等待它接收到所有的data并开始执行前,Pipe的有可能databuffer 溢出或者发生死锁。

2).管道的数据类型可能会使得过滤器需要进行解析,这将slow down processing speed。如果构建了不同数据类型的管道,则该管道将不能链接到任何的过滤器上。

4. layered system(分层系统)


分层思想是操作系统软件一个非常重要的哲学思想。分层一般是人们解决复杂问题的一种手段。每一层都向上层提供透明的服务,所谓“透明”就是指屏蔽具体的细节,只需按照提供的接口规范进行操作就可以。“层”就是抽象出来的概念,比如操作系统就是通过抽象屏蔽硬件上的差异和繁杂,使得用户在上层使用计算机。


另一个典型的应用就是OSI与TCP/IP分层结构。如下图。分层思想常用于operating systems 和 communication protocol上。


当系统出现不同的功能级别时,底层的操作比较繁杂,因此你希望通过一次彻底的分层抽象一劳永逸地把层次建好,再次开发时仍然可以使用,因此只需从底层开发一次,把分层结构建好,就可以sort the rest out。其实我比较喜欢的就是关于驱动开发,其哲学思考就在此,一次开发完毕,就可以摆脱底层的开发,从而可以站在高层进行开发,一劳永逸。

另外,分层思想的不断抽象让我联想到了神经网络(特别是deep learning),也是在不断地抽象,比如从底层的像素pixels,到edge抽象,再到object parts(combination of edges),再到高级的object models,不也是一层层的进行特征抽象转换吗?能够把握住哲学思想,总会有惊奇的发现。

存在的问题也很明显,灵活性是不是受到影响?层与层之间的接口必须固定,这就造成了在灵活性上的一定限制。但是,好处还是远远大于坏处的。我就非常赞赏这个分层思想。有时候固定可能比灵活性更好。

5. Microkernel(微内核架构)


是操作系统的一个基,来适应操作系统的剧烈变化。这种架构实际上是分层系统的一个特例。包含两个adapters,较低的层Microkernel用来屏蔽硬件特别的模块,较高的层叫做适配器(Adapter)用来屏蔽系统特别的模块。Microkernel包含操作系统所需的绝对最小功能,它是平台依赖的,基于Internal Server来实现。而Adapter则用来实现可移植,当改变External Server时,都不用改变之上的应用程序。

6. Client-Server / N-Tier Systems


N-Tier 体系架构实际上是C/S +分层体系的联合。C/S架构包括2-Tiers,客户端发起通讯,服务器提供服务。以三层的架构为例,first tier,即presentation tier,the client或者front-end(web前端),负责处理与用户的交互。通常的client由一些动态的HTML pages构成,用户可以通过webbrowser进行访问。Second or application tier,即server或者back-end,或middleware(中间件),处理client传来的用户请求,它虽然可以处理所有功能,但并不存储persistent data(长存数据),一般需要连接database服务器。也就是third tier,database tier,包含了数据库管理系统来管理长存数据。在第二层或第三层,由于scalability(可伸缩性),load-balancing和redundancy(冗余性)等原因,可能有多个应用实例(instances),就是说,增加了额外的设备来做同样的事情。虽然使得服务器更加强大,但有可能引入同步问题。

典型应用:web-applications。一般开发都是基于现有模型,要么开发前端应用,要么开发后端代码,嵌入到框架下就可以了。Client与client之间不是直接交互,而是通过中间人或者server转发等,通讯一般是via a network。

7. Repository(典型的database存储架构)

Compiler Use a repository.

Databased are repositories. 尽管数据库的所有客户端都在同时请求,database需要实现锁机制来保证repository的完整性。会有同步问题,当一些Knowledge Sources并行访问时需要特别的小心。

下续

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/lg1259156776/。

相关文章推荐

软件架构的数据流总结(二)

8. Blackboard(有点像老师叫学生上黑板写东西,而不是学生随意上黑板写) Blackboard是Knowledge Sources的通用数据结构,能够代表问题空间的所有状态,当需要分...

ARM学习之图解ARM

arm developer’s guide图:嵌入式arm的基本架构 图:应用软件运行在arm硬件上的抽象图 图:arm memory remap 图: arm内容数据流模型 图:arm...

软件架构风格整理(1 数据流风格)

1         数据流风格1.1      批处理序列批处理风格的每一步处理都是独立的.并且每一步是顺序执行的.只有当前一步处理完后.后一步处理才能开始.数据传送在步...

数据流分析(一)

引子编译器后端会对前端生成的中间代码做很多优化,也就是在保证程序语义不变的前提下,提高程序执行的效率或减少代码size等优化目标。优化需要依靠代码分析给出的“指导信息”来相应地改进代码,而代码分析中最...

【算法集中营】计算两个日期之间的天数

/历法规定,四年一闰,四百年闰,例如2000年是闰年,2100年不闰年, //公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的就是平年 //计算两个日期之间的天数(C++)  ...

【Python开发】C和Python之间的接口实现

作者:Jerry Jho 链接:https://www.zhihu.com/question/23003213/answer/56121859 ## 更新:关于ctypes,见拙作 聊聊P...

Linux进程间的通信,信号量的使用,生产者消费者

这是简单的生产者消费者问题,只有一个缓冲区 #include #include #include #include struct sembuf buf; int Psem(int sem_i...

【计算机视觉】【图像处理】【VS开发】【Qt开发】opencv之深拷贝及浅拷贝,IplImage装换为Mat

原文:opencv之深拷贝及浅拷贝,IplImage装换为Mat  一、(1) 浅拷贝: Mat B; B = image // 第一种方式 Mat C(image); // 第二...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)