state diagram specification状态图/状态机(OMG)

14.2.3 Semantics

14 StateMachines

14.1 Summary

状态机不只使用有限状态机的机制对具有事件驱动行为的系统建模以外,也表达了系统的Behavior,以及交互细节(protocol)。按照具体的概念,大概能够分为两种,behavior
state machine和protocol state machine.node

14.2 Behavior StateMachine

14.2.1 Summary

14.2.2 Abstract Syntax

14.2.3 语义(Semantics)

14.2.3.1 StateMachine

  behavior StateMachine包含一个或多个Region,每一个Region是一个节点的集合,节点之间经过一些弧线链接,这些弧线表明transition。State machine的运行经过事件Event驱动。事件队列处理一个Event,触发状态图中对应的transition,而后整个图从一个状态到另外一个状态,一个Region到一个Region。在状态迁移的过程当中,状态图实例执行相关状态的Behavior(transition effects,state entry and state exit Behaviors,etc.)
  若是状态机存在一种BehavioredClassifier context,则该Classifier定义了该状态机的Signal Triggers和CallEvent triggers.Signal Triggers and CallEvent Triggers 经过Receptions and Operations of this Classifier来定义。主要用来定义状态机的message event Triggers
  若是状态机没有BehavioredClassifier,也就是说它的Triggers不和Classifier的Receptions,Operations耦合。它的好处是能够将状态图做为模板,而Triggers做为模板参数。这样状态图能够被不一样的Classifiers(其中的CallEvent or SignalEvent Triggers)复用。
  因为事件驱动的特色,状态机的执行就是在transit和state之间切换,当一个事件触发后,进入transit。
Note.当处于state状态时,doActivity Behavior也会执行算法

14.2.3.2 Regions

Region(区域)指示了一个Behavior片断,它可能与它的正交区域并发执行.若是两个或多个区域被相同的状态或状态机(Region位于顶层的时候)所包含,那么它们彼此是正交的。当状态机执行进入Region所属的状态,那么Region变为Active(开始执行),或者当Region直接被状态机所拥有,而所属的状态机能够执行时,Region也变为Active。每一个区域拥有一组顶点和转变,它们决定了区域中的behavioral flow。Region可能有本身的initial伪状态和FinalState。编程

  Region激活分为隐式和显式;并发

  • 隐式(从Regsion中得initial Pseudostate开始执行)编程语言

    1. (local or external)transition 链接到Region的父状态ide

    2. top level Region,一个状态机开始执行this

  • 显式
    transition链接到Region内部的状态或伪状态线程

显式激活致使并行Region的其余Region是隐式激活,该Region显式code

隐式激活意味着源自该Region的initial伪状态的Transition开始执行.若是Region内没有inital伪状态,报错!
显式激活:当一个正交状态的一个Region被显式激活时,会致使它全部正交的Region被隐式激活。除非这些Region也是被显式进入(多个正交的区域能够经过来自相同的fork伪状态的Transition而显式地被并行进入)。cdn

14.2.3.3 Vertices

  Vertex是个抽象的概念,表明状态图里的各类类型的node(State,Pseudostates,ConnectionPointReference).它是能够做为Transition的起点或终点的全部类型node的总称。定义的语义取决于它所表明的具体种类的节点。伪状态和链接点引用是过渡的(transitive),(a compound transition execution simply passes through them, arriving on an incoming Transition and leaving on an outgoing Transition without pause),状态和FinalState表明了稳定的顶点,当状态机执行进行到它们时,会停留直到触发一个可以使其进入一个不一样状态的事件出现.不一样类型的顶点语义在下面描述。

14.2.3.4 States

  
State是对一个执行过程当中静态的场景创建的模型。

14.2.3.4.1 Kinds of States

以下种类的状态是被区分的:

  • 简单状态(isSimple=true)

  • 组合状态(isComposite=true)

  • 子状态机状态(isSubmachineState=true)

