UML系列文章(23)高级行为---进程和线程

  • 主动对象、进程和线程
  • 对多控制流建模
  • 对进程间通信建模
  • 建立线程安全的抽象

现实世界不仅是一个严厉无情的地方,而且还是一个非常忙碌的地方。一些事件和事情都在同一时间发生。因此,当对现实世界的系统建模时,必须考虑它的进程视图,包括形成系统的并发与同步机制的线程和进程。

在UML中,可以将每个独立的控制流建模为一个主动对象,它代表一个能够启动控制活动的进程或线程。进程是一个能与其他进程并发执行的重量级的流;而线程是一个能与同一进程中的其他线程并发执行的轻量级的流。

建立抽象,使它们在多控制流同时存在的情况下安全地工作,这是困难的。特别是,不得不考虑比顺序系统更复杂的通信和同步方法。还得非常小心,对进程视图的工程化程度既不能过度(太多的并发流会使系统产生颠簸),也不能过低(并发不足则不能优化系统的吞吐量)。

1. 入门

在UML中,每个独立的控制流被建模为一个主动对象。主动对象是一个可以启动控制活动的进程或线程。像所有的对象一样,主动对象是类的一个实例,在这种情况下,它是主动类的实例,同样也像所有的对象一样,主动对象通过传送消息进行互相之间的通信然而在这里,消息的传送必须扩充某些并发语义,以帮助同步相互独立的流之间的交互。

UML提供了对主动类的图形化表示,如图所示,主动类是类的一种,所以具有类的所有通常部分,包括类目、数学和操作。主动类经常接收信号,通常把这些信号列在一个附加栏中。

2. 术语和概念

    主动对象(Active object)是拥有进程或线程,并能够启动控制活动的对象。主动类(Active class)是其实例为主动对象的类。进程(process)是能同其他的进程并发执行的重量级的流;而线程(Thread)是能与同一进程中的其他线程并发执行的轻量级的流。在图形上,主动类用一个左右边为双线的矩形表示。进程和线程用衍化的主动类来表示(而且也在交互图中作为一个序列出现) 。

2.1 控制流

就是一个线程的执行轨迹。

在一个并发系统中,存在多个控制流---也就是说,在一个时间有多件事情发生。在一个并发系统中,有多个同时发生的控制流,每个控制流都以一个独立的进程或线程的头部为根。如果在并发系统运行时给它拍一个快照,在逻辑上,将看到多个执行点。

    在UML中,用主动类来表示进程或线程。进程或线程是一个独立的控制流的根,并且与所有同样的控制流并发。

    可以用下面三种方法之一获得真正的并发:

  • 把主动对象分布到多个结点上;
  • 把主动对象放在多个处理器的结点上;
  • 以上两种方法的结合

2.2  类和事件

        主动类依然是类,尽管它具有很特殊的性质。一个主动类表示一个独立的控制流,而普通的类不能体现这样的流。与主动类相比,普通类隐含地被称作被动的,因为它们不能独立的启动控制活动。

    主动类用于对进程或线程的公共家族建模。在技术术语中,这意味着一个主动对象将一个进程或线程具体化。通过用主动对象对并发系统进行建模,就为每个独立的控制流起了一个名字。当创建一个主动对象时,其相关的控制流被启动;当撤销这个主动对象时,其相关的控制流就被终止。

    主动类拥有与所有其他类相同的特性。主动类可以有实例;主动类可以有属性和操作;主动类也可以参与到依赖、泛化和关联(包括聚合)关系中;主动类可以使用UML的任何扩展机制,包括衍型、标志值和约束;主动类可以是接口的实现;主动类可以由协作实现,它的行为可以用状态机来说明;主动类还可以参与协作。

    被动对象和主动对象均可以发送和接收信号事件及调用事件。主动类的使用是可选的。实际上它对语义没有增加什么。

2.3 通信

    当对象相互协作时,它们通过从一个对象向另一个对象发送消息来进行交互。在一个既有主动对象又有被动对象的系统中,有四种必须考虑的可能的交互组合。

  • 被动对象-》被动对象
  • 被动对象-》主动对象
  • 主动对象-》主动对象

在UML中,用实心箭头来表示同步消息,用枝状箭头来表示异步消息,

 

  • 主动对象-》被动对象

2.4 同步

    想象一下交织穿梭于一个并发系统的多个控制流。当一个流通过一个操作时,就说在给定的时刻控制焦点在这个操作中。如果这个操作是为某些类定义的,那也可以说在给定的时刻控制焦点在这个类的一个特定实例中。在一个操作中可以有多个控制流(因而在一个对象中也是如此),并且在不同的操作中也可以有不同的控制流(但仍导致一个对象中有多个控制流)。

    当同一时间在一个对象中有多个控制流时,就出现了问题。如果不小心,可能有一个以上的流来修改同一属性,破坏对象的状态或丢失信息。这是典型的相互排斥问题。对这个问题处理的失败可能会产生各种竞争条件和冲突,导致并发系统以一种神秘的而不可再现的方式失败。

    解决这个问题的关键是逐个进行对临界对象的存取。有三种可供选择的方法。每一种方法都包括向类中所定义的操作附加某些同步特性。在UML中,可以对三种方法建模。

1)顺序的(sequential)。

调用者必须在对象外部进行协调,使得在一个时刻对象中只有一个流。当有多个控制流出现时,就无法保证对象的语义和完整性。

2)监护的(guarded)

    当有多个控制流出现时,该对象的语义和完整性是通过把所有对受监护的对象操作的调用顺序化来保证的。其效果是,在一个时刻对象恰好只有一个操作能够执行,使之简化为顺序的语义。需要设计好,否则有死锁的危险。

3)并发的(concurrent)。当有多个控制流出现时,该对象的语义和完整性得到保证是因为多个控制流存取不相交的数据集合,或者只读取数据。可以通过仔细设计的规则来安排这种情况。

 

3. 常用建模技术

3.1 对多控制流建模

 

3.2 对进程间通信建模

4. 提示和技巧

 一个结构良好的主动类和主动对象,应满足如下要求:

  • 表现一个独立的控制流,该控制流最大限度的挖掘了系统中真正并发的潜力。
  • 粒度不要过细,否则需要大量的其他主动元素,从而导致一个设计过度的、脆弱的进程体系机构。
  • 仔细地处理对等的主动元素之间的通信,在异步和同步的消息传送之间做出选择。
  • 仔细地将每个对象处理为一个临界区域,使用合适的同步特性,以便在出现多控制流时能维持它的语义。

用UML绘制一个主动类或主动对象时,要遵循如下策略:

  • 如果建模工具允许,只显示那些对理解其语境中的抽象是重要的属性、操作和信号,通过对过滤能力隐藏其他信息。
  • 显式地表示所有操作的同步特性。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值