软件体系结构风格的C2风格的实现例子,说明其实现过程和方法~~~
C2风格 UDP 的局域网聊天程序C++版首先要说明的是:这个程序分Server和Client两部分,但是和网上流行的Server与Client聊天不同,它是实现的Client与Client 聊天,Server 仅仅提供消息转发功能,因此执行程序时,首先必须有两台以上的电脑来执行,必须保证两个Client(Client程序是相同的,因此只要复制两个Client就行)在不同的局域网上的电脑,局域网中只要有一个Server就行,通过输入IP以及确认码(其实就是端口号,要保证两个Client的端口号相同,且两个Client的IP地址不同,即不在同一电脑上),就能实现一个Client和另一个Client聊天(当然Server必须运行,且必须按提示输入信息),本程序基于UDP协议,并且利用多线程编程实现了程序的背景音乐(系统的Beep声音必须打开才能听见)以及正常退出功能(点右上角的“差”是非正常退出!),当初设计的时候使得两个Client端口号必须相同,今后会设计出两个Client端口号不同,这样就能在一台机子上执行程序了
编译器采用什么软件体系结构风格
软件架构:整个软件系统的各个模块之间的结构设计,是软件工程范畴的概念,就象设计一栋房子由几个什么样的板块组成一样。
软件体系结构:是软件编程风格范畴的一个通俗概念,比如说用C++、PoworBuild、Delphi等来进行软件设计是面向对象的编程语言体系结构,而Basic、C、Foxbase的软件体系结构特点是面向任务流程的(不是面向对象的编程语言)。
软件体系结构的设计是什么呢?
整个软件开发过程中关键的一步。
对于当今世界上庞大而复杂的系统来说,没有一个合适的体系结构而要有一个成功的软件设计几乎是不可想象的。
不同类型的系统需要不同的体系结构,甚至一个系统的不同子系统也需要不同的体系结构。
体系结构的选择往往会成为一个系统设计成败的关键。
典型的软件体系结构风格有很多。
例如,设计图形用户界面(GUI)常用的事件驱动风格、设计操作系统常用的层次化设计风格、设计编译程序常用的管道与过滤器风格、设计分布式应用程序常用的客户机/服务器风格等。
一个实用的软件系统通常是几种典型体系结构风格的组合[1]。
近年来,我们致力于软件体系结构理论和实践应用研究,取得了一些初步成绩。
在第2节中,我们将给出
软件体系结构的发展历史
与最初的大型中央主机相适应,最初的软件结构体系也是Mainframe结构,该结构下客户、数据和程序被集中在主机上,通常只有少量的GUI界面,对远程数据库的访问比较困难。
随着PC的广泛应用,该结构逐渐在应用中被淘汰。
在80年代中期出现了Client/Server分布式计算结构,应用程序的处理在客户(PC机)和服务器(Mainframe或Server)之间分担;请求通常被关系型数据库处理,PC机在接受到被处理的数据后实现显示和业务逻辑;系统支持模块化开发,通常有GUI界面。
Client/Server结构因为其灵活性得到了极其广泛的应用。
但对于大型软件系统而言,这种结构在系统的部署和扩展性方面还是存在着不足。
Internet的发展给传统应用软件的开发带来了深刻的影响。
基于Internet和Web的软件和应用系统无疑需要更为开放和灵活的体系结构。
随着越来越多的商业系统被搬上Internet,一种新的、更具生命力的体系结构被广泛采用,这就是为我们所知的“三层/多层计算”。
。
客户层(client tier) 用户接口和用户请求的发出地,典型应用是网络浏览器和胖客户(如Java程序) 。
服务器层(server tier) 典型应用是Web服务器和运行业务代码的应用程序服务器 。
数据层(data tier) 典型应用是关系型数据库和其他后端(back-end)数据资源, 如 Oracle和SAP、 R/3等 三层体系结构中,客户(请求信息)、程序(处理请求)和数据(被操作)被物理地隔离。
三层结构是个更灵活的体系结构,它把显示逻辑从业务逻辑中分离出来,这就意味着业务代码是独立的,可以不关心怎样显示和在哪里显示。
业务逻辑层现在处于中间层,不需要关心由哪种类型的客户来显示数据,也可以与后端系统保持相对独立性,有利于系统扩展。
三层结构具有更好的移植性,可以跨不同类型的平台工作,允许用户请求在多个服务器间进行负载平衡。
三层结构中安全性也更易于实现,因为应用程序已经同客户隔离。
应用程序服务器是三层/多层体系结构的组成部分,应用程序服务器位于中间层。
如图所示,应用程序服务器运行于浏览器和数据资源之间,一个简单的实例是,顾客从浏览器中输入一个定单,web服务器将该请求发送给应用程序服务器,由应用程序服务器执行处理逻辑,并且获取或更新后端用户数据。
兴起 六十年代的软件危机使得人们开始重视软件工程的研究。
起初,人们把软件设计的重点放在数据结构和算法的选择上,随着软件系统规模越来越大、越来越复杂,整个系统的结构和规格说明显得越来越重要。
软件危机的程度日益加剧,现有的软件工程方法对此显得力不从心。
对于大规模的复杂软件系统来说,对总体的系统结构设计和规格说明比起对计算的算法和数据结构的选择已经变得明显重要得多。
在此种背景下,人们认识到软件体系结构的重要性,并认为对软件体系结构的系统、深入的研究将会成为提高软件生产率和解决软件维护问题的新的最有希望的途径。
自从软件系统首次被分成许多模块,模块之间有相互作用,组合起来有整体的属性,就具有了体系结构。
好的开发者常常会使用一些体系结构模式作为软件系统结构设计策略,但他们并没有规范地、明确地表达出来,这样就无法将他们的知识与别人交流。
软件体系结构是设计抽象的进一步发展,满足了更好地理解软件系统,更方便地开发更大、更复杂的软件系统的需要。
事实上,软件总是有体系结构的,不存在没有体系结构的软件。
体系结构(Architecture)一词在英文里就是建筑的意思。
把软件比作一座楼房,从整体上讲,是因为它有基础、主体和装饰,即操作系统之上的基础设施软件、实现计算逻辑的主体应用程序、方便使用的用户界面程序。
从细节上来看每一个程序也是有结构的。
早期的结构化程序就是以语句组成模块,模块的聚集和嵌套形成层层调用的程序结构,也就是体系结构。
结构化程序的程序(表达)结构和(计算的)逻辑结构的一致性及自顶向下开发方法自然而然地形成了体系结构。
由于结构化程序设计时代程序规模不大,通过强调结构化程序设计方法学,自顶向下、逐步求精,并注意模块的耦合性就可以得到相对良好的结构,所以,并未特别研究软件体系结构。
我们可以作个简单的比喻,结构化程序设计时代是以砖、瓦、灰、沙、石、预制梁、柱、屋面板盖平房和小楼,而面向对象时代以整面墙、整间房、一层楼梯的预制件盖高楼大厦。
构件怎样搭配才合理?体系结构怎样构造容易?重要构件有了更改后,如何保证整栋高楼不倒?每种应用领域需要什么构件(医院、工厂、旅馆)?有哪些实用、美观、强度、造价合理的构件骨架使建造出来的建筑(即体系结构)更能满足用户的需求?如同土木工程进入到现代建筑学一样,软件也从传统的软件工程进入到现代面向对象的软件工程,研究整个软件系统的体系结构,寻求建构最快、成本最低、质量最好的构造过程。
软件体系结构虽脱胎于软件工程,但其形成同时借鉴了计算机体系结构和网络体系结构中很多宝贵的思想和方法,最近几年软件体系结构研究已完全独立于软件工程的研究,成为计算机科学的一个最新的研究方向和独立学科分支。
软件体系结构...
p2p软件有?
P2P软件 P2P是peer-to-peer的缩写,peer在英语里有"(地位、能力等)同等者"、"同事"和"伙伴"等意义。
这样一来,P2P也就可以理解为"伙伴对伙伴"的意思,或称为对等联网。
目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。
这份英文文档里面简单对p2p技术进行了描述。
p2p技术目前面临的最大问题在于版权,国际网络音乐版权诉讼对我国(p2p)企业的启发里面提到了部份值得参考的观点。
纯粹p2p 这里对“纯粹”与否的判定,是我自己杜撰的,我认为,不需要中心服务器、每个点都是对等而且在网络中具有同样功能的这种产品,才能称之为纯粹,而类似napster和bt这样,或者需要种子,或者需要中央服务器,但采用了p2p技术的,仅能称之为“准p2p”。
gnutella 被认为是“令人称奇的软件产品“的Gnutella,自从开发面世以后,转眼间就迅速普及。
只要利用搜索功能,就可以在全世界gnutella对等网中与其它个体之间收发各种软件、文档等。
有大量的软件能够加入这一对等网,比如gnucleus: 你在gnutelliums还可以找到大量的同类软件,如phex等。
freenet 在Freenet的网站上有一句说明:Freenet is free software which lets you publish and obtain information on the Internet without fear of censorship.出于众所周知的原因,这里不对它进行细节描述了。
这里是它的logo。
准p2p napster Napster技术在1999年由仍在美国东北大学就读的Shawn Fanning开发成功,并迅速在众多MP3数字音乐爱好者中传播开来。
Napster提供了一个客户端软件供MP3音乐迷在自己的硬盘上共享歌曲文件,搜索其他用户共享的歌曲文件,并到其他也使用Napster服务的用户硬盘上去下载歌曲。
bt BT是一种类似与电驴的P2P共享软件,全名叫"BitTorrent",中文全称:"比特流"。
bt在这两年来成为互联网上的一个热腾腾的地盘,你可以到作者的网站看看对bt的介绍性文字。
BT的下载原理见下图: 它首先在上传叨税岩桓鑫募殖闪薢个部分,甲在服务器随机下载了第N各部分,乙在服务器随机下载了第M个部分,这样甲的BT就会根据情况到乙的电脑上去拿乙已经下载好的M部分,乙的BT就会根据情况去到甲的电脑上去拿甲已经下载好的N部分,这样就不但减轻了服务器端得负荷,也加快了用户方(甲乙)的下载速度,效率也提高了,更同样减少了地域之间的限制。
比如说丙要连到服务器去下载的话可能才几K,但是要是到甲和乙的电脑上去拿就快得多了。
所以说用的人越多,下载的人越多,大家也就越快,BT的优越性就在这里。
而且,在你下载的同时,你也在上传(别人从你的电脑上拿那个文件的某个部分),所以说在享受别人提供的下载的同时,你也在贡献。
同样,有大量客户端软件能够以bt的原理进行p2p的文件共享,比如azureus。
全球P2P软件导航百宝 酷狗 酷乐 电骡 BT eMule PP点点通 RealLink 比特精灵 Sougood Grokster Shareaza POCO KDT OP Ilink KAZAA DC++ ZCOM智通 百兆P2P BitComet Azureus skype Gnucleus 卡盟 贪婪BT 百花PP imesh eXeem WinMX
请问软件架构与软件体系结构有什么关系?
软件架构:整个软件系统的各个模块之间的结构设计,是软件工程范畴的概念,就象设计一栋房子由几个什么样的板块组成一样。
软件体系结构:是软件编程风格范畴的一个通俗概念,比如说用C++、PoworBuild、Delphi等来进行软件设计是面向对象的编程语言体系结构,而Basic、C、Foxbase的软件体系结构特点是面向任务流程的(不是面向对象的编程语言)。
...
软件体系结构的应用现状
形成研究热点,仍处于非形式化水平 自20世纪90年代后期以来,软件体系结构的研究成为一个热点。
广大软件工作者已经认识到软件体系结构研究的重大意义和它对软件系统设计开发的重要性,开展了很多研究和实践工作。
从软件体系结构研究的现状来看,当前的研究和对软件体系结构的描述,在很大程度上来说还停留在非形式化的基础上。
软件构架师仍然缺乏必要的工具,这种工具应该是显式描述的、有独立性的形式化工具。
在目前通用的软件开发方法中,其描述通常是用非形式化的图和文本,不能描述系统期望的存在于构件之间的接口,不能描述不同的组成系统的组合关系的意义。
难以被开发人员理解,更不能用来分析其一致性和完整性等特性。
当一个软件系统中的构件之间几乎以一种非形式化的方法描述时,系统的重用性也会受到影响,在设计一个系统结构过程中的努力很难移植到另一个系统中去。
对系统构件和连接关系的结构化假设没有得到显式的、形式化的描述时,把这样的系统构件移植到另一个系统中去将是有风险的,甚至是不可能的。
软件体系结构的形式化方法研究 软件体系结构研究如果仅仅停留在非形式化的框图阶段,已经难以适应进一步发展的需要。
为支持基于体系结构的开发,需要有形式化建模符号、体系结构说明的分析与开发工具。
从软件体系结构研究的现状来看,在这一领域近来已经有不少进展,其中比较有代表性的是美国卡耐基梅隆大学(Carnegie Mellon University)的Robert J.A11en于l997年提出的Wright系统。
Wright是-种结构描述语言,该语言基于一种形式化的、抽象的系统模型,为描述和分析软件体系结构和结构化方法提供了一种实用的工具。
Wright主要侧重于描述系统的软件构件和连接的结构、配置和方法。
它使用显式的、独立的连接模型来作为交互的方式,这使得该系统可以用逻辑谓词符号系统,而不依赖特定的系统实例来描述系统的抽象行为。
该系统还可以通过一组静态检查来判断系统结构规格说明的一致性和完整性。
从这些特性的分析来说,Wright系统的确适用于对大型系统的描述和分析。
软件体系结构的建模研究 研究软件体系结构的首要问题是如何表示软件体系结构,即如何对软件体系结构建模。
根据建模的侧重点的不同,可以将软件体系结构的模型分为5种:结构模型、框架模型、动态模型、过程模型和功能模型。
在这5个模型中,最常用的是结构模型和动态模型。
(1)结构模型 这是一个最直观、最普遍的建模方法。
这种方法以体系结构的构件、连接件和其他概念来刻画结构,并力图通过结构来反映系统的重要语义内容,包括系统的配置、约束、隐含的假设条件、风格、性质。
研究结构模型的核心是体系结构描述语言。
(2)框架模型 框架模型与结构模型类似,但它不太侧重描述结构的细节而更侧重于整体的结构。
框架模型主要以一些特殊的问题为目标建立只针对和适应该问题的结构。
(3)动态模型 动态模型是对结构或框架模型的补充,研究系统的大颗粒的行为性质。
例如,描述系统的重新配置或演化。
动态可能指系统总体结构的配置、建立或拆除通信通道或计算的过程。
这类系统常是激励型的。
(4)过程模型 过程模型研究构造系统的步骤和过程。
因而结构是遵循某些过程脚本的结果。
(5)功能模型 该模型认为体系结构是由一组功能构件按层次组成,下层向上层提供服务。
它可以看作是一种特殊的框架模型。
这5种模型各有所长,也许将5种模型有机地统一在一起,形成一个完整的模型来刻画软件体系结构更合适。
例如,Kruchten在1995年提出了一个4+1的视角模型。
4+1模型从5个不同的视角包括逻辑视角、过程视角、物理视角、开发视角和场景视角来描述软件体系结构。
每一个视角只关心系统的一个侧面,5个视角结合在一起才能够反映系统的软件体系结构的全部内容。
4+1模型如图1所示。
图1 4+1模型 发展基于体系结构的软件开发模型 软件开发模型是跨越整个软件生存周期的系统开发、运行、维护所实施的全部工作和任务的结构框架,给出了软件开发活动各阶段之间的关系。
目前,常见的软件开发模型大致可分为三种类型:(1)以软件需求完全确定为前提的瀑布模型。
(2)在软件开发初始阶段只能提供基本需求时采用的渐进式开发模型,如螺旋模型等。
(3)以形式化开发方法为基础的变换模型。
所有开发方法都是要解决需求与实现之间的差距。
但是,这三种类型的软件开发模型都存在这样或那样的缺陷,不能很好地支持基于软件体系结构的开发过程。
因此,研究人员在发展基于体系结构的软件开发模型方面做了一定的工作。
例如,为了形象地表示体系结构的生命周期,北京邮电大学的周莹新博士建立了一个软件体系结构的生命周期模型,该模型如图2所示。
图2 软件体系结构的生命周期模型 软件产品线体系结构的研究 软件体系结构的开发是大型软件系统开发的关键环节。
体系结构在软件生产线的开发中具有至关重要的作用,在这种开发生产中,基于同一个软件体系结构,可以创建具有不同功能的多个系统。
在软件产品族之间共享体系结构和一组可重用的构件,可以增加软件工程和降低开发和维护成本。
一个产品...
java虚拟机采用什么软件体系结构
JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。
当启动一个Java程序时,一个虚拟机实例也就诞生了。
当该程序关闭退出,这个虚拟机实例也就随之消亡。
如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。
每个Java程序都运行于它自己的Java虚拟机实例中。
Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。
而这个main()方法必须是共有的(public)、静态的(static)、返回值为void,并且接受一个字符串数组作为参数。
任何拥有这样一个main()方法的类都可以作为Java程序运行的起点。
在上面的例子中,Java程序初始类中的main()方法,将作为该程序初始线程的起点,任何其他的线程都是由这个初始线程启动的。
在Java虚拟机内部有两种线程:守护线程和非守护线程。
守护线程通常是由虚拟机自己使用的,比如执行垃圾收集任务的线程。
但是,Java程序也可以把它创建的任何线程标记为守护线程。
而Java程序中的初始线程——就是开始于main()的那个,是非守护线程。
只要还有任何非守护线程在运行,那么这个Java程序也在继续运行。
当该程序中所有的非守护线程都终止时,虚拟机实例将自动退出。
假若安全管理器允许,程序本身也能够通过调用Runtime类或者System类的exit()方法来退出。
JAVA虚拟机的体系结构 下图是JAVA虚拟机的结构图,每个Java虚拟机都有一个类装载子系统,根据给定的全限定名来装入类型(类或接口)。
同样,每个Java虚拟机都有一个执行引擎,负责执行那些包含在被装载类的方法中的指令。
当JAVA虚拟机运行一个程序时,需要内存来存储许多东西,例如:字节码、从已装载的class文件中得到的其他信息、程序创建的对象、传递给方法的参数,返回值、局部变量等等。
Java虚拟机把这些东西都组织到几个“运行时数据区”中,以便于管理。
某些运行时数据区是由程序中所有线程共享的,还有一些则只能由一个线程拥有。
每个Java虚拟机实例都有一个方法区以及一个堆,是由该虚拟机实例中所有的线程共享的。
当虚拟机装载一个class文件时,会从这个class文件包含的二进制数据中解析类型信息。
然后把这些类型信息放到方法区中。
当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。
当每一个新线程被创建时,都将得到它自己的PC寄存器(程序计数器)以及一个Java栈,如果线程正在执行的是一个Java方法(非本地方法),那么PC寄存器的值将总是指向下一条将被执行的指令,而Java栈则总是存储该线程中Java方法调用的状态——包括局部变量,被调用时传进来的参数、返回值,以及运算的中间结果等等。
而本地方法调用的状态,则是以某种依赖于具体实现的方法存储在本地方法栈中,也可能是在寄存器或者其他某些与特定实现相关的内存区中。
Java栈是由许多栈帧(stack frame)组成的,一个栈帧包含一个Java方法调用的状态。
当线程调用一个Java方法时,虚拟机压入一个新的栈帧到该线程的Java栈中,当该方法返回时,这个栈帧被从Java栈中弹出并抛弃。
Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。
这样设计的原因是为了保持Java虚拟机的指令集尽量紧凑、同时也便于Java虚拟机在那些只有很少通用寄存器的平台上实现。
另外,Java虚拟机这种基于栈的体系结构,也有助于运行时某些虚拟机实现的动态编译器和即时编译器的代码优化。
下图描绘了Java虚拟机为每一个线程创建的内存区,这些内存区域是私有的,任何线程都不能访问另一个线程的PC寄存器或者Java栈。
上图展示了一个虚拟机实例的快照,有三个线程正在执行。
线程1和线程2都正在执行Java方法,而线程3则正在执行一个本地方法。
Java栈都是向下生长的,而栈顶都显示在图的底部。
当前正在执行的方法的栈帧则以浅色表示,对于一个正在运行Java方法的线程而言,PC寄存器总是指向下一条将被执行的指令。
比如线程1和线程2都是以浅色显示的,由于线程3当前正在执行一个本地方法,因此,PC寄存器——以深色显示的那个,其值是不确定的。
数据类型 Java虚拟机是通过某些数据类型来执行计算的,数据类型可以分为两种:基本类型和引用类型,基本类型的变量持有原始值,而引用类型的变量持有引用值。
Java语言中的所有基本类型同样也都是Java虚拟机中的基本类型。
但是boolean有点特别,虽然Java虚拟机也把boolean看做基本类型,但是指令集对boolean只有很有限的支持,当编译器把Java源代码编译为字节码时,它会用int或者byte来表示boolean。
在Java虚拟机中,false是由整数零来表示的,所有非零整数都表示true,涉及boolean值的操作则会使用int。
另外,boolean数组是当做byte数组来访问的,但是在“堆”区,也可以被表示为位域。
Java虚拟机还有一个只在内部使用的基本类型:returnAddress,Java程序员不能使用这个类型,这个基本类型被用来实现Java程序中的finally子句。
该类型是jsr, ret以及jsr_w指令需要使用到的,值是JVM指令的操作码的指针。
returnAddress类型不是简单意义上的数值,...
转载请注明出处51数据库 » 软件体系结构p2p风格