简单状态没有内部的Vertex和Transition。组合状态至少包含一个Region,而一个子状态机状态引用了整个状态机,你能够理解为将一个状态机嵌入到该状态中。一个组合状态能够是一个简单的组合状态(只有一个Region)或是一个拥有多个Region的正交状态(isOrthogonal=true)。例如,图14.9中的“CourseAttemp”状态是一个只有一个区域的组合状态,而“Studying”是一个包含三个区域的组合状态。

被组合状态的一个区域包含的任意状态都称为该组合状态的子状态。
“直接子状态”: 没有被其它子状态包含的子状态,不然被称为“间接子状态”。

14.2.3.4.2 State configurations

  一个表示当前状态机实例在运行的过程当中,全部处于active的state的集合。例如图14.9中所描绘的状态机执行的一个Active状态配置是:
<CourseAttempt - Studying – (Studying::Lab2,Studying::TermProject, Studying::FinalTest)>
一个执行的状态机实例每次只能正好处于一个状态配置,该状态配置称为它的活跃状态配置。在对与状态机的触发器匹配的事件出现的响应下,状态机执行被表现为从一个活跃状态配置到另外一个活跃状态配置。一个State若是是configuration得一部分,那它就是active.
当知足以下条件是,一个状态配置被称为是稳定的:

  • 在当前configration下没有Transition激活

  • 配置中的全部entry行为都执行完毕(doActivity行为除外,它们可能能在执行)

在被建立和执行完它的initial Transition后,状态机老是处于某个状态配置。然而,由于状态多是层级(hierarchical)状态而且伴随Transition和State执行,某些关联它们的Behavior(如:entry,exit,etc),所以,“进入”一个层级化的状态配置涉及一个动态的过程,该过程只会在达到一个稳定的状态配置后才中止。这为精确的指明状态机什么时候位于一个状态配置的某个特定状态制造了一些潜在的模糊性。状态机什么时候被认为“处于”一个状态和“离开”一个状态的规则分别在“进入一个状态”和“离开一个状态”部分进行描述。

14.2.3.4.3 State entry, exit, and doActivity Behaviors

状态能够关联一个entry(入口)行为。它会在状态经过一个external Transition被进入时执行。此外,状态还能够关联一个exit(离开)行为,若是定义了这个行为,它会在状态被离开时执行。
状态还能够关联一个doActivity行为。该Behavior在状态被进入(但要在状态的Entry Behavior执行结束后)时开始执行,而且与该状态关联的其它Behavior并发执行,直到:

  • 它结束(此时产生一个完成事件)

  • 状态被离开,此时,doActivity行为的执行被放弃

一个状态的doActivity行为的执行不受该状态的内部迁移发生的影响。

14.2.3.4.4 State history

状态历史(history)的概念是由David Harel在最初的状态图形式模型中引入的。它被用来保存一个Region在上次退出时的state configuration。Region能够恢复它上一次退出时的状态配置。例如:当该Region从新Active(从处理一个中断返回),或者有一个返回到它的历史的内部转变。(This is achieved simply by terminating a Transition on the desired type of history Pseudostate inside the Region)。该功能的好处是它消除了用户显式地跟踪历史的须要,这能够显著的简化状态机模型。
提供了两种历史伪状态:

  • 深度历史(deepHistory)
    表明了对区域最近一次访问的完整状态配置。一个Transition若是链接到deepHistory的话,表明着一个Transition链接在所保存的state configuration的最深层的State上,包括执行沿途遇到的全部Entry Behavior

  • 浅历史(shallowHistory)
    表明只返回到最近一次的状态配置的最顶层子状态,使用缺省入口规则进入

