没有合适的资源?快使用搜索试试~ 我知道了~
−−理论计算机科学电子笔记176(2007)5-23www.elsevier.com/locate/entcs一个形式化的分配的当前组件Andreas Rausch1FachbereichforurInformatikAGSoftwarerchitekturTechnischeUniversitaütKaiserlestern德国,D-67653 Kaiserkirstern摘要大多数大型软件系统都采用分布式组件来管理复杂性,并且必须处理并发执行的线程。系统分解和并发执行流程是正交的。一个强大到足以处理分布式并发组件,但又现实到足以为实际使用的组件技术提供基础的合理语义模型仍然缺乏。因此,本文介绍了这样一个分布式并发组件系统的操作语义。在此形式化模型的基础上,介绍了基于UML的建模技术。提供了建模、代码生成和系统执行关键词:软件体系结构,分布式系统,基于并发的软件,并发,操作语义,基于UML的描述技术,代码生成1介绍软件工程师面临着开发中的软件系统的复杂性不断增加。另一方面,我们在日常生活中越来越依赖这些软件系统。因此,软件工程师必须保证其可靠性。然而,软件系统的开发仍然包括高度的不确定性。70%以上的开发项目都不成功[1]。为了交付大规模的软件系统,例如企业应用程序,软件架构是一个关键的成功因素。它通常是分层的,此外,企业应用程序通常是交互式软件系统,必须同时为多个用户提供服务。因为这个原因,1电子邮件:rausch@informatik.uni-kl.de1571-0661 © 2007 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2006.02.0296A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)5软件系统是分布式系统,并且必须同时服务于多个用户请求。总之,这些软件系统必须处理分布式并发组件。为了实现具有分布式并发组件的软件系统,通常使用面向对象的编程语言,如Java 或 C++ 。 像 Java 这 样 的 编 程 语 言 为 并 发 程 序 提 供 了 基 本 结 构 , 比 如util.concurrent库。基于这些原语开发大规模分布式并发系统是容易出错的。需要更高层次的抽象。为了解决分布式和网络通信问题,CORBA、J2EE和.NET等组件技术得到了广泛的应用。这些技术基本上提供了一个组件模型和一个远程方法调用。 因此,它们将系统的结构从对象提升到组件,并将单个进程内的阻塞同步方法调用的概念提升到分布式环境。所提供的底层组件技术的组件模型用于软件体系结构所给出的分层组件结构及其分布。远程方法调用用于从分布和并发线程执行中抽象。因此,在系统执行期间,并发执行的线程事实上,在方法调用的情况下,线程不能从一个组件跳转到另一个远程组件。然而,所使用的组件技术通过阻塞调用组件中的调用线程来模拟这种行为,在远程组件中启动新线程以处理所请求的方法,并且最终在远程计算的结果可用之后重新激活被阻塞的调用线程。对于使用这些技术的程序员来说,它看起来像是从一个组件跳到另一个组件的单个线程。因此,分布式并发组件系统的主要编程模型是基于并行线程执行和分布式组件结构,这是正交的。实际上,在程序员开始编码之前,必须创建不同的规范工件来对开发中的系统进行建模。主要关注的是使用UML等描述语言描述系统的组件结构[2]。UML为静态和动态行为提供了图表。这些技术可以通过描述更精确的行为方面的元素来扩展,例如JML [3]和OCL [4]。当涉及到集成和细化模型的这些不同部分以实现并发控制流程和组件结构之间关系的清晰语义模型时, 失踪了各种方法已经被详细阐述来扩展UML,并为分布式和并行系统提出精确的语义[5,6,7]。所有这些方法都基于活动对象。 每个并发执行的线程都独占地属于 一个单一的对象。从而,建立了并发线程从一个组件跳转到另一个组件的模型。对象到另一个对象-被简单地忽略。此外,在过去的几十年里,已经详细阐述了各种形式化的并发系统建模模型:虽然Hoares CSP方法是一般性的,但它没有包含现代基于组件的编程范式A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)57[9]的文件。在Martin Abadi和Luca Cardelli [10]提供的面向对象语言的理论基础中,在Focus [11]和 *-Calculus [12]中,并发性是在活动对象的意义上建模的。组分或试剂。 但同样,它不支持从一个对象跳转的并发线程。或代理另一个。最后介绍了集成上述组件技术的早期方法-同样,在特定语言和编程平台之间精确的语义映射仍然是一个研究问题。总而言之,主流编程模型--并发线程从一个分布式组件跳转到另一个分布式组件--- 以及现有的正式和非正式规范技术。 即便如此,软件工程师也会使用这两种方法。 因此,他们必须弥合类似于一个马戏团艺术家。 这是一个危险的容易出错的任务。 因此,我们需要一个健全的语义模型,它既要足够强大,能够处理并发分布式组件,又要足够现实,能够为实际使用的组件和编程技术本文的其余部分结构如下:下一节介绍一个简单的程序,以显示分布式并发基于组件的系统的最重要的行为方面。在下面的第3节到第6节中,将讨论分布式并发基于组件的软件系统的操作语义。在第7节中,我们展示了如何使用UML对这种分布式并发的基于组件的软件系统进行建模。在第8节中,将简要介绍所提出方法一个简短的结论使这篇论文更加完整.2并发程序示例假设一个简单的计算机游戏棋盘应用程序,如国际象棋游戏。人类用户输入他的游戏移动。计算机对游戏板数据执行相应的更改,然后计算机计算其移动,并最终在游戏板上执行其移动。当计算机计算其移动时,计算机游戏通常允许用户切换游戏板侧。请注意,这是这个简单应用程序必须是并发的原因之一。每当计算机处理用户的移动请求时,它仍然必须对侧切换请求做出反应。在延长的处理时间期间接受用户输入是交互式系统是并发的一个典型原因。图1所示的Java程序是一个并发程序,演示了这样一个计算机游戏板应用程序的控制器。SimulatedUser类模拟用户。移动或开关按钮由用户随机按下。操作系统(OperationSystem类)接收移动或切换事件。它创建一个新线程来调用应用程序的已注册事件处理程序因此,并发基于组件的系统的形式化模型必须8A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)5public class Uncategorized {公共静态空main(String[] args){//初始化操作系统操作系统Theos=new OperationSystem();//用户可以进行游戏移动或切换//董事会方面-随机决定同时(!(new Random().nextInt(100)== 50)){if(new Random().nextInt(10)7){//游戏动作是顺序化的;对应的//按钮被禁用,直到前一步结束同步(FourWins.gameMoveButtonDisabeled){System. out. println();}} else { theOS.switchSideEvent();}public class Uncategorized {//初始化操作系统私有的唯一应用程序FourWins theFourWinsApp= newFourWins();//为每个接收到的用户事件提供一个线程//os并调用app public void gameMoveEvent()上的相应处理程序{public void run(){public void run(){theFourWinsApp.gameMove();}}).start();public void onDestination(){onDestination(){public void run(){theFourWinsApp.switchSide();}}).start();public class Uncategorized {staticpublic Boolean gameMoveButtonDisabeled = new Boolean(false);private boolean humanPlayerNext = true;public boolean computerIsCalculating = false;public void run(){//禁用游戏移动按钮-用户无法执行//另一次移动,直到此移动完成synchronized(gameMoveButtonDisabeled){//人类游戏移动是模拟同步的(FourWins.class){publicint findDuplicate();{}//模拟计算机计算周期,//切换板侧的机会导致双H输出try {Thread.sleep(0,1);}public int findDuplicate();}//计算机游戏移动是模拟同步的(FourWins.class){computerPlayerIsCalculating=false;if(!humanPlayerNext){System.out.print(“C”);}public void run(){//模拟计算机或人类的游戏动作//取决于gameMove()中的实际活动移动同步(FourWins.class){如果(!System.out. println(“C”);}else {humanPlayerNext = true;}Fig. 1. 并发程序示例支持异步消息通信以及并发方法调用。 类FourWins实现了这样一个计算机游戏棋盘应用程序的控制器。我们的示例程序不是在游戏板上执行真正的移动,而是打印“H”和“C”来说明是否执行了人为移动或是电脑的动作重复调用gameMove()会导致初始更改-A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)59H和C的配对序列而调用switchSide()可能会在标准输出上导致这取决于并发switchSide()是在计算机完成他的移动计算之前('HH')还是之后('CC')被调用然而,关于并发游戏板控制,简单的Java程序功能齐全。可以看出,对于程序员来说,在这两个简单的交错函数的情况下管理并发性是一个复杂的问题。并发线程共享公共变量。因此,所提出的并发组件的操作语义必须支持共享的全局状态。最后,类FourWins可以作为一个可观察对象,可以观察到可视化或分析目的2。其他组件可以自行作为观察员。从而可以创建和删除对象实例。此外,在系统执行期间,由引用和指针表示的这些对象之间的连接可以被改变,例如通过向类FourWins内的观察者列表添加新的观察者。因此,下一节中介绍的操作语义必须支持这些动态变化的结构。3基本概念本节详细阐述了分布式并发基于组件的软件系统的形式化模型的基本概念。这种模型包含两个层次:实例层次和描述层次[13]。图二、并发组件的实例级别描述级别(在第7节中描述)包含具有相似属性的公共实例级别元素子集2代码示例中没有显示观察器机制10A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)5实例级(在第3节到第6节中描述)是描述级的可靠语义基础。它为分布式并发组件提供了操作语义-它是现有编程模型(如CORBA、J2EE和. NET)的抽象。因此,它定义了所有可能的软件系统的宇宙,这些系统可以在描述级别指定并使用上述编程模型实现。我们提出的分布式并发组件的形式化模型的实例级必须足够强大,以处理上一节中• 动态地改变结构,• 共享全局状态,• 异步消息通信,以及• 并发方法调用。图2总结了分布式并发组件的形式模型在抽象级别上的实例级别上的这些行为方面。因此,软件系统在运行时由一组不相交的实例组成:系统,组件,接口,属性,连接,消息,线程和值。为了唯一地处理实例级的这些基本元素,我们引入了所有实例的无限集合IN-STANCE重复=def{系统组件接口属性}连接信息螺纹值下面描述了分布式并发基于组件的系统的四个3.1结构行为系统可以动态地改变其结构。可以创建或删除某些实例(ALIVE)。新属性(分别)接口可以分别被分配给接口部件(分配和转让)。接口可能与其他接口有直接连接(CONNECTS):ALIVE=def属性→布尔分配=def接口→组件分配=def属性→接口CONNECTS= def CONNECTION → {{from,to}|从,到∈接口}3.2估值行为一个系统的状态空间不仅由它的当前结构决定,组件属性的值。将属性或参数映射到适当类型的值由以下定义涵盖赋值=def属性→值A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)511×3.3通信行为消息序列表示异步通信的基本单位。为了对基于消息的异步通信进行建模,我们用MESSAGE符号表示任意有限消息序列的集合。在每个观察点内,组件处理到达其接口的消息序列,并将消息序列发送到其他接口:评估=def接口→消息队列3.4执行行为除了异步通信之外,由并发执行的线程执行的同步方法调用是当代软件系统中的主要执行机制。每个方法都在特定的接口(CALL)上调用。因此,为了对线程的调用堆栈建模每个线程都有自己的方法调用历史- 其调用堆栈(EXECUTION)。请注意,如果在属于另一个组件的接口上调用方法,线程可能会更改托管组件:EXECUTION=defTHREAD→(INTERFACE×CALL)3.5系统快照基于以前的定义,我们现在能够描述软件系统的快照。这样的快照捕获当前结构、变量赋值、实际接收的消息和当前方法调用。让SNAPSHOT表示所有可能的系统快照的类型:快照=def活动×分配×分配×连接×评估×评价×执行4系统行为与[11]等相关方法相比,我们不关注定时流,而是关注执行流。我们将观察点视为各种长度的执行间隔的无限长链。 每当线程的调用堆栈发生变化时(如果 新方法调用或方法返回-到达新的观察点。 我们使用自然数N的集合作为这些观察点的抽象轴,为了清楚起见,用E此外,由于结果的简单性和通用性,我们假设了一个观测同步模型。这意味着所有对象点都有一个全局顺序,因此所有方法调用和返回都有一个全局顺序。 注意这不是一个关键的限制。现有的分布式组件环境(如CORBA、J2EE和.NET)控制和管理所有的方法调用和返回。这样的组件环境可以透明地强制所有方法调用和返回的全局顺序。我们使用执行流,即来自给定域的元素的有限或无限序列,来表示随着观察而变化的概念实体的历史12A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)5SSSS∈⊆∈∈SSSSSS分。集合X中元素的执行流(更准确地说,是具有离散执行间隔的流)是以下类型的元素:XE=defN+→X,其中N+=defN\{ 0}因此,执行流将每个观察点映射到X的元素。符号xe用于表示在观察点e∈E处的赋值x∈XE的元素,其中xe=x(e)。执行流可用于对软件系统的行为进行建模。因此,快照E是所有系统快照历史的类型,或者简单地是所有可能的软件系统的行为关系的类型快照E=def活动E×分配E×分配E×连接E×评价E×评价E×执行E设快照E是任意系统的行为关系,s∈SYSTEM 3. 给定的快照历史快照s∈快照E是一个执行元组流,其捕获观察期间的变化快照快照e点e∈E。显然,可以在形式行为快照E快照E比如说, 可能要求所有属性获得与它们所属接口相同的激活状态:a∈属性s,i∈接口s,e∈E。分配e(a)=i有效e(a)=有效e(i)或者,被删除的实例不允许重新激活:实例s,e,n,m∈E。 e nmalivee(i)aliven(i)alivem(i)我们可以想象很多这样的一致性条件。全面的处理超出了本文的范围,因为由此产生的公式相当长。 关于这个问题的更深入的讨论可以在[14,15]中找到5线程行为系统的可观察行为是所有线程行为组合的结果。为了显示这种一致性,我们首先必须提供单个线程的行为形式化在实践中,转换关系是一个足够的行为表示。在我们的形式化模型中,我们使用了一种新型的转换关系:与“正常”转换关系(状态和其后继状态之间的关系)相反行为=def快照→快照让行为tBEHAVIOR是线程t的行为线程s在系统s系统线程行为的非正式含义如下: 每个线程执行一系列由转换关系表示的操作。每一次操作,转换关系转换行为t可以直观地被看作程序代码的原子片段,其具有以下结构:3在本文的其余部分,我们将使用这个捷径。每当我们想指定一个关系X(元素x)到系统s∈SYSTEM,我们称Xs(xs)。A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)513⊆S∈∈SSS1n(i) 线程评估系统范围快照的相关部分的执行。如果系统范围快照的这一部分适合,由元组转换的第一个快照给出,(ii) 线程请求对系统范围的快照的一组改变。因此,线程希望系统与由元组转换的第二快照给出的下一步骤中的系统范围的后继快照一致。(iii) 最后,线程想要执行一个新的方法调用或返回。 同样,这是由函数执行tEXECUTION中描述的调用堆栈更改给出的,它是元组转换中第二个快照的一部分。请注意,线程的行为关系是一个函数,而不是一个关系。因此,非决定论是无法表达的。在指定线程行为的情况下表示非确定性尤其可能是一种检验解决方案。然而,这不是对所提出的方法的一般限制6行为构成因此,我们需要一些专门的运行时系统,它会逐个询问所有线程,看它们是想执行新的方法调用,还是想从方法调用返回。每当一个线程想要执行一个新的方法调用或返回时, 当它的行为关系被触发时,运行时系统根据线程请求的更改和当前系统范围的快照组成一个新的定义良好的系统范围的后继快照因此,这样的运行时系统类似于虚拟机。它观察并管理所有线程的执行。同样,即使在并发和分布式环境中,这也不是关键约束。现有的分布式组件环境(如CORBA、J2EE和.NET)控制和管理环境中所有执行的组件。在第8节中,我们展示了如何通过扩展现有的和广泛使用的组件环境(如CORBA、J2EE或. NET)来实现所提出的方法。综上所述,这种运行时系统的主要任务是从当前快照快照e∈快照E中确定下一个系统快照快照e+1。在本质上,我们可以提供公式来计算系统的行为从初始-初始配置快照0、行为关系{行为t,...,行为t}的所有线程t1,...,通过异步消息和空闲接口上的同步方法调用来实现线程和外部激励。请注意,自由接口是不与其他接口连接的接口,因此可以从环境中刺激。在我们能够得出最终公式来指定运行时系统之前,我们需要一个新的关系运算符这个运算符取一个关系X,如果两个元组的第一个元素都等于4,则用Y的元组替换X的所有元组:[4]请注意,“标准”符号π i 1,.,in(R)表示在关系R上投影的n元组的集合,其中n∈N<$n≤r.而在π i 1中的每个元组中,...,in(R)包含位置i1,.,in的对应元组,其中1 ≤ik≤r,其中k∈{1,.,n} N。14A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)5SSSSSSSSSSSSSSSSSS1下一个线程S<$π1(消息执行(快照))SS2下一个线程SSS3S下一个线程SS4下一个线程SSS5下一个线程SSdefXaY=def{a|a∈Y<$(a∈X<$π1({a})<$π1(Y)=<$)}我们现在能够提供完整的公式来确定下一个系统快照快照e+1:下一个快照:SNAPSHOT→ SNAPSHOT下一个快照(快照e)=def 快照e+1==(存活e+1,赋值e+1,分配e+1,连接e+1,赋值e+1,评估e+1,S s执行e+1)alivee+1=aliveeaπ(行为s s s s(snapshote))e赋值e+1=赋值eaπ(行为(快照e))分配e+1=分配eaπ(行为(快照e))连接e+1=连接eaπ(行为(快照e))赋值e+1=赋值eaπ(行为(快照e))求值e+1= π6(下一个行为 thread(snapshote))线程S执行e+1=执行eaπ(行为S (快照e)es s7下一个线程s<$π7(消息执行(快照))直观地说,下一个系统快照快照e+1是一个元组。这个元组的每个元素,例如赋值e+1,是一个函数,简单地通过合并前面的函数赋值e和π2(行为下一线程(快照e))。这个这种直观的理解并不完全适用于活着的e+1,评价的e+1S s执行E+1. 在活着的e+1以及执行E+1, 不仅 祝愿 螺纹下一个线程必须包括在内。这些wishes必须包含线程的实际方法调用或返回。此外,它们可能包含由当前线程创建的新并行线程。而且,活着的e+1执行E+1也包含申请函数消息执行(快照e)。这个函数包括为处理异步消息而创建的新线程。因此,对于由快照e中包括的评估e给出的每个异步消息,创建一个新线程S sinalivee+1以在执行e+1中执行对应的请求。消息执行S s定义如下:消息执行:SNAPSHOT →SNAPSHOT消息执行(快照e)=快照'=(alive',live,live,live,live,live,live,live,执行')。i∈Interfaces,m∈Messages.m∈evaluatione(i)惠惠tJ∈ Threads. <$alivee(tJ){alive'(t j)}执行'(t j)= {(i,m)}对于每个异步消息,都会激活一个新线程,并初始化相应的调用堆栈。由于所有异步消息在每个观察点都被转换为对应的并发执行的线程,因此新的系统快照只需包含新的异步消息,表示为求值e+1=π6(行为t(快照e))。S s请注意,异步消息的传递需要一些时间,确切地说是一个观察点。为了对网络延迟或网络故障进行建模,必须提供更复杂的函数消息执行。因此,不仅延迟A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)515SS以及异步消息的丢失,而且在执行方法调用中与网络相关的故障也可以被集成。为了完成正式模型,必须定义函数next thread:下一篇:THREAD这个函数返回运行时系统要访问的下一个线程。为了提供一个简单但通用的模型,我们提出了一个循环模型。因此,所有活动系统线程的给定严格顺序是必需的。下一个线程遵循该给定顺序,并提供要被访问的下一个相关线程,并由运行时系统集成到系统范围的快照注意,可以将附加特征集成到模型中,提供函数next thread的其他实现,例如非确定性和基于优先级的线程调度。非确定性可用于对不确定的执行顺序进行建模或支持未指定。无论何时执行并发线程或组件,都可能发生不一致或死锁。一个关于在语义中显式建模的元素的死锁,例如两个线程,每个线程锁定一个属性,并等待获取另一个线程属性上的锁-在这个模型中不会发生,因为所有线程都是一个接一个地访问的,每个线程都必须在被访问后释放所有被阻塞的资源。然而,更高级别上的死锁,例如一个线程等待给定条件变为真,另一个线程等待该线程使另一个条件为真,不能提前检测该模型不抑制不一致的情况,但它有助于检测它们。为了确保下一个系统快照e+1是明确定义的,必须满足一个基本条件:行为nextthread(快照e)给出的希望的后继快照中的所有元素,如果导致结果下一个系统快照的变化,则在线程next thread进行了他的最后一个方法调用或方法返回之后,不得更改。例如,假设一个线程执行一个方法调用。属性的值是5,因为线程已经开始执行方法调用,并且线程希望在从该方法调用返回时将该值更改为7。在线程从方法调用返回的观察点,属性的值已经是6,因为另一个线程在此期间更改了该值。因此,并发线程执行可能会导致不一致。实现下一个快照功能的运行时系统必须计算下一个系统快照。因此,它可以观察这个一致性谓词,并验证这种可能的不一致情况是否发生。如果运行时系统检测到这种可能的不一致情况,则其可以出于可靠性原因而停止系统执行。注意,并发线程的这种形式一致性概念类似于数据库中的乐观锁定技术7描述技术前面几节中介绍的操作语义表示实例级。它定义了我们对分布式并发基于组件的软16A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)5图三. 观察者模式的组件结构。软件系统。基于操作语义,我们可以提供运行时一致性检查,如前一节所述。操作语义是描述层的语义基础描述层包含一组适当的规范和建模技术,以详细说明和指定分布式并发组件。一旦基于操作语义正式建立了描述级别,我们就可以从规范中生成可执行代码,然后在运行时环境中执行这些代码(参见。第8节)。所提出的描述技术是基于UML的。以著名的观察者模式为例[16]。图3显示了一个简单的基于组件的ob-server模式。组件Data表示观察者模式的可观察对象它只提供一个Observable接口。这个接口封装了由属性sState表示的要观察的状态。每当sState的状态被改变时,方法notify()就会被调用。这导致发送一个图四、 方法notify()的文本描述。A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)517异步消息update()到所有通过连接Observation连接的接口Observer。除了正常的可观察功能之外,Observable接口还提供了方法deploy()。调用deploy()会创建一个新的组件View,它有一个相应的接口Observer,并将该接口附加到被调用组件Data的Observable接口。为了指定每个方法,并为每个消息提供一个UML活动图。在这里,我们使用UML活动图的扩展版本,或者这些类型的活动图的文本表示。图4和图5分别显示了描述notify()方法行为的UML活动图的文本和图形变体。因此,首先请求连接的Observer接口的序列。然后,向这个序列中的每个Observer接口发送异步消息notify()。操作语义的所有第一个类元素都被显式表示在描述技术中,如组件、接口、连接、属性、消息和方法。此外,对于操作语义中的每个原语操作,都可以使用特定的文本和图形构造例如,图6显示了方法deploy()的文本描述。如前所述,调用此方法将创建一个新的组件View,其中包含一个相应的接口Observer,并将该接口作为新的Observer附加。在此描述中,提供了用于创建组件、接口和连接的特定于方法的语法构造。建议的de-图五、 方法notify()的图形描述。scription技术包含所有第一类元素18A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)5以及所有原始操作。除了线程,没有提供特定的表示。由于我们的操作语义管理基于组件的系统中并发执行线程的集成,因此不需要在规范级别上处理并发问题,例如同步语句,信号量和监视器。因此,不再需要程序员容易出错的任务来同步如图1所示的组件代码的各个部分。特别是在基于组件的编程模型中,避免图1中使用的细粒度代码同步非常重要,因为它会破坏组件封装。图7展示了一个扩展的UML序列图。这个序列图显示了一个连接到可观察组件的观察者组件。首先调用消息deploy()。一个新的观察者被创建并附加到观察者。然后观察者的状态被改变。这将导致调用notify(),从而向所有附加的观察者发送异步消息update()。 一旦消息被处理,观察者就从可观察组件请求新的状态。图7示出了一种可能的线程结构和并发位置。见图6。 方法deploy()的文本描述。状态。每个线程都由灰色框显示。这些框中显示的通信序列由相应的线程执行线程1和线程2可以是同一个线程。这取决于呼叫者。如果两者都有相同的调用者,那么线程1和线程2是相同的,或者调用者不同,那么线程1和线程2是不同的。此外,线程3和线程4是新创建的线程,用于处理接收到的异步消息update()。此外,图7示出了序列被分成几个观测值,vation点applying应用our operational操作semantics语义.这些观察点是同步所有并发执行的线程的执行点。 讨论的 在第4节中,遵循我们操作语义,每个方法调用或方法返回都存在一个观察点。因此,对于进入和离开通信序列的每个线程,都存在一个观察点。此外,如线程2中所示,线程可以被划分为多个观察点。 要么 因为方法调用是在线程内执行的--在我们的例子中,方法notify()或者另一个线程导致一个观察点-在我们的例子中是线程3A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)519图7.第一次会议。交错线程和相应的观察点由操作语义给出在线程2的执行中导致两个额外的观察点8工具支持为了在实践中应用所提出的概念,适当的工具支持是一个关键的成功因素。如前所述,我们开发了一个支持建模、代码生成和系统执行的工具--DesignIt [17]。软件工程师可以使用DesignIt对基于组件的软件系统进行建模。为此,软件工程师使用CASE工具来开发所需的基于组件的软件系统的基于UML的模型。在这样做时,应该使用上一节中介绍的描述技术-静态结构和语法的组件图,以及对方法和消息的行为建模的活动图。目前,CASE工具Together直接支持。所有的建模示例、定义UML扩展的UML概要文件和XML生成器都已实现20A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)5作为Together的插件。但是,可以使用任何其他CASE工具。为此,必须提供相应的XML生成器图8.第八条。使用DesignIt的开发周期如图8所示,从UML模型中生成了一个XML文件(步骤1)。这个XML文件是UML模型的简单文本表示。 我们可以使用XMI作为文本表示。 XMI必须支持完整的UML元素。我们只需要DesignIt环境的建议的扩展组件和活动图。为了保持下面的处理任务简单,我们决定定义我们自己的简单XML表示,以用于建议的扩展组件和活动图。XML转换用于从XML文件中生成完整的Java程序代码(步骤2)。然后在运行时系统中执行和调试生成的Java组件(步骤3)。当在此步骤中检测到缺陷时,可以对程序进行调试和分析。一旦问题被识别出来,就可以通过改变UML模型来解决(步骤4)。 之后,可以迭代地应用整个周期,直到实现 是正确的总之,DesignIt工具环境支持纯正向代码生成。由于代码是完全生成的-不需要更多的编码-因此不需要向后的代码工程。DesignIt的执行和调试环境本身是分布式的。该系统采用CORBA作为分布式和网络通信技术来实现。执行环境是一个CORBA服务器。 对于每一种组件类型,启动一个单独的CORBA服务器。甚至调试器也是在自己的CORBA服务器中启动的。因此,执行环境、调试器和每个组件类型可以在单独的计算机上执行图9显示了DesignIt调试环境的屏幕截图。 在树的顶层,显示了每个可用的服务器。在所示的示例中,存在三个额外的分布式服务器:一个用于运行时环境,一个用于所有A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)521一个用于组件类型CB的实例,另一个用于组件类型CA的所有实例。此外,还显示了每个组件实例的当前状态及其语法接口。图9.第九条。 设计环境。使用这种调试环境,可以启动来自系统外部的异步消息或方法调用。一旦消息响应。方法调用存储在运行时环境中,整个分布式并发系统可以逐步执行。每一步都代表了我们操作语义学意义上的一个观察点。一旦出现不一致,调试环境就会停止系统执行,并通知软件工程师可能存在的不一致情况,如第6节所述。然后,软件工程师可以分析情况并修复模型,直到它是正确的。9结论开发和维护分布式并发的基于组件的软件系统的能力是现代软件工程的基础。为了弥补软件系统中基于构件的垂直分解和并行执行流程之间的差距,提出了一种分布式并发构件的操作语义。该模型还包括分层组件-软件系统包含组件,这些组件又由所谓的子组件组成。 这一点尚未提出 但它包含在[15]中的完整形式语义该模型为这类软件系统提供了一个坚实而现实的语义基础:它足够强大,可以处理动态变化的结构、共享的全局状态、异步消息通信和并发方法22A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)5执行.可以从并发执行的线程和它们的行为关系中计算出整个系统的行为。基于操作语义,可以在运行时检测到不一致的系统状态,特别是由并发执行引起的不一致的系统状态,并且可以停止进一步的系统执行此外,本文还提出了文本和图形描述技术来描述这种并发的基于构件的软件系统。 一个完整的和正式成立的语义映射的描述技术的操作语义还没有提出的文件。这一点在[15]中已有阐述。基于这种语义,支持在运行时环境中完整的代码生成和执行.工具支持建模,代码生成和系统执行已经实施,并用于小型案例研究。然而,还需要进一步改进。此外,可以解决对规范推理的工具支持。目前,在[15]中,已经详细阐述和实现了在组件进化的情况下推理组件组成变化的概念。关于规范和代码之间一致性的进一步工具支持可能是一个值得全面改进的。必须进行案例研究和工业经验,以表明拟议的办法是否具有实际意义。正式模式可加以扩展,以纳入例外的概念。此外,可以集成附加的描述技术,例如序列图,以建模系统跟踪和测试用例。该工具支持可以扩展到集成的运行时测试和验证、故障分析辅助以及针对其他目标平台的代码生成。10确认感 谢 Christian Bartelt 、 Arnd Poetzsch-He Schutter 、 Marcus Reitz 、 MarcusSeiler和Thomas Ternit对本书的贡献和评论引用[1] Standish Group International,Inc.合作项目成功。软件杂志,2001年2月/3月。Wiesner Publishing.2001年[2] 对象管理组。OMG统一建模语言规范,2.0版。技术报告,OMG。2005年[3] 加里·T阿尔伯特·莱文斯贝克克莱德·鲁比JML的初步设计:Java的行为接口规范语言。技术报告98- 06d,爱荷华州立大学计算机科学系。1999年[4] 乔斯湾Anneke G. Warmer克莱珀对象约束语言(第二版)。艾迪生·韦斯利出版公司2004年[5] Stephen J.梅勒马克·巴瑟可执行UML。Addison-Wesley Professional.2002年。[6] 路易吉·拉瓦扎,加布里埃尔·夸罗尼,马特奥·文图雷里.结合UML和形式化符号对实时系统进行建模。第八届欧洲软件工程会议论文集2001年A. Rausch/Electronic Notes in Theoretical Computer Science 176(2007)523[7] 马克·里希特验证UML模型和OCL约束的精确方法。Logos Verlag Berlin 2001年[8] UML/EJ
下载后可阅读完整内容,剩余1页未读,立即下载
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 计算机系统基石:深度解析与优化秘籍
- 《ThinkingInJava》中文版:经典Java学习宝典
- 《世界是平的》新版:全球化进程加速与教育挑战
- 编程珠玑:程序员的基础与深度探索
- C# 语言规范4.0详解
- Java编程:兔子繁殖与素数、水仙花数问题探索
- Oracle内存结构详解:SGA与PGA
- Java编程中的经典算法解析
- Logback日志管理系统:从入门到精通
- Maven一站式构建与配置教程:从入门到私服搭建
- Linux TCP/IP网络编程基础与实践
- 《CLR via C# 第3版》- 中文译稿,深度探索.NET框架
- Oracle10gR2 RAC在RedHat上的安装指南
- 微信技术总监解密:从架构设计到敏捷开发
- 民用航空专业英汉对照词典:全面指导航空教学与工作
- Rexroth HVE & HVR 2nd Gen. Power Supply Units应用手册:DIAX04选择与安装指南
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)