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

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

在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绘制一个主动类或主动对象时,要遵循如下策略:

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

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

  1. Python高级系列教程:Python的进程和线程

    学习目标 1.了解多任务的概念 2.了解进程的概念以及多进程的作用 3.掌握多进程完成多任务的工作原理及案例编写 4.掌握进程编号的获取方式以及进程使用的注意事项 5.了解线程的概念以及多线程的作用 ...

  2. UML系列文章(22)高级行为---状态机

    本章内容: 状态.转移和活动 为对象的生命周期建模 创建结构良好的算法 使用交互,可以对共同工作的对象群体的行为建模.使用状态机,可以对单个对象的行为建模.状态机是一个行为,它说明对象在它的生命周期中 ...

  3. UML系列文章(6)---公共机制

    入门 有时在原有基础上增加一些定制特色,比如说明新特性等.需要额外的注解, 衍型.标记值和约束时UML提供的用以增加新的构造块,创建新的特性和说明新的语义的机制.如, 2.术语和概念 注解(note) ...

  4. UML系列文章(15)---构件

    构件是系统中逻辑的并且可替换的部分,它遵循并提供一组接口的实现. 好的构件用定义良好的接口来定义灵活的抽象,这样就可能容易地用新的兼容构件代替旧的构件. 接口是连接逻辑模型和设计模型的桥梁.例如,可以 ...

  5. UML系列文章(18)基本行为---用况图

    UML中的用况图是对系统的动态方面建模的5种图之一(另外4种是活动图.状态图.顺序图.通信图).用况图是对系统.子系统或类的行为进行建模的核心.每张图都显示一组用况.参与者以及它们之间的关系. 在UM ...

  6. chatgpt系列文章-23.2.15(主要还在发现chatgpt的不足,偏探索,像报告)

    Will ChatGPT get you caught? Rethinking of Plagiarism Detection 推荐指数:2 主要内容 文章主要是研究chatgpt出现后,在学术界中可 ...

  7. UML系列文章(31)体系结构建模---部署图

    本章内容 对嵌入式系统建模 对客户.服务器系统建模 对全分布式系统建模 正向工程和逆向工程 部署图是用来对面向对象系统的物理方面建模的两种图之一.部署图展示运行时处理的结点和在结点上生存的制品的配置. ...

  8. UML系列文章(14)---对象图

    在UML中可以使用类图来可视化系统构造块的静态方面.还可以使用交互图来可视化系统的动态方面,交互图由构造块的实例和在它们之间分发的消息组成.对象图包含一组类图中事物的实例.因此,对象图表达了交互的静态 ...

  9. UML系列文章(19)基本行为---交互图

    顺序图和通信图(均是交互图)是UML中用于对系统的动态方面进行建模的5种图中的两种.交互图表现的是一个交互,由一组对象和它们之间的关系组成,包括它们之间可能传递的消息.顺序图是强调消息时间顺序的交互图 ...

最新文章

  1. RADAR和LIDAR区别分析
  2. java中普通类、抽象类、接口的区别?
  3. 5.6 SMO-机器学习笔记-斯坦福吴恩达教授
  4. DCMTK:checkStringValue()方法的测试程序
  5. What is Proguard?
  6. Linphone编译【转载】
  7. 关于提高社交网站SNS竞争力的分析
  8. pycharm-实用教程和每日练习
  9. sftp日志文件定时下载到本地文件 python 3
  10. 【观点】失败应聘的五大原因
  11. django 搭建上传文件系统——细说Form Validation(二)
  12. win10:为U盘设计图标
  13. 【hadoop】 3007-hadoop的提交job的源码分析
  14. 十进制与二进制转换(负数+正数)
  15. hue-登录相关-简
  16. 无稳态多谐震荡器学习
  17. LTE IPV6地址配置
  18. 使用Iframe嵌套其他系统页面遇到的跨域问题
  19. 思科交换机实现管理口访问设置+远程登录(一)
  20. Satellite-derived land surface temperature: Current status and perspectives卫星衍生的地表温度

热门文章

  1. 想创业,就别输不起!--leo看赢在中国第三季(7)
  2. Python中用于判断两个集合的交集是否为空集isdisjoint()方法
  3. matplotlib三维画图之观察博弈论混合策略下纳什均衡点
  4. JSON.stringify详解
  5. python提取前几行数据_python读取文件的前几行
  6. ADAS测试设备—惯性导航系统简介
  7. Content-Type是什么?
  8. Microbiome:环境过滤驱动农田生态系统土壤古菌独特的空间分布
  9. 中国学校需要考虑的 7个主要险种
  10. 安徽科技学院 信网学院网络文化节 曾伟