特殊状况
当一个Transition终结在一个历史伪状态上,而且该状态以前没有被进入过(即没有历史)或已经到达了它的FinalState,那么可使用缺省历史机制来强制一个Transition终结在某个特定的子状态上。具体来讲,就是画一个Transition,它源自历史伪状态,终结于包含该历史伪状态的Region的一个特定顶点(即缺省历史状态)。若是没有定义缺省历史Transition,那么该区域的标准缺省入口按照以下的解释执行:

  • 延迟事件
    状态能够规定在本状态内被延迟的事件类型集合,只要该状态一直活跃,那么这些类型的事件出现就不会被派发,而是一直停留在事件池,直到下面的状况发生:

  • 到达一个这些事件类型再也不被延迟的state configuration

  • 某个延迟的事件类型是一个Transition的触发器,而且该Transition的源是该延迟状态

事件可能被一个composite state或subStateMachine所延迟,此时,只要该组合状态仍处于active state configuration,那么该事件就一直被延迟。

14.2.3.4.5 Entering a State

  进入一个状态所表明的语义是不一样的,它依赖所进入状态的类型(composite state/simple state/..)和它进入的方式。可是它们有一点是相同的,即当incoming Transition的effect Behavior完成后,Target State的entry Behavior才能执行。entry Behavior完成后,doActivity Behavior才能执行。而后若是Target State是composite的的话,它的substate的entry Behavior会和它的doActivity并行执行。
  上面描述了进入simple state的语义。对于composite state with a single Region的状况:

  • _Default entry_:an incoming Transition链接到一个composite state的轮廓上(没有进入state内部)。若是composite state内部存在一个init Pseudostate,则在执行entry Behavior和fork一个线程来执行doActivity Behavior后,执行init Pseudostate的default Transition。若是没有init Psedostate,报错no init Pseudostate definded

  • _Explicit entry_:an incoming Transition链接到composite state的substate,表明substate处于active,composite state的entry Behavior执行后,直接执行substate的entry Behavior。该规则支持递归。

  • _Shallow history entry_:an incoming Transition链接到一个composite state的浅历史伪状态上,那么活跃的子状态称为该次访问以前最近一次活跃的子状态,除非:

    1. 最近一次的活跃子状态是FinalState

    2. 这是该状态的第一次被访问

    3. 在上述二者状况下,若是从该浅历史伪状态定义了一个缺省历史转变,那么就使用 它。不然,应用缺省的状态进入

  • Deep history entry:除了目标伪状态的类型是深历史而且须要递归地将规则应用到上次active state configuration的全部层次上外,它与浅历史的规则是相同的.

  • Entry point entry:an incoming Transition链接到一个composite state的entry point,那么在执行完composite state的entry Behavior后,执行从entry point连线到其余state的Transition.

若是组合状态是一个具备多个区域的正交状态,它的每一个区域都会被缺省或显式地进入。如
果转变终结在组合状态的边上(即没有进入该状态),那么全部的区域使用上面所说的缺省
进入规则来进入。若是转变显式地进入一个或多个区域,那么这些区域被显式进入,其它的
被缺省进入。
无论状态是如何被进入的,状态机已经认为处于这个状态,即便这个状态的任何entry Behavior 或effect Behavior(若是定义的话)还没开始执行

14.2.3.4.6 Exiting a State

当离开一个状态的时候,无论它是simple仍是composite,离开所涉及的最后一步是执行该状态的exit Behavior,若是它的doActivity还没执行完的话,在exit Behavior执行以前,doActivity会被中断。

当从一个组合状态离开时,离开是从当前活跃状态配置的最深层状态开始的。若是离开是通 过一个exit Point伪状态开始的,那么当终结于exit Point的Transition的effect Behavior执行后,执行复合状态的exit Behavior;
当从一个正交状态离开时,它的全部区域都被离开。此后,该复合状态的exit Behavior被执行。
无论状态是如何被离开的,只有在该状态的exitBehavior(若是定义的话)执行完毕后,状态机才被认为是离开的这个状态。
被封装的组合状态
在一些建模场景中,对一个组合状态进行封装颇有用,经过不容许转变直接穿过该状态到达
它的内部节点来实现.在封装中,一般须要将组合状态的内部元素绑定到incoming/outgoing Transitions,这经过entry Point和exit Point伪状态来实现。
entry point是incoming Transition的终点,以及composite state内部Transition的起点。该composite state的entry state在incoming Transition的effect Behavior和outgoing Transition的effect Behavior之间。
exit point和entry point相反,

14.2.3.4.7 Submachine States and submachines

子状态机是状态机规约能够被屡次复用的一个手段。它与被封装的组合状态相似,也须要把
incoming/outgoing Transitions与其内部的顶点进行绑定。然而,被封装的组合状态和它的内部元素是定
义在所属的状态机内的,而子状态机就像编程语言中的宏,是不一样的行为规约,可能定义在不是所使用的上下文中。所以,它须要更加复杂的绑定。这经过子状态机状态 (即,isSubmachineSate=true的状态)的概念来完成,它表明了对相应的状态机的引用。链接点引用的概念用于支持子状态机状态与所引用的状态机之间的绑定。链接点引用表明了子状态机状态上的一个点,转变能够在此incoming/outgoing。每一个链接点引用与所引用的状态机的相应Entry/Exit Point 相匹配。这为子状态机调用和它的规约之间提供了一个必需的绑定机制。
子状态机状态暗示了把相应的状态机规约像宏同样插入.所以,语义上等同一个组合状态。被引用的状态机的区域是该组合状态的区域。入口、离开和effect行为以及内部的转变都包含 在此子状态机状态中。
注意
每一个子状态机状态都表明了一个子状态机的不一样的实例化,即便是两个或更多子状态机 状态引用相同的状态机。
被引用的状态机经过经过它的(initial) Pseudostate 或它的entry point来进入。经过初始伪状态进入与通常的组合状态相同。入口点与junction伪状态(在组合状态是正交时是fork)等价:经过入口点进入意味着组合状态的入口行为被执行,跟着的是从入口点到组合状态中目标顶点 的转变。为使规约是良构的,与入口点转变关联的guards必须为真。

相似的,被引用的状态机能够做为以下的结果而被离开:

  • 到达了它的FinalState,

  • 源自子状态机状态的Transition的触发,

  • 经过它的任离开点。

14.2.3.5 ConnectionPointReference

上面指出,链接点引用表明了对被该子状态机状态所引用的状态机中定义的入口/离开点的使用。子状态机状态的链接点引用能够用做转变的源/目的。它们表明了进入或离开由该子状态机状态所引用的状态机。
entry point ConnectionPointReference 做为Transition的target表明经过相应的entry point伪状态进入被引用状态机的Region

14.2.3.6 FinalState

  FinalState是Psuedostate的一种,表明所在Region的完成。

  • 表明one of orthogonal Regions完成了

  • 表明top level Region完成,也就是整个状态机结束

14.2.3.7 Pseudostate and PseudostateKind

  • initial:
    表明Region的起点,是Regsion隐式激活后执行的起点。

  1. 一个Region只能有一个initial

  2. 一个initial只能链接一个Transition

  3. Transition不能有guard和trigger,能够有effect Behavior

  • deepHistory
    History表明一个变量,它表明了所属Region中最近active state configuration,终结在此类伪状态上的Transition意味着恢复Region到以前的相同state configuration,可是 进入状态的全部语义都要执行.在所复原的state configuration中 全部状态的Entry Behavior都要按顺序执行,最外层的先执行。深历史伪状态只能被定义在composite state上,而且一个Region中最多只能有一个这样的伪状态。

  • shallowHistory
    该类伪状态是一种变量,它表明了所属Region最近的活跃子状态,而不是那个子状态的子状态。终结在这个伪状态上的Transition意味着将Region复原到那个子状态并执行全部进入一个状态的语义。能够今后伪状态定义一个outgoing的Transition使其终结在组合状态的一个子状态上。这个子状态就是该组合状态的缺省浅历史状态。浅历史伪状态只能定义在composite state上,而且每一个Region最多只能有一个这样的伪状态。

  • join
    将从多个orthogonal region合并来的Transition合并为一个Vertex.

  1. 链接到join的Transition没有guard和trigger

  2. 和junction相似,这里有一个同步的功能
    其中全部的到来Transition都必须完成才能继续执行一个outgoing的Transition

  • fork
    将一条incoming的Transition划分为两条或更多终结到正交区域中顶点的Transition。从fork伪状 态outgoing的转变不能有guard或trigger。

  • junction
    此类伪状态用于把多条转变链接到状态之间的复合路径上。举个例子,一个junction伪状态能够用于把多个到来的转变合并到一个单一的流出转变来表明一个共享 的通讯路径。或者,它能够用于将一条到来的转变划分为具备不一样guard约束的流出转 变。

注意. 这些guard约束的计算在包含该伪状态的复合转变执行以前执行,这也是为何它 们被称为静态条件分支的缘由。 对于特定的复合转变,可能出现转变路径的配置和guard值致使复合转变不能达到一个有效的状态配置。这种状况下,整个复合转变被禁止即便它的触发器是使能的(做为避免 出现此类状况的一种手段,能够在至多一条流出转变上附加一个指示为“else”的预约 义guard。若是其它转变的全部guards为假,那么这条转变变为使能)。若是有多余一个的guard为真,只选择一个,选择算法没有定义。

  • choice
    此类伪状态与junction相似,不一样在于它的全部流出转变上的guard约束是动态计算的,在复合转变到达这个伪状态时才计算.所以,choice用于实现动态的条件分 支。它容许把复合转变划分为多条可选的路径,对路径的选择决策依赖于到达该选择点以前相同复合转变上执行的行为的结果。若是多于一个guard计算为真,其中一个转变被选择,选择算法没有被定义。若是没有guards计算为真,那么模型被认为是错误的。为了不错误,推荐为每个choice伪状态定义一个带有“else”预约义guard的流出转变。

  • entryPoint
    一个状态机或composite state的entryPoint提供了封装状态和状态机内部细节的机制.

  • exitPoint
    一个状态机或composite state的exitPoint提供了封装状态和状态机内部细节的机制。终结在任意Region内的一个exitPoint的Transition意味着离开这个组合状态或子状态机状态(执行与之关联的exit行为).若是来自正交区域的多条转变终结在这个伪状态上, 那么它充当一个join伪状态

  • terminate
    进入一个terminate伪状态意味着状态机的执行当即终止。状态机不须要离开任何状态也不须要执行任何exit行为。正在执行的全部doAcitivity行为都被终止。进入一 个terminate伪状态等同于调用一个DestroyObjectAction。

14.2.3.8 Transition

Transition是一个有向弧,从源Vertex开始,终止于目标Vertex(源Vertex和目标Vertex可能相同)。而且拥有关联的effect Behavior,当Transition被遍历时,该effect Behavior开始执行。

NOTE Transition遍历的时间不肯定,容许不一样解释器给予不一样解释(包括指定时间为0,或非0)。

Transition被执行做为Compond Transition的一部分。一个Compond Transition表明StateMachine从一个稳定的state configuration迁移到另外一个state configuration.compund Transition的语义描述以下:

在一个执行过程当中,Transition实例可能处于如下三个状态:

  • reached, 当状态机的执行到达源Vertex

  • traversed, 当它正在执行时(包括与之关联的effect Behavior)

  • completed, 在状态机执行到目标Vertex以后

一个Transition拥有多个触发器,每一个触发器指定事件属性。当该事件发生后,Transition相应的触发器就变为使能。当一个Transition定义了多个触发器,它们是逻辑析取(当它们中任何一个使能,Transition均可能开始执行)

14.2.3.8.1 Transition类型

Transition的语义由它的源Vertex决定,主要有三类:

  • kind=external ,

相关文章
相关标签/搜索