You are on page 1of 54

目录

1 引言....................................................................................................................................... 1
2 CPN 建模语言 ....................................................................................................................... 3
2.1 网结构、声明、标注 ................................................................................................ 3
2.2 变迁的使能与发生 .................................................................................................... 6
2.3 步骤、并发和冲突 .................................................................................................... 9
2.4 模块.......................................................................................................................... 11
2.5 时间建模.................................................................................................................. 15
3 CPN 模型的构建 ................................................................................................................. 20
3.1 GUI 概述................................................................................................................... 20
3.2 模型元素的构建 ...................................................................................................... 21
3.3 层次模型构建 .......................................................................................................... 23
3.4 语法检查和代码生成 .............................................................................................. 25
3.5 图形化反馈与帮助 .................................................................................................. 25
4 模拟..................................................................................................................................... 26
5. 状态空间分析.................................................................................................................... 30
5.1 为状态空间分析改进模型 ...................................................................................... 30
5.2 完全状态空间 .......................................................................................................... 31
5.3 状态空间报告 .......................................................................................................... 33
5.4 查询函数.................................................................................................................. 37
6 性能分析............................................................................................................................. 38
6.1 性能分析的赋时模型 .............................................................................................. 38
6.2 性能测量和数据收集 .............................................................................................. 40
6.3 统计.......................................................................................................................... 42
6.4 性能输出.................................................................................................................. 44
6.5 进行模拟实验 .......................................................................................................... 46
6.6 模型参数及对比配置 .............................................................................................. 47
7 可视化................................................................................................................................. 47
7.1 消息序列图.............................................................................................................. 48
7.2 交互图形.................................................................................................................. 49
8 结论..................................................................................................................................... 50
鸣谢......................................................................................................................................... 51
参考文献................................................................................................................................. 51

1
用于并发系统建模和验证的
着色 Petri 网及其工具软件 CPN Tools
Kurt Jensen, Lars Michael Kristensen, Lisa Wells
Department of Computer Science
University of Aarhus
IT-Parken, Aabogade 34, DK-8200 Aarhus N, DENMARK
e-mail: {kjensen,lmkristensen,wells}@daimi.au.dk

摘要:着色Petri网(CPNs)是一个用于建模和验证系统的语言,在这些系统中并发性、交互性
和同步性扮演着主要角色。着色Petri网是一种把Petri网与功能编程语言Standard ML结合起来的
离散事件建模语言。Petri网为建模提供图形注释以及并发性、交互性、和同步性的基本的原语基
础。Standard ML为数据类型定义、数据操作描述、创建紧凑的可参数化的模型提供基本原语。
一个系统的CPN模型是一个代表着系统状态和事件(变迁)的可执行模型,事件可导致系统改变
状态。CPN语言使一组模块来构件一个模型成为可能,这里面包括一种时间概念,这种时间概念
又使在被建模的系统中,表示处理事件所花费的时间成为可能。
CPN Tools,是一个为构建和分析CPN模型的工业价值的计算机工具。使用CPN Tools,可以
实现用模拟的方法调查被建模的系统的行为,借助状态空间方法和模型检查来验证性能,进行基
于模拟的性能分析。用户与CPN Tools交互,是基于对采用交互技术的图形表示的CPN模型的直
接操纵,如工具面板和(状态)标记菜单。工具的功能可以通过用户定义的Standard ML功能来
扩展。 CPN Tools的许可证可以免费得到,也用于商业用途。
关键词:着色Petri网,行为建模,确认,模拟,验证,状态空间方法,模型检查,性能分析,可
视化。

1 引言

系统工程是一门综合性学科,涉及各式各样的活动,例如需求工程、设计、规范化、实现、
测试与部署。开发分布式系统是特别具有挑战性的,主要原因是这些系统具备并发性和非确定性,
即此种系统的执行有许多不同的方式。这是极其容易使设计师在设计这种系统时错过一些重要的
交互模式,并导致在系统设计中出现功能偏差或错误。为了应对现代并行系统复杂性,提供能在
实现和部署之前,进行系统设计中中央部分的调试和测试的方法至关重要。
其中一个开发并行系统的富有挑战性的方法,就是要建立一个可执行的系统模型。构建模型
并模拟,通常可以使一些新见解被纳入系统设计和运行中,而且往往会导致一个更简单和更精简
的设计的产生。此外,构建一个可执行的模型通常会产生一个更完整的系统规范,便于场景的系
统化调查,这可显著降低设计中错误的数量。
着色Petri网(CP-nets或CPNs)[16,17,19,24] 是一种图形语言,用于为并发系统构建
模型,并分析其性能。CP-nets 是一个与Petri网[30]结合的离散事件建模语言,其功能性编程语
言CPN ML是基于Standard ML [33,34]的。CPN建模语言是一种通用建模语言,即它不是着重于
为特殊类型系统建模,而是旨在实现一个广泛类型的并发系统的建模。典型的CP-nets应用领域
包括通信协议[5],数据网[4],分布式算法[31],及嵌入式系统。然而,CP-nets也适用于更广泛
地以并发性和交互性为主要特点的系统建模。这类系统的例子有商业流程与工作流建模〔36〕,
制造系统[11]和代理系统。在不同工业领域的CPN应用的例子可以通过[12] 得到。文献[19,25]

1
给出了实际使用CP-nets的入门性介绍。
一个系统的CPN模型阐述了系统的状态和导致系统改变状态的事件(变迁)。通过CPN模型
的模拟,可以研究系统的不同场景,并探讨系统的行为特性。通常情况下,模拟的目的是调试和
研究系统的设计问题。CP-nets可以被交互的或自动的模拟。交互式模拟类似与单步调试。它提
供了一种方式,以“单步通过”(walk through)CPN模型,调查不同的场景并且检查模型是否
达到预期的效果。在一个交互的模拟过程中,建模人员通过在当前状态下使能的事件中做出选择
控制,并决定下一步该怎么做。可以在图形上直接观察CPN模型的单步运行效果。自动模拟则类
似于程序执行。目的是为了尽可能快地对模型进行模拟,其典型应用就是对模型进行测试和性能
分析。为了测试,建模人员通常设立适当的断点和停止运行的条件。为了进行性能分析,模型需
要有数据收集器,来搜集与系统的性能有关的信息。
在大量的并行系统中时间起着着重要作用。有些系统的正确运作关键取决于某些活动所占用
的时间,而且不同的设计决策都对系统的性能产生重大的影响。CP-nets包括一个时间概念,使
之能够捕捉在系统中执行活动所花费的时间。该时间概念也意味着CP-nets,可用于为基于模拟
技术的性能分析,研究影响系统性能的度量指标,如系统中的延迟、吞吐量、和队列长度,也可
以用于实时系统建模和验证。
CPN模型可以构造一系列模块来处理大规格的系统规范。这些模块通过一套定义完善的接口
相互交互,并用类似编程的方法来进行组织。CP-nets的模块概念是基于一个分层结构机制,允
许每一个模块有子模块,而且可以用一组模块来组成新的模块。
可视化是一项技术,该技术利用高层次的图形来生动的刻画CPN模型的行为,而且它与模拟
CPN模型密切相关。一个可视化的重要的应用是,它允许用应用领域的概念展示设计思路和分析
结果。这一点在与一般对CP-nets不熟悉的人和同事讨论时尤为重要。在CPN模型的顶层增加特
定领域图形的方法有许多,可用于在应用领域内从理论上展示CPN模型的执行。其中一个例子是
利用消息序列图(时间序列图)[7]在通信协议的执行中显示交换消息。
CPN模型是形式化的-本质上来说,CPN建模语言中有其语法和语义的数学定义。这意味着他
们可以用来验证系统特性,即证明某些需要的属性可以达到,或某些不需要的属性保证不会出现。
检查系统的特性是由一系列状态空间方法支持的。基础状态空间的基本思路是计算所有可能达到
的状态和有关CPN模型状态的变化,并以一个有向图表示这些变化,图中节点代表的状态,弧代
表发生的事件。状态空间可以完全自动构造。通过一个构造的状态空间回答一个系列与系统行为
有关的检查问题是有可能的,如有无死锁。即是否总是可以达到某种给定的状态,并保证提供某
项服务的可能性。CP-nets的状态空间方法也可应用于赋时的CP-nets。因此,它也可以通过赋时
CP-nets建模来验证系统功能的正确性。
应该强调指出的,为CP-nets以及他们支持的计算机工具的实际使用,需要对CPN建模语言
的语法和语义有一个直观的了解,这有点类似于普通的编程语言,如JAVA,可以被不熟悉这种
语言的形式化定义的编程人员所成功的应用。这里强调了一个重要的特性,那就是CP-nets可以
不用研究相关的正式定义就可以被教授和学习。
CPN建模和分析的实际应用,必须依赖于支持创建并操作模型的电脑辅助工具的存在。CPN
Tools[10]是一个关于CPN模型的编辑、模拟、状态空间分析和特性分析的工具套件。它是现在在
100多个不同的国家有4000多个经过许可的用户,并可用于MS Windows和Linux操作系统。CPN
Tools的用户直接工作于图形表示的CPN模型。CPN Tools的图形用户界面(GUI)没有传统菜单
栏和下拉式菜单,但是基于交互技术,如工具面板(tool palettes)和状态菜单(marking menus)。
CPN Tools的许可证可通过CPN Tools的网页免费获得[10]。
本文简要介绍了CPN建模语言和如何使用CPN Tools中支持的构建、模拟、状态空间分析、
性能分析,和可视化的说明。第2节介绍CPN建模语言的概念。第3节说明如何建造CPN Tools支
持的CPN模型。第4节显示模拟是如何被支持的。第5节给出了状态空间方法的简要的介绍,并说

2
明了他们在CPN Tools中是如何被支持的。第6节介绍了基于模拟的性能分析的基本思想,并说明
它是如何被CPN Tools支持的。第7节说明CPN Tools是如何支持领域可视化的。最后,第8节总
结本文并提供参考文献,以进一步对CPN建模语言、实例分析、和CPN Tools的使用进行学习。
读者指南
没有必要阅读完整篇文章或熟悉Standard ML后才开始使用CP-nets和CPN Tools。如果只是
了解基本内容,阅读以下的内容就足够了:CP-nets的非层次概念的介绍(Sects. 2.1-2.3),CPN
Tools和构造非等级模型的工具的介绍(Sects. 3.1-3.2 and 3.4-3.5),如何模拟CP-nets模型(Sect.
4)。关于CPN ML的基本介绍和一些实例,以及如何使用CPN ML,都可以在CPN Tools的帮助页
面查找(也可以通过网上查找[10])。
对于熟悉基本的CP-nets和CPN Tools的读者,文章中其余的章节的是目前较高级的课题。分
层的CP-nets在2.4节中介绍。以及构建层次模型工具在3.3节介绍。如果读者对性能分析感兴趣,
就应该阅读关于赋时的CP-nets的介绍(第2.5节)。第6节是关于性能分析的。状态空间分析和
可视化分别在第5节和第7节中介绍。不需要为了使用性能、状态空间和可视化设备的基本特征
而对Standard ML有一个良好的认识。但是,要想对这些设施更先进的功能进行有效的使用,就
必须要了解Standard ML。又比如,帮助页面提供了相当多的例子,并且说明了Standard ML是
如何被用于支持高级分析技术。

2 CPN 建模语言

在本节中我们通过一个小例子介绍了CPN建模语言,模型是对通信协议的建模。我们使用一
个简单的协议,因为它容易解释和理解,而且因为它涉及到并发性、不确定性、通信和同步,这
是并发系统的关键特点。协议本身不复杂,但对于说明CPN模型语言的构建是足够的。读者不需
要对协议的相关知识有一定的基础。
简单的协议包括一个发送器(sender),传输若干的数据包(data packets)到一个接收器
(receiver)。通信发生在一个不可靠的网络,即数据包可能会丢失而且超越也是可能的。协议
利用序列号、确认和重传技术以确保数据包被准确传输,并且没有重复传输,而且在传输结束后
数据包的顺序是正确的。该协议使用“停止-并-等待”策略,即,相同的数据包的传输直到收到
相应确认。被传输的数据包中包括一个序列号及数据(有效载荷)。确认包括一个序列号,用于
指明接收器期望的下一个数据包的编号。

2.1 网结构、声明、标注

一个CPN模型通常是像绘制图形一样被创建出来,图1展示了协议的基本CPN模型。左面的
部分为发送器建模,中间部分为网络建模,右边的部分为接收器建模。该CPN模型包含了8个库
所(places)(形状和圆一样),5个变迁(transitions)(形状为矩形盒),还有一些直接连接
库所和变迁的弧(arcs),最后是一些靠近库所、变迁、弧的标注(inscriptions)。这些标注在
CPN ML编程语言中有记录,它是Standard ML语言的扩展。库所和变迁被称为节点(nodes)。
与直接弧一起,他们构成了网结构(net structure)。一个弧总是把一个库所连接到一个变迁或
把一个变迁连接到一个库所。在两个同类的节点间是不允许有弧的,即在两个库所间或两个变迁
间都不允许有弧。
建模系统的状态是由库所代表的。每个库所都可以被一个或一个以上令牌(tokens)标识,
而且每个令牌自身都附有一个数据值,这个数据值是所谓的令牌颜色(token colour)。在每一个
单独的库所里的令牌数量和令牌颜色合起来,构成了系统的状态(marking)。在一个特定库所

3
上的令牌数构成了那个库所的状态。按照惯例,我们在椭圆形内写库所的名字。这些名字本身没
有规范的意义-但他们对CPN模型的可读性具有重要实际意义(就像在传统的编程中使用助记符
一样)。发送器(Sender)的状态是由两个库所PacketsToSend和NextSend 建模的。接收器
(Receiver)的状态是由两个库所DataReceived和NextRec建模的,而网络的状态是由库所A、B、
C和D建模的。

在每一个库所附近,都有一个标注决定了在此库所的令牌允许使用的令牌颜色集(数据值)。
一个可能的令牌颜色集是由一个类型(如已知的编程语言的类型)指定的,它被称库所的颜色集。
按照惯例,颜色集是写在库所下面的。库所NextSend,NextRec,C和D有颜色集NO。在CPN Tools
中,颜色集是使用CPN ML关键字colset定义的,并且颜色集NO被定义和整数类型等价:
int:
colset NO = int;
这意味着在四个库所NextSend、NextRec、C和D将有一个整数作为他们的令牌颜色。颜色集NO
被用来为建模协议中的序列号。在工具中,整数类型的大小,将取决于编写这种工具的编程语言。
例如,在CPN Tools中int 类型是31位整数。库所DataReceived 的颜色集 DATA 被定义为包含
所有的文本内容的字符串。颜色集DATA是用来为数据包的有效载荷建模的。其余的3个库所有颜
色集NOxDATA,它定义为NO 的类型和DATA的积。该类型包含所有第一个要素是一个整数而且
第二个要素是一个文本串的两元组。元组用是逗号分割的列表加括号(和)书写的。颜色集
NOxDATA是用来为数据包建模的,这些数据包包括一些顺序号和一些数据。颜色集的定义如下:
colset DATA = string;
colset NOxDATA = product NO * DATA;
每一个库所旁边,我们看到另一个标注,该标注决定这个库所的初始状态(initial marking)。
最初的原始库所的状态,按照惯例都是写在库所的上面的。举例来说,在库所NextSend右上方
的标注标明库所的原始状态是由一个有带颜色(值)的1个令牌构成的。这表明,我们希望数据
包1作为第一个被传送的数据包。类似地,库所NextRec也有一个初始的状态,它包括一个带有
颜色1的单一令牌。这表明接收器最开始期望接受标号为1 的数据包。库所DataReceived 有一
个初始的状态,这个状态包括一个带有颜色””牌(这是空的文本串)。这标志着该接收器还没有

4
开始接受任何数据。在库所PacketsToSend 左上方的Allpackets标注是一个常量,定义为:
val AllPackets = 1’(1,"COL") ++ 1’(2,"OUR") ++
1’(3,"ED ") ++ 1’(4,"PET") ++
1’(5,"RI ") ++ 1’(6,"NET");
这里指明,这个库所的初始状态有以下数据值的令牌:
(1,"COL"),(2,"OUR"),(3,"ED "),(4,"PET"),(5,"RI "),(6,"NET")。
该++与’运算符,这允许构成包括令牌颜色的多态集。多态集类似于集合,只不过值可以出
现不止一次。该中缀运算符' 左边要求正整数以指明右边的参数提供的元素出现的次数。该++
需要两个多态集作为参数,并且返回他们的并集(和)。PacketsToSend的最初状态有6个令牌,
代表我们希望传送的数据包。没有标注指明的初始状态意味着库所最初没有令牌。库所A,B,C,
D的就是这种情况。
每一个库所的当前状态(current marking)都紧靠库所。在当前状态中库所上令牌的数量都
在小圆圈中显示出来了。在最初时,当前状态等价于初始状态,表示为M0。就像前面解释的,
初始状态在PacketsToSend上有6个令牌,而且在库所NextSend、NextRec和 DataReceived每个
上有一个令牌。
5个变迁代表可以在系统中发生的事件。如库所一样,我们在长方形里写下变迁的名字。变
迁的名字也没有规范的含义,但他们对该模型的可读性都非常重要。当一个变迁发生(occurs)
时,它从其输入库所(input places)(那些有指向变迁的弧的库所)中去除令牌,而且它向其输
出库所(output places)(那些有一个来自变迁的弧的库所)中增加令牌。当变迁发生时从输入
库所移走,到输出库所增加的令牌的颜色值由弧表达式(arc expressions)决定。这些弧表达式
就是靠近单个弧的文本标注。一个变迁和库所之间也可以用双箭头弧(double-headed arcs)连接。
双箭头弧的是两个在一个库所和和一个变迁之间的相反的方向有向弧的简记形式,并且该库所和
变迁之间的弧有相同的弧表达式。这意味着库所对于变迁来说,既是输入弧也是输出弧。变迁
SendPacket和库所PacketsToSend和NextSend都通过双箭头弧连接。

弧表达式可以在CPN ML编程语言里写出,并从确定类型的变量、常量、运算符和函数构建。
当在一个表达式中的所有变量可以给定值时(正确类型的),表达式的值可以计算出来。一个弧
表达式可以由一个令牌颜色的多态集赋值。作为一个例子,考虑连接在变迁SendPacket 上的3
个弧上的2个弧表达式:n和(n,d)。他们包含的变量n和d的声明如下:
var n : NO;
var d : DATA;
这意味着n必须捆绑到一个NO类型的值上(即一个整数),而d必须绑定到DATA类型的值上
(即一个文本串)。例如,我们考虑绑定:
<n=3, d="CPN">
把n赋值为3,d赋值为“CPN”。这样把弧表达式赋成下面的数值,这里“→”应该被理解为“值
为”:
n → 1’3
(n,d) → 1’(3,"CPN")
弧表达式赋值为令牌颜色的多态集,这意味着有可能没有或者只有一个或者一个以上的令牌
被从输入库所中删除或是被添加到一个输出库所里。如果一个弧表达式值为一个令牌,那么这个
1 ' ,通常来说可从表达式中略去。举例来说,弧表达式n和(n,d)项的就是1' n 和1 '(n,d)
的简记形式。

5
2.2 变迁的使能与发生

下面我们考虑一下在一个CPN模型中事件的发生。在一个变迁的输入弧(input arcs)(那些
从一个库所到一个变迁的弧)上的弧表达式,与输入库所上的令牌一起决定该变迁是否使能
(enabled),即能在一个给定的状态中发生。为了使一个变迁使能,它就必须找到一个出现在
变迁周围的弧表达式的变量绑定,使得每一个输入弧的弧表达式是一个可求的值的对应于输入库
所的令牌颜色的多态集。当一个给定绑定的变迁发生时,它将从每个输入库所中移走对应输入弧
指定的令牌颜色的多态集。类似地,它增加到每个输出弧(output arc)上对应输出弧上指定的
令牌颜色的多态集。
现在我们考虑一下变迁SendPacket。在图1中,变迁SendPacket有一个厚厚的边界线,而其
他四个变迁没有。在CPN Tools,这表明SendPacket是在状态 M0中唯一一个有使能绑定的变迁。
其他变迁禁止,即他们不能发生。当这个变迁发生时,它可以从每一个输入库所NextSend和
PacketsToSend中去掉一个令牌。这两个双箭头的弧的弧表达式是n和(n,d)。
库所NextSend最初的状态包含一个单独的令牌与颜色1 。这意味着,该变量n必须绑定为1 。
否则,来自NextSend的弧上的表达式将得到一个不出现在NextSend中的令牌颜色,这意味着变
迁对于那个绑定来说是禁用。现在让我们考虑来自PacketsToSend的弧表达式(n,d)。我们已
将n绑定为1 ,现在看一下d的绑定,使得弧表达式(n,d)绑定为这6个令牌颜色中的一个,并
且这个令牌颜色出现在PacketsToSend上。很明显,唯一的可能是,把d的赋值为字符串"COL"。
因此,我们推测绑定:
<n=1, d="COL">

是SendPacket唯一的使能绑定(在初始状态)。带有这个绑定的SendPacket的发生将从输入库
所NextSend中删除颜色为1的令牌,并且从输入库所PacketsToSend 中删除带有颜色(1,
“COL”)
的令牌。因为SendPacket是通过双向弧与PacketsToSend和NextSend连接的,带有这些绑定的
SendPacket的发生也将添加一个颜色为(1,“COL”)的令牌到PacketsToSend中,同时增添
一个颜色为1的令牌到NextSend 中。这意味着根据弧表达式的结果,从库所PacketsToSend 和
NextSend中删除的令牌数,立即就被新增的同样颜色的令牌数代替了。因此当变迁发生时,这
些库所的状态并没有改变。这就允许数据包被重新发送(从数据丢失中恢复)。SendPacket的
发生也给输出库所A 增加了一个新的颜色为(1,“COL”)的令牌。直观来看,这代表了第一

6
个数据包(1 ,"COL" ),已经被送往网络。图2展示了在新状态 M1中的CPN模型的片段。我
们只是展示了CPN模型的片段,主要因为一个变迁的发生,只有与之连接的库所状态会发生改变。
考虑有3个变量n,d和success的状态 M1和变迁TransmitPacket。变量success是一个布尔变
量声明为:
var success : BOOL;
这出现在输出弧上。颜色集BOOL被定义为布尔值的集合({true, false})
bool:
colset BOOL = bool;
在状态 M1 中,库所A 有一个颜色为(1 ,"COL")的令牌。变量success仅在从TransmitPacket
的输出弧上找到。这意味着变量可以被赋值为是一个它的颜色集(这是BOOL类型的)中的任意
值。因为来自A的输入弧的弧表达式为(n,d),可以直接推论出,变迁TransmitPacket可以在
在M1的两个不同绑定使能,
bsucc = <n=1, d="COL", success=true>
bfail = <n=1, d="COL", success=false>

这些绑定中的第一个-bsucc,代表网上的传递成功。如果在M1中它发生,这时将会出现:
-数据包(1,"COL")被从输入库所A中去掉
-一个代表相同数据包的新的令牌被添加到输出库所 B中(在if-then-else表达式中,条件
success的值为true,此时1'(n,d)的值为1'(1,"COL"))。
图3显示部分的状态 ,这是在M1中的绑定bsucc的发生的结果。
第二个绑定bfail代表一个不成功的传递,即该数据包在网络中被丢失。如果它发生在M1,以
下情况将出现:
-数据包(1 ,"COL")被从输入库所A中删除。
-没有令牌被添加到输出库所B中(在if-then-else表达式中,条件success的值为false,前面
定义的常量empty 的值为 empty 多态集)。
在M1中的绑定 bfail的发生将导致回到图1所示的初始状态 M0。
现在,让我们考虑在状态 中数据包的接收。在库所NextRec上的令牌,代表接收器期
待收到的下一个数据包的序列号。变量k是就赋值为这个序列号的数值。变量data有DATA数据类

7
型(即文本串):
var data : DATA;

变量data将被赋值为文本串,这个文本串代表所有已经被接收器接收到的的数据包中数据的串
接。
当一个数据包是出现在库所 B ,那就有两种不同的可能性。要么n=k的值为true,这意味
着被收到的的数据包就是接收器期望接收的那个,或n = k值为false 这意味着它不是预期的数据
包。如果在库所B上的数据包是预期的数据包(即,n = k),就有下列情况发生:
-数据包被从库所B中删除
-数据包中的数据,是串接到接收器已收到数据最末端的(运算符 ˆ 是文本串的连接运算
符)。
-库所NextRec上的令牌颜色将从k变为k+1,这意味着接收器正在待下一个数据包。
-在库所C中会有一个确认。该确认包括接收器期待接收的下一个数据包的序列号。
图3中在状态 上的变迁ReceivePacket的发生,对应着预期数据包的接受。图4显示当
ReceivePacket在 中发生时,到达状态 M3。
如果在B上的数据包不是预期的数据包(即n≠k)有下列情况发生:
-数据包被从库所B中删除。
-数据包中的数据被忽略(DataReceived的状态没有改变) 。
-在库所NextRec上的令牌颜色没有改变,这意味着接收器等待和前一个相同的数据包。
-在库所C中会有一个确认。该确认包括接收器期待接收的下一个数据包的序列号。
变迁TransmitAck有一个行为,类似于TransmitPacket的行为。在成功传递的情况下,它消
除了库所C中的确认,而且把他们增加到库所 D中。在M3状态、绑定<n=2,success=ture>下,
变迁TransmitAck发生得到的状态,记为M4。
现在,我们考虑一下确认的接收。当变迁ReceiveAck发生时,从库所 D中删除了一个确认
而且更新NextSend上的令牌来以包含在确认中指定的序号。此时,发送器可以根据 “停止并等
待”策略发送下一个数据包。
假设变迁 ReceiveAck在状态 M4 、绑定<n=2,k=1>时发生,这将得到状态 M5,该状态 M5,
它代表了发送器准备发送数据包2时的状态(因为,现在第1数据包已知已经被成功接收)。这
个状态类似于初始状态,但是在库所NextSend 和NextRec 上的令牌有颜色2(而不再是1),而
且在DataReceived上的令牌有颜色"COL" (而不再是"")。

8
如上所述,我们已经描述了数据包1的发送、传输、接收和对应的确认。在CPN模型中,这
相当于5个变迁在有使能的绑定下发生。下面我们列举了这些对元组,他们包括了一个变迁和使
该变迁发生的绑定。一个包括一个变迁和作为这个变迁的变量的绑定构成的元组,被称为绑定元
素。
(SendPacket,<n=1, d="COL">)
(TransmitPacket, <n=1, d="COL", success=true>)
(ReceivePacket, <n=1, d="COL", k=1, data="">)
(TransmitAck, <n=2, success=true>)
(ReceiveAck, <n=2, k=2>)
变迁还可以允许有一个警卫,这是一个布尔表达式。当警卫出现时,它必须为ture绑定才能
被使能,否则这个绑定被禁用而不能发生。因此,一个警卫为变迁的使能绑定上加了额外的约束。
一个警卫的例子将在6.1节中讲解。

2.3 步骤、并发和冲突

现在让我们更详细地考察CPN模型的行为。我们已经看到,在初始的状态只有一个绑定元素
是使能的:
(SendPacket, <n=1, d="COL">)
当它发生时,它导致了状态 M1,见图2的展示。在状态M1中,有三种不同的绑定元素使能:
SP = (SendPacket,<n=1, d="COL">)
TPsucc = (TransmitPacket,<n=1, d="COL", success=true>)
TPfail = (TransmitPacket,<n=1, d="COL", success=false>)
第一个绑定元素代表了数据包1的重传。第二个绑定元素代表着数据包1通过网络的一次成
功传输,而第三个绑定元素代表了在网络上数据包的丢失。最后两个绑定,TPsucc和TPfail,是彼
此冲突的。尽管他们两个都是使能的,但他们中只有一个能发生,因为他们都需要一个来自库所
A的令牌,并有在M1上只有一个这样的令牌。然而,绑定元素SP和TPsucc可以并发发生(即并行)。
发生SP需要一个来自库所PacketsToSend的令牌和一个NextSend上的令牌,而TPsucc需要一个来
自库所A的令牌。换句话说,这两个绑定元素都可以在没有竞争或干扰其他具有绑定元素的情况
下获得他们需要的令牌。一个绑定元素的多态集在一个给定的状态下,如果在变迁的输入库所,
在同时满足所有绑定元素的要求的问题上有足够的令牌,则我们称为绑定元素多态集是并发使能
的。同理, SP和TPfail是并发使能的,因此他们可以同时发生。
一般来说,一个步骤包含一个(非空有限)并发使能绑定元素的多态集。一个步骤可以包括
一个单一的绑定元素。我们不把绑定元素的空多态集看做是一个合法的步骤,因为它没有效果,
并始终是使能的。并发使能绑定元素集的发生效果是每个绑定元素发生效果的累加和。这意味着
到达的状态将和如果我们让一系列绑定元素顺序地发生(即,按照任意的排列一个接一个地发生)
得到的状态相同。
现在让我们假设在状态的M1中的三个使能绑定元素中的第一个和第二个同时发生,即,我
们按照下面的几个步骤(写为一个绑定元素的多态集):
1’(SendPacket,<n=1, d="COL">) ++
1’(TransmitPacket,<n=1, d="COL", success=true>)
接着,我们到达状态 M2,在图5中展示出其中一部分。在状态 M2,我们有4个使能绑定元素:
SP = (SendPacket,<n=1, d="COL">)
TPsucc = (TransmitPacket,<n=1, d="COL", success=true>)
TPfail = (TransmitPacket,<n=1, d="COL", success=false>)

9
RP = (ReceivePacket,<n=1, d="COL", k=1, data="">)

像前面一样,在 TPsucc 和 TPfail 之间有冲突,所有其他绑定元素并发使能,因为有足够的输


入令牌来同时满足每一个绑定元素的需求。
在一般情况下,一个 CPN 模型的执行是通过一个发生序列描述的,该发生序列具体规定了
发生的步骤和中间可达的状态。一个由初始状态,经过发生序列可达到的状态,被称作是可达状
态。超过一个使能绑定元素的可达状态的存在,使得 CPN 模型具有不确定性。这意味着存在含
有不同步骤序列和导致不同可达状态的发生序列。强调只有使能步骤之间的选择是不确定的这一
点是很重要的。一旦有使能的步骤在某一特定状态中被选定,则它自己的发生所得出的结果是唯
一确定的(除非使用了随机函数,就像我们将在第 6 节中说明的),那么这些单独的步骤本身
就是确定的。
图 6 显示了一个在 CPN 模型的在经过步骤发生序列后到达的中间状态 M*。在状态 M*中,
库所 A 有两个带有颜色(1,"COL")的令牌,以及一个带有颜色(2,"OUR")的令牌。 在这
种情况下,TransmitPacket 对应于与数据包 1 和数据包 2 进行传递的绑定,是使能的。在一个
CPN 模型中,没有关于令牌被从库所中移出顺序方面的要求。这意味着在 M*中,有可能让
TransmitPacket 与数据包 2 成功传输对应的绑定发生,在这种方式下,让库所 A 中带有序号 2
的数据包将超过那两个带有序号 1 的数据包。因为有两个带有颜色(1,"COL")的令牌 ,这也
意味着 TPsucc 和 TPfail 可以同时发生,因为在 A 上有一个两个绑定元素中任一个的需要的令牌。
它还意味着 TPsucc 可以与其本身同时发生,而且对 TPfail 来说也是这样的。因此,在网络上同时
传输多个数据包是可能的。

10
变迁 SendPacket 在 M*时,在与数据包 2 重传的对应的绑定中是使能的,即使数据包 2 仍
然在传输途中。重传是可能的,因为数据包 2 的传输时过于缓慢,因而可以被第二个 SendPacket
的发生(即数据包 2 的重发)超过。这意味着,我们已经描述了与时间相关的行为,而没有明
确使用时间。这里我们在抽象层面选择的内容不是重传什么时候可能发生的问题,而是一个简单
的事实,那就是这种重传可能发生。我们将在第 4 节中在当介绍是如何由 CPN Tools 支持模拟时,
更详细地讨论 CPN 模型的实行。

2.4 模块

现在,我们展示一下如何由一组层次相关的模块(modules)组织CPN模型的。这和模块构
建程序的方式类似。为了说明模块的使用方法,我们重新看图1 中关于协议的模型,并从这个
协议的例子构建一个分层次的CPN模型。一个简单的想法是为发送器建立一个模块,为网络建立
一个模块,和为接收器建立一个模块。此外,如果我们细看图1中模型的网络部分,我们可以发
现,它包含了两个有非常相似的行为的变迁TransmitPacket 和TransmitAck。因此,使用同一个
模块代表TransmitPacket和TransmitAck的行为是很自然的。然而,涉及到的令牌颜色稍微有所
不同。TransmitPacket变迁处理数据包,表示为NOxDATA类型的令牌 ,而TransmitAcktransition
处理确认,表示为NO类型的令牌。这意味着,我们不能马上使用相同的模块去表示
TransmitPacket和TransmitAck的行为。为了解决这个问题,我们使用联合类型的颜色集
PACKET,定义如下:
colset PACKET = union Data : NOxDATA +Ack: NO;
颜色集PACKET 是一个联合类型,它采用了两个构造符Data和Ack来分辨这个颜色集的数据
值是代表一个数据包(如Data(1,"COL"))还是一个确认包(如Ask(2))。
图7显示了Sender(发送器)模块,该模块包括两个变迁和4个库所。库所D是一个输入端口
(input port),库所A是一个输出端口(output port),而库所PacketsToSend 是一个输入/输
出(input/output)端口。这意味着库所A,D,PacketsToSend构成了接口(interface),通过这
个接口发送器模块与其周围的环境(即其他模块)交换令牌。发送器模块将通过输入端口D引

11
入令牌,而且它将通过输出端口A输出令牌。对于输入/输出端口,模块可以既可引进也可输出
令牌。在CPN Tools中,端口库所可以由紧靠库所定位的矩形端口类型标签来识别,标签用来指
明端口库所是否是一个输入、输出或输入/输出端口。库所NextSend是内部库所,它只与发送
器模块本身有关。发送器模块是与图1中发送器部分是相同的,除了库所A和D的颜色集现在是
PACKET,而且我们使用了在这些库所的周围弧表达式中的构造符DATA和Ack。
图8展示了Receiver(接收器)模块。它有一个输入端口B ,一个输出端口C ,一个输入/
输出端口DataReceived ,以及一个内部库所NextRec。

图9显示了Network(网络)模块。Network模块有两个输入端口A和C ,还有两个输出端口,
B和D。Network模块没有内部库所。网络模块有两个替代变迁(substitution transitions)(画的
像矩形盒),TransmitData 和TransmitAck。在层次模型中的基本思路是,用每一个替代变迁与
一个模块关联。当一个模块与一个替代变迁关联时,它就被称作子模块(submodule)。在CPN Tools
中,替代变迁可以通过紧挨着他们的长方形子模块标签来辨认。标签含有与替代变迁相关的子模
块的名字。直观来看,这意味着该子模块表示了被替代变迁所表示的行为更加详细的视图,就像
一个程序过程的实现提供了比过程调用结果更详细的视图一样。在图9中,两个替代变迁都有
Transmit模块作为他们的关联子模块。
Transmit 模块在图 10 中有显示。Transmit 模型的 Transmit 变迁传送 PACKET 类型包,即
数据包和确认。变量 p 是一个颜色集 PACKET 类型的变量。

12
为了把模块联系在一起,我们使用在图 11 中显示的 Protocol 模块。它代表着一个关于(整
个)协议系统的更加抽象的概念。在图 7 中替代变迁 Sender 有与其相关的 Sender 子模块,在
图 9 中 Network 有其相关的子模块 Network 子模块,而且在图 8 中 Receiver 有与其相关的
Receiver 子模块。我们可以看出,Sender、Network 和 Receiver 模块通过库所 A,B,C 和 D 互
相交换令牌—但是,我们不能够看到 Sender、Network 和 Receiver 模块的具体工作细节。在图
11 中,每一个替代变迁与其子模块有着相同的名字,但这不是必须的。
替代变迁的输入库所被称为输入插口(input sockets),而输出库所被称作输出插口(output
sockets)。这意味着在协议模块中 A 是一个替代变迁 Sender 的输出插口,而且是替代变迁
Network 的输入插口。库所 PacketsToSend 是替代变迁 Sender 的输入/输出插口(input/output
socket)。
一个替代变迁的插口库所组成了这个替代变迁的接口。为了获得一个完整的层次模型,我们
需要知道每个子模块的接口是怎么与它的替代变迁的接口联系的。这是通过一个端口分配(port
assignment)完成的,这个端口分配把子模块的端口库所映射到替代变迁的插口库所。输入端口
被分配给输入插口,输出端口被分配给输出插口,输入/输出端口被分配给输入/ 输出插口。对
于图 11 中的替代变迁和相关的子模块,每一个端口都和被分配到的插口有相同的名字,但这不
是必须的。
当一个端口被分配到一个插口上时,两个库所构成了一个的库所的两种不同的视图。这意味
着端口和插口库所总是享有同样的状态,因此在概念上成为相同的混合库所。图 12 和图 13 显
示了在初始状态中 SendPacket 变迁发生后的 Sender 模型和 Network 模型的状态。

13
14
当变迁 SendPacket 发生时,它增加了一个令牌到 Sender 模块的输出端口 A(见图 12)。
这个端口库所被分配给了在 Protocol 模块中的替代变迁 Sender 的输出端口 A(见图 11)。因此,
新的令牌也将出现在 Protocol 模块中库所 A 中。这个库所也是为替代变迁 Network 的一个输入
端口,而且在 Network 模块(见图 13)中的端口库所 A 分配给它。因此,我们得出的结论是,
新的令牌在 Network 模块的端口库所中也是可用。换句话说,这三个库所 A(在 Protocol,Sender
和 Nerwork 模块中)是同一个混合库所的三种不同视图—通过它,模块间可以彼此交换令牌。
用于库所 B,C 和 D 也可以得到类似结论。库所 D 出现在 Protocol,Sender 和 Nerwork 模块中,
而 B 和 C 出现在 Protocol,Nerwork 和 Receiver 模块中。
以上我们已经看到,两个相关的端口及插口库所构成了单一的混合库所的不同的视图,而且
这意味着他们总是有相同的状态。显然,这也意味着他们还需要有相同的颜色集和相同的初始状
态。应该指出的是,替代变迁没有警卫,而且连接到替代变迁的弧没有弧表达式。讨论替代变迁
的使能和发生没有意义。取而代之的是替代变迁表示了它的子模块的复合行为。
在上述介绍的层次模型中有三个抽象的层次。最高抽象层是 Protocol 模块,而最低的抽象
层次是 Sender,Transmit 和 Receiver 模块,并且 Nerwork 模块在这中间。一般来说抽象的层次
是任意的。典型的较大系统的 CPN 模型多达 10 个抽象层次。
Transmit 模块用来作为 Network 模块中 TransmitData 和 TransmitAck 替代变迁的子模块。
这意味着将有两个分离的 Transmit 模块实例(instances)—两个替代变迁每个对应一个实例。
对于 Transmit 模块(Transmit 模块是图 9 中替代变迁 TransmitData 的子模块)的实例,我们分
配端口库所 IN 到插口库所 A,同时,我们分配端口库所 OUT 到插口库所 B。对于 Transmit 模
块(图 9 中的替代变迁 TransmitAck 的一个子模块)的实例,我们分配端口库所 IN 到插口库所
C,分配端口库所 OUT 到插口库所 D。
一个模块的每个实例都有它自己的状态。这类似一个对象,它是面向对象类的一个实例一
样,每个对象都有自己作为非静态属性的值。这意味着与 TransmitData 替代变迁对应的
Transmit 模块的实例的状态是与和 TransmitAck 替代变迁对应的 Transmit 模块的实例的状态相
互独立的。 每一个端口库所的实例的状态,与出现在与替代变迁相对应的插口库所上的令牌相
匹配。在层次模型可以模拟之前,CPN Tools 将自动为每个模块实例化适当数量的实例,并将这
些实例与替代变迁关联。
以上我们已经看到的模块是怎样通过端口和插口库所交换令牌的。模块间还可以通过融合
集交换令牌。融合集也允许在不同模块中的库所,通过模型的层次结构,粘合成一个混合库所。

2.5 时间建模

现在,我们描述如何把时间信息加入 CPN 模型。这将使我们能够评估一个系统执行其操作


有多高的效率,并且还使我们建模和验证实时系统,即那些系统正确性依赖于事件的适当的时机
的系统。有一个赋时的 CPN 模型,我们就可以计算性能的评价指标,例如最大队列长度,平均
等待时间和吞吐量。这将在第 6 节中说明。我们也可以,例如,验证是否一个实时系统符合需
要的最后时限。我们通过使用简单协议的非等级变量,提出 CP-nets 的时间概念。该赋时的构造
也适用于分层 CPN 模型,并且 CPN Tools 支持赋时的分层 CP-nets 的模拟与分析。
现在我们看一下图 14,其中包含一个关于简单协议的赋时 CPN 模型。很容易看出该 CPN 模
型和图 1 中非赋时的 CPN 模型非常相似。
赋时的和非赋时的的 CPN 模型之间的主要区别是在赋时 CPN 模型中令牌—除了有令牌颜色
外,还可携带被称作时间戳的第二值。这意味着一个携带一个时间戳的库所的状态,现在是一个
赋时的多态集,他们出现的次数以及他们的时间戳一起来说明在多态集中的元素。此外,CPN
模型有一个全局时钟代表模型的时间。在库所上令牌的分配连同自己的时间戳和全局时钟的值一

15
起被称为赋时状态。在层次赋时 CPN 模型中,有一个单一的全局时钟,这是可以被所有模块共
享的。

总的来说,一个时间戳可以是一个非负整数或实数。在当前 CPN Tools 的实现中,只支持非


负整数。该时间戳告诉我们令牌准备好被使用的时间,即,通过一个变迁的发生,可以被从库所
中删除的时间。如果一个库所的颜色集是赋时的,则库所上的令牌将携带一个时间戳。一个颜色
集是通过利用 CPN ML 关键字 timed 来声明为赋时的。图 15 显示了被修改的赋时模型的颜色集
声明。从中可以看出,除了 BOOL,所有的颜色集都被定义为赋时颜色集。
一个赋时 CPN 模型的执行,是由全局时钟控制的,并且以类似于在多数用于离散事件模拟
的模拟引擎的方式工作。只要有着色使能的绑定元素(即,有需要的输入令牌)并且准备好执行
(即,所需要的令牌有时间戳,该时间戳小于或等于全局时钟的当前值),模型逗留某一给定的
模型时间。因此,在一个赋时的 CPN 模型中,一个使能的绑定元素必须是颜色使能的,并且准
备好了将要发生的。当没有更长时间的绑定元素被执行时,该时钟被提升到最早的模型时间,此
时绑定元素可以被执行。每个状态存在于一个模型的时间的闭区间上的(这可能是一个点,即时
间的某一时刻)。至于非赋时的 CPN 模型,只有当绑定元素在同一时间准备好被执行时,我们
可能在绑定元素之间有冲突和并发(并且绑定元素可与他们自身并行)。
现在,考虑关于在图 14 中显示的协议的定时 CPN 模型的原始的状态。令牌的颜色和在初
始状态的非赋时的协议的 CPN 模型的是一样的,但是现在令牌携带时间戳。作为一个例子,在
库所 PacketsToSend 的最初的状态是:
1’(1,"COL")@0 +++
1’(2,"OUR")@0 +++
1’(3,"ED ")@0 +++
1’(4,"PET")@0 +++
1’(5,"RI ")@0 +++
1’(6,"NET")@0

16
令牌的时间戳是写在@ 符号后面的,读作“at”。在这种情况下,所有的令牌都携带时间
戳0 。运算符+++携带两个赋时的多态集作为自变量,并返回他们的并集。在最初的状态中,
所有其他令牌也携带时间戳0。在初始状态中,全局时钟的值也是0。所有库所的最初的状态都
指定为一个非赋时多态集。如果一个带有赋时颜色集的库所的初始状态没有明确指定令牌的时间
戳,CPN Tools将自动附上时间戳0。
在图14中,考虑库所SendPacket和绑定<n=1,d="COL"> 。为了发生,此绑定需要在库所
NextSend 中的带有颜色1 的一个令牌,并且在库所PacketsToSend中带有颜色(1,"COL")的
令牌。这是由输入弧表达式通过在2.2节中解释的使能规则决定的。我们看到,NextSend所需的
输入库所中的两个令牌,并且他们都携带时间戳 0,这意味着他们可以在时刻0被使用。因此,
变迁可以在时刻0发生。当变迁发生时,它将两个令牌从输入库所中消除,并为这三个输出库所
中的每个增加一个令牌。这些令牌的颜色是由输出弧表达式,通过在2.2节中的解释的发生规则
决定的。不过,现在还有必要计算时间戳,并将计算出的结果赋给这三个输出令牌。这是通过使
用隶属于所有变迁或单独的变迁的输出弧的时间延迟标注来完成的。标注到变迁的时间延迟应用
于所有由那个变迁产生的输出令牌,而标注在一条输出弧的时间延迟只应用于那条弧产生的令
牌。在图14 ,我们已经把一个时间延迟标注 @ +9 附着到SendPacket变迁上,并且将常数的
时间延迟@ +Wait 附着到PacketsToSend的输出弧上,这里Wait 是一个常数,被定义为:
val Wait = 100;
在到库所A和NextSend的输出弧表达式没有单独的时间延迟。由输出弧上产生的到令牌的时
间戳是全局时钟的值,加上这个变迁的时间延迟标注的结果,再加上这个弧的时间延迟标注的结
果,这三项的和。因此,我们得到,被添加到库所NextSend和A的令牌获得时间戳:
0+9+0=9
第一个0是变迁作为全局时钟发生的时间,9是标注在变迁的时间延迟,而第二个0是在输出
弧上延迟的时间(因为在输出弧上没有时间延迟)。直观上来看这个模型,就是传送包操作的执
行持续了9个时间单位。
在从输出弧到库所PacketsToSend 的弧表达式有一个单独的时间延迟:@ +Wait。这意味
着,被添加到PacketsToSend的令牌得到时间戳:
0 + 9 + 100 = 109

17
这里0是库所出现的时间,9 是标注在变迁上的延迟时间,而100是标注在弧上的延迟时间。
直观上这里表述了一个事实,即我们直到时刻109才会重新发送数据包1,即直到前一个传输操
作结束后的100个时间单位后。这是通过为了数据包1而给予这个令牌该时间戳109而实现的--如
此使之直到那一刻才能获得。但是,应该注意到,数据包2仍然有时间戳0。因此,如果一个确
认在时刻109之前到达,将立即可能发送此数据包。当SendPacket在时刻0发生,我们到达状态
M1,在图16中显示了其中有一部分。
在状态的M1中有三个绑定元素在他们的输入库所上有需要的令牌:

SP = (SendPacket, <n=1, d="COL">)


TPsucc = (TransmitPacket,<n=1, d="COL", success=true>)
TPfail = (TransmitPacket,<n=1, d="COL", success=false>)
SP可以在时间109发生(因为它需要一个带有时间戳109的令牌和一个带有时间戳9的令牌)。
不过,TPsucc和TPfail可以发生,在时刻9已经准备好(因为他们需要一个带有时间戳9的token)。
因为TPsucc和TPfail是第一个准备好发生的绑定元素,其中之一将被选中(这两个绑定元素是互相
冲突的),而且它将尽可能快的发生,即在时刻9 。让我们假设TPsucc是被选择要发生的。它将
从库所A中消除令牌并向库所B增添一个令牌。这个令牌的时间戳,将是变迁发生的(9)时刻,
和标注到变迁的时间延迟表达式@ +Wait()得到的值的之和。函数Delay带有一个部分(())
作为参数,定义如下:
fun Delay() = discrete(25,75);
函数discrete是一个预定义的函数,提供了一个在由它的参数指明的闭区间上的离散的统一
分布。这意味着,一个Delay()调用将会从区间[ 25,75 ]中返回一个整数,并且所有在区间里的
数字都有相同的被选中的概率。直观来看,这代表了在网络上传送数据包所需要的时间,可能会
在25和75个时间单位之间变化,例如,由于受到网络上负载的影响。让我们假设Delay()的值为
38 。然后我们得到状态M2,在图17中显示了它其中的一部分。上述展示了随机函数如何可以把
时间戳送给令牌。
在状态M2,有两个绑定元素在他们的输入库所上有需要的令牌:
SP = (SendPacket, <n=1, d="COL">)
RP = (ReceivePacket, <n=1, d="COL", k=1, data="">)

18
如前所述,SP可在时刻109发生。然而,RP在时刻47已经可以发生(因为它需要一个带有时
间戳47的令牌和两个带有时间戳0的令牌)。因此,RP将被选择,并且我们将达到状态M3,在图
18中显示了它其中的一部分。
在状态M3中,有3个绑定元素在他们的输入库所上有需要的令牌:
SP = (SendPacket, <n=1, d="COL">)
TAsucc = (TransmitAck, <n=2, success=true>)
TAfail = (TransmitAck, <n=2, success=false>)
SP可以在时刻109发生。不过,TAsucc和TAfail在时刻64已经可以发生(因为他们需要一个带
有时间戳64的令牌)。因此TAsucc和TAfail会被选中。确认的传送和接收与在非赋时的CPN模型中
是类似地,因此,我们就不再进一步的讲解了。
在上面讨论的赋时CPN模型中,所有的令牌携带一个时间戳,因为这些库所的所有的颜色集

19
被定义为赋时的。然而,不是普遍如此。建模者被允许指定每个单独的类型(颜色集)是赋时的
还是不是。赋时颜色集的令牌携带时间戳,而非赋时的颜色集的令牌不带。没有时间戳的令牌总
是准备好了参与绑定元素的发生。
应该指出的是,一个赋时的CPN模型的可能发生序列总是形成非赋时CPN模型(即在这个模
型中,我们排除一切时间延迟标注(和所有时间戳))基本发生序列一个子集。这意味着时间延
迟标注只是在CPN模型的执行中,执行了一套额外的限制,迫使颜色使能的绑定元素在他们准备
好时就被选中。把一个非赋时的CPN模型变成一个赋时的模型在新发生序列的形式上并不能产生
新的行为。因此往往是,使用非赋时的CPN模型,在开展调查功能性/逻辑性属性的时是有用的
建模策略。然后与时间有关的事件可事后考虑。
一个变迁的发生是瞬时的,即不花时间。不过,就像在前面述协议实例所表现的那样,为
在一个系统中有非零时间的动作建模也很容易。这是通过给由对应的变迁产生的输出令牌时间戳
的方法阻止令牌在动作完成之前就被使用,直至整个动作完成。作为一个例子,TransmitPacket
直到SendPacket 发生后9个时间单位才能发生—这代表发送一个数据包的动作需要9个时间单
位。可以选择的方法就是使一个变迁的发生有一个不为零的持续期。然后,我们可在发生开始的
时刻除去输入令牌,并且当发生结束时刻添加一个输出令牌。然而这样的方法将使赋时CPN模型
和其基本的非赋时CPN模型之间的关系复杂很多。那样在一个赋时的CPN模型中将有许多可达的
状态,在非赋时的CPN模型中是不可达的—因为他们对应这样的情况,就是在一个或多个变迁是
发生的中途出现的(已经从输入库所中去除令牌,但尚未向输出库所中加入令牌)。

3 CPN 模型的构建

本节介绍了CPN Tools的GUI(图形用户界面)和CPN模型中用于构建CPN模型的工具和特点。
有用于创建声明、网络结构、标注和层次模型的工具。有提高模型的可读性的附加工具,包括用
于改变线的颜色和宽度,并对齐元素的工具。

3.1 GUI 概述

图19显示了CPN Tools的屏幕截图。左边的矩形区是索引区。它包括Toolbox(工具箱),
其中包含了许多的工具,可用于操纵构成CPN模型的声明和模块。该工具箱包含用于创建和克隆
(即复制)CPN模型的基本要素的工具。此外,它还含有多种工具的选择,用于操纵图形布局及
在CPN模型中对象的外观。为了能创建可读性好的和吸引人的图示的CPN模型,后一套工具是非
常重要的。索引区也包含一个关于每一个打开的模型的模型概述。一个模型概述显示了多种的信
息,包括模型的名字和声明(Declarations),模型的模块,和模型的层次结构。用于模型的History
(历史)显示了在模型上完成的动作的列表。这份列表仅包含那些可以被撤销和重复的操作。许
多操作可以被撤销,包括编辑操作,而其他操作不能被撤销,如执行模拟步骤。
索引区中的条目左边有一个小三角形,指示了要么这个条目含有子条目,要么这个条目可展
开,为这个条目显示更多信息。点击一个小三角将开启和关闭相应的索引条目。一个指向右侧的
三角形,意味着一个封闭的条目,而一个指向下方的三角形,表示一个开放的条目。在索引中的
一个子条目锯齿状排列在其父条目的右侧。例如,在图19中,Tool box(工具箱)条目已被打开,
以示其九个子条目(从Auxiliary到View),以及变量success的声明已被打开,以显示变量的类
型。
屏幕中余下的部分是工作区,在这种情况下工作区包含5个活页(矩形视窗)和一个圆形状
态菜单。每个活页包含大量条目,他们可以通过点击在活页(每个活页上每次只有一个项目是可

20
见的)上面的标签访问。有两种类型的活页。一类包含CPN模型的元素,即模块和声明。另一种
包括工具面板,其中包含用户用于创建和操纵CPN模型的工具。

在工具面板中的工具,可以通过点击适当的工具单元选中。选中一个工具后,鼠标指针将会
改变,以显示哪一个工具已被选中。一个已被选中的工具通过点击一个适当的目标来应用。在图
19中,一个活页包含三个命名为Protocol,Sender和Receiver的模块,另一个活页只含有一个命
名为Network的模块连同颜色集NOxDATA的声明,而第三个活页包括AllPackets。其余两个活页
包含4种不同的工具面板,用于创建(Create)元素,转变他们的样式(Style),执行模拟(Sim),
和构建状态空间(SS)。有些项目可以从索引区拖动到活页中,以及从一活页拖动到另一个同
类型的活页。在两个不同的活页中定位相同的项目是可以的,例如,要在两个不同的变焦因子中
查看一个模块。
一个圆形状态菜单已经出现在左下角活页的右侧。状态菜单是上下文菜单,使得可以对一个
给定的对象,在一些可能的操作之间进行选择。在这个例子中,它显示出一些可以在一个段口库
所上执行的操作。很多工具(但并非全部),在一个状态菜单中可用,也可在工具面板中使用,
反之亦然。举例来说,在状态菜单中的Clone Place(克隆库所)工具可在Create(创建)工具面
板(带两个长方形的工具单元)中使用,在状态菜单中的Show Marking工具,在工具面板中是
不可用的是。用于改变库所的线条颜色的工具是在Style(样式)工具面板中的,但他们是不会
在任何状态菜单中的。

3.2 模型元素的构建

New Net(新网)和Load Net(载入网)工具是分别用来创建一个新的模型和载入一个现有


的模型的。这些工具可以在Net工具面板或在工作区的状态菜单中找到。当一个模型被创建或载
入,其模型概述将被添加到索引区中。

21
用在标注中的颜色集,变量,函数等的一定要在模型声明中定义。属于一个模型的声明能在
模型概述的索引区中看到。新的声明可以通过使用在相关的状态菜单中找到的New Declaration
(新声明)工具填加。在图19中,可以被看到Protocol.cpn模型的许多声明,而且Standard
declarations (标准声明)项是一个声明块,其中包含了模型生成时一些默认的声明。键盘快捷键
可以被用来从一个声明跳转到下一个声明,并可在编辑中的声明后加入新的声明。声明可以在索
引区和在活页中的声明页中查看和编辑。
建立网结构的工具被在图20中显示的Create(创建)面板中找到。可用的工具(由左到右,
并自上而下)是:
-创建一个变迁。
-创建一个库所。
-创建一个弧。
-创建一个垂直基准线(vertical guideline)。
-删除一个元素。
-克隆,即,复制一个元素。
-改变一个弧的方向。
-创建一个水平基准线(horizontal guideline)。

Create(创建)面板中的工具,除了将在下面解释的创建基准线的工具,其他工具也可以在
状态菜单中找到。每一个工具都可以应用于一定种类的目标。举例来说,用于创建库所和变迁的
工具可以被应用于活页中的模块中,而用于创建一个弧的工具必须被先应用于一个库所(变迁)
上,然后被应用到一个变迁(库所)上。
一些工具有影响工具行为的选项。这些工具的选项是可以改变的,而且他们可以在索引区以
及在面板中的工具单元中访问。图21显示了Create Place工具的选项。用这些选项可以改变新库
所的默认高度和宽度。
标注必须被添加到节点和弧中。新建一个库所、变迁或弧后,进入文本编辑模式,此时可以
将第一个标注添加到元素中。弧只有一个标注,而库所和变迁有好几种标注。TAB键用于一个节
点中不同的标注之间进行循环定位。
有许多不同的工具和特性能够用来改善布局和提高模型的可读性。在Style(样式)面板中
的工具,是用来改变模型对象的图形特性的。有用于为改变线条、填充颜色、线条宽度、箭头大
小的工具。

22
节点和弧的弯点可以通过使用基准线和自动捕捉对齐特性来对齐。必要的时候对象会自动纵
向或横向捕捉对齐。例如,如果在两个都差不多对齐的节点间加入一个弧,然后他们将移动到相
互对齐,或者如果一个节点通过一个弧附着到另一个节点上,这个节点移动了,那么它将被调整
和另一个节点对齐,不论怎样,它移动的距离对于对齐来说是否足够近的。同样地,标注可以被
捕捉到与他们的父对象的各种各样的捕捉方式点上。举例来说,变迁在每一个角及每个边的中间
点都有捕捉点,而且这些点可以被标注捕捉。几个不同的元素,可以通过按照基准线捕捉,来使
他们对齐。所有按照基准线捕捉的元素,在基准线移动时就会被移动。
新的模型元素并不需要从头创建,因为他们可以通过克隆,即复制现有的组成元素来创建。
许多不同类元素可以被克隆,包括声明、标注、及连同其所有的i标注的节点。当一个对象是克
隆的,它所有的图形属性,如大小和线的颜色,都一样是克隆的。在同一模型或两个模型之间(在
CPN Tools中,一次可能打开不只一个模型)的对象都可以被克隆。也可以仅克隆从一个对象的
图形属性到另一个对象上。

在许多单独的元素中完成相同的操作是非常乏味的,如改变模型元素的颜色,或移动和重
新对齐模型元素。在CPN Tools中,可以构造一个组(groups),并完成组中元素的操作。在一
个活页中的一个模块底部左侧的Group tabs(组标签),说明了为该模块定义了哪些组。不属于
组的元素是暗色的(dimmed),就像在图22中显示的。如果一个工具被应用到一个组的一个元
素中,该工具也被用于在这个组中的所有其他相关的元素中。举例来说,改变一个组中任意一个
元素的颜色,将改变该组中所有其他元素的颜色,而改变一个弧的方向,只会影响这个组中的弧。
一般的组只能包含来自同一个模块的元素,但global(全局的)组可以包含来自这个模型中任何
模块的元素。

3.3 层次模型构建

用于创建层次化网的工具,可以在图23中显示的Hierarchy(层次)面板中找到。可用的工
具(由左到右,自上而下)是:
-把一个变迁或一个组移动到一个新的子模块。
-用一个子变迁的子模块代替它本身。
-把一个子模块分配给一个替代变迁。
-把一个端口分配给一个插口。
-设置为端口类型为把输入(input)。
-设置为端口类型为输出(output)。
-设置为端口类型为输入/输出(input/output)。

23
-为一个融合集指派一个库所。

这些工具支持自顶向下和自底向上两种模型构造方法。支持自上而下的办法,Move to
Submodule(移动到子模块)工具,将把一组元素从一个模块移动到一个新的子模块,在原来的
模块中创建一个带有合适的弧的替代变迁,在子模块中创建适当的端口库所,并将端口指定给插
口。Assign Submodule(分配子模块)工具支持自底向上的方法,那样,它使将指派一个现有
的模块成为与现有的(替代)变迁相关联的子模块,而且只要有可能,它会自动把端口库所分配
给插口。此外,Clone(克隆)工具也可以用来克隆层次化的元素,如端口型标签,或甚至一个
替代变迁和它所有的子模块。
关于层次化关系的信息,可在模块和索引区中可见,如图24中所示。该图的左侧显示了模
型概况中模块的名字。一个模块名字旁边的这个小三角,表明它有子模块,并且这个模块的子模
块在下面列出来了,并锯齿状排到超级模块的右边。在这个例子中,该Protocol模块是最高层次
的模块,而且它有三个子模块。其中一个子模块(Network)也有两个子模块。在模块名字后面
的圆括号里的数字表明存在多个实例,而如果没有数字,则表明在模型的模块里只有一个实例。
模块的实例化完全通过CPN Tools自动处理的,而且用户可以访问模块的每一个实例。应该
指出的是,模块的实例化是在CPN模型模拟之前完成的。因此,模块实例的数量在整个层次化模
型的模拟中是固定的,而且在模拟过程中,不能动态实例化新的模块。
图24的右侧显示可以在一个模块中看到的层次信息。在TransmitData正下方的小标签表明,
这是一个替代变迁,而且它与子模块Transmit相关联。TransmitData右下方的列表显示了在它的
插口和在Transmit子模块中的端口库所之间的分配情况。通过点击替代变迁左下角的小三角可以
打开和关闭这个列表。库所A是TransmitData的一个插口,但是库所旁边的小标签指示它也是一
个输入端口。与端口、替代变迁、融合库所相关联的标签都统称为层次化标签。有些层次化标签
的状态菜单包含用于打开和展示活页中的子模块和父模块的操作。这实现了高效的浏览。

24
3.4 语法检查和代码生成

CPN Tools进行语法和类型检查,并模拟代码生成。对产生错误的对象以上下文方式向用户
提供错误信息。图25显示了一个库所标注错误信息的例子。
语法检查和代码生成是递增的并且与编辑并行完成。这意味着,即使模型是不完整的,也可
以执行CPN模型的一部分,而且意味着,当CPN模型的部分组成被修改,语法检查和代码生成只
是在依赖的修改的模型部分元素中完成。有些元素直到他们有足够的信息来改正语法时才会被检
查。例如,一个库所直到它有一个颜色集标注时才会被检查,一个变迁直到它所有周边的库所可
以检查,并且其所有周边的弧有弧标注时才会被检查。
代码生成的主要成果是模拟代码。模拟代码包含在一个CPN模型的给定状态中,推断出一组
使能的绑定元素,并计算在一个使能的绑定元素发生后到达的状态的函数。

3.5 图形化反馈与帮助

当编辑和分析一个CPN模型时,CPN Tools使用一些图形反馈来提供信息。帮助信息也可以
得到。彩色编码光圈是用来高亮显示有特殊特性的对象或用来表明对象之间不同种类的关系。例
如,亮红光圈表示错误。光圈与库所、变迁、弧、标注、声明、模块的标签、索引条目(如模块
名称)相关联。在所有可能的情况下,光圈被传送到类似于父对象的对象。在图25中,库所有
一个有错误的标注,库所将因此有一个红色的光圈。红色光环将被传送到活页中模块的标签上,
也被传送到索引区中模块的名字和模型的名字上。错误光圈总是显示,而且只有当一个错误改正
后,他们才会被删除。当鼠标滑过某一类对象上时,其他种类的光圈还会出现。例如,深蓝色光
圈表明在声明和模型对象之间的依赖关系,而且他们只有当鼠标移动到一个声明或一个节点上时
才会显示。在图19中,其中一个声明有光环(深蓝色),因为光标指在一个依赖上述声明的库
所上。

一个对话泡,是一个黄色的矩形,提供上下文敏感的信息,如错误讯息。有些对话泡自动出
现,而有些对话泡在光标移动到一个适当的对象上后还要需要短暂延迟才会出现。例如,鼠标移
到到模型名称上,将会造成包含模型出现的全部路径的对话泡出现。另一方面,带有网络结构错
误信息的对话泡,就像在图25中的那个,会自动出现。
状态泡是彩色编码泡,有时出现在索引区的底部。一个对话泡通常与状态泡上有关,正如图
26中显示。为了看到相应的对话泡,有必要将鼠标移动到状态泡上。绿色表明一项操作成功完
成了,红色表明有一个错误,而浅紫色表明一个消耗时间的操作,例如一项长期的模拟目前正在
执行。
详细的帮助信息,可以通过多种方式得到。把Help(帮助)索引区拖到工作区将在网页浏览
器中打开离线帮助的主页。如果光标移动到工具面板上一个工具单元,将会出现的工具功能的简
洁的提示。在面板中的工具单元的状态菜单和活页的面板标签包含有在浏览器中打开一个有关帮
助页面的工具。

25
4 模拟

CPN Tools的模拟器开发了一批高级的数据结构和算法,可以高效模拟大型分层CPN模型
[29]。模拟器探讨Petri网的位置性质,这确保了一个变迁的发生仅影响它的最直接的周围对象,
这也确保了在一次模拟中每秒执行的步骤数,独立于CPN模型中库所和变迁的数量的。这确保了
大型CPN模型的按比例模拟。
CPN Tools模拟器只执行构成一个单一的绑定元素的步骤。这是因为带有大量绑定元素的使
能步骤的发生而产生的状态,和让绑定素在步骤中一个接一个的按照某种任意的顺序发生得到的
状态是相同的。因此,可以通过和多个绑定元素一起构成步骤的发生序列达到的状态,也可以通
过带有由单一的绑定元素的构成步骤的发生序列达到。
CPN Tools使用图形模拟反馈,如图27中所示,提供关于模拟中达到的状态的相关信息和使
能并发生的绑定元素。库所旁边的一个小圈显示了在一个状态中在那个库所上的令牌的数量,并
且圆圈旁边的一个方框显示了这个令牌的值。在图27中,库所DataReceived包含了一个值为
"COL"的令牌。绿色光圈显示了使能的变迁,并且光圈可以在变迁中,在活页和索引区中模块名
字上,在子模块标签上发现。ReceivePacket下面的方框将在下文中讨论。

许多用于模拟CPN模型的工具,也可以在模拟工具面板中发现,如图28中所示。一台录像机
按钮的图形用来表示模拟工具的图形符号。模拟工具可以通过鼠标选中,并应用到CPN模型中。
可用的工具(从左至右)有:
-回到最初的状态。
-停止正在进行的动画自动模拟。

26
-用手动选择的绑定执行单一的变迁。
-用一个随机绑定执行单一的变迁。
-执行一个动画自动模拟,即通过随机选择绑定元素,并执行事件发生序列,显示每步的状
态。
-执行快速自动模拟,即通过随机选择的绑定元素,并执行事件发生序列,而不用显示当前
每一步之间的状态。
-求一个CPN ML表达式的值(将在第6.6节中讲解 )。
当一个CPN模型在交互模式下被模拟,在每一个遇到的状态中,模拟器计算出一套使能的变
迁。然后,由用户在使能的变迁和绑定之间做出选择。图27显示了一个例子,展示用户对在
ReceivePacket变迁的使能绑定之间进行选择的过程中的情况。在使能的绑定之间的选择是通过
在变迁旁边打开的矩形盒子完成的。它列出了变迁的变量和在当前状态下绑定对应的值。在这种
情况下,值2已经被绑定到变量k上,而且值"COL"已被绑定到data上。由于这些变量只有一个可
能的选择,这由模拟器自动完成。对变量n和d,用户仍然可以选择其绑定的值。用户也可以把
选择留给模拟器去做,模拟器此时利用一个随机数发生器达到这个目的。在上述情况下,这对用
户绑定n和d中的一个值就够了,因为绑定到另一个变量的值是唯一确定的,并会自动由模拟器
绑定。
选择的绑定元素执行后,状态和使能信息被更新并提交给用户,这时用户要么选择一种新的
使能绑定元素或把选择留给模拟器,等等。这意味着是模拟器做了所有计算(对于使能的绑定元
素及他们的发生的产生的影响),是用户在不同发生序列之间做了选择(即,不同的行为场景)。
如果没有必要选择变量的某一特定的绑定,用户可以使用Single Step(单步)工具来执行一个单
一的变迁。该工具可用于不同对象,而且对于不同的目标对象有不同的效果。例如,如果该工具
被应用到一个使能的变迁,那么,特定的变迁将发生,而如果工具被应用于一个活页,那么在活
页里一个模块中一个随机选择的使能变迁将发生。一个互动模拟是自然是慢的,因为用户需要时
间去调查状态和使能绑定并在他们之间作出选择。这意味着每分钟只有几个步骤可以被执行,工
作风格与从传统的编程环境熟知的单步调试十分相似。
当一个CPN模型是在动画自动模式下模拟,模拟器计算出在每个遇到的状态中的一系列使能
的变迁。模拟器还在使能的变迁与绑定之间做出选择。模拟器反馈在一个动画自动模拟后的每一
步后被更新。Play(播放)工具,即在图28中从右边数第三个工具,有工具选项确定在一个动画
自动模拟中应该执行多少步骤,而且在每一步之间模拟器应该暂停多久。模拟器将完成指定数量
的步骤,除非它达到了一种状态,在这种状态下没有更多的使能变迁或直至模拟面板中Stop(停
止)工具被应用。
当一个CPN模型在快速自动模式下模拟,模拟器执行所有的计算并处理所有的选择。这种模
拟相似于一个程序的执行,并且时速几千步骤每秒是正常的。在一个快速自动模拟之前,用户指
明一个或多个停止标准,例如,10万步应该发生或模型时间中50,000单位应该逝去。如果其中
一个停止标准被满足或者如果没有更多的使能变迁,模拟停止且用户可检查已达到的状态。此外,
还有若干不同的方法,使用户可以通过检查在模拟过程中发生的状态和绑定元素。我们会在本节
结束时简单地回顾一下这个知识点。

27
协议模拟的例子,可能在图29中显示的状态Mdead停止。这是一种死状态,因为不再有使能
的变迁。由于CPN模型中的非决定性,我们不能保证死状态将被达到,因为可能不停丢失数据包
和确认。然而,如果我们碰到一个死状态,那将是图29中显示的状态。在这里,我们看到所有
六个数据包都已收到(按照正确的顺序)。发送器已经停止发送,因为NextSend有一个带有颜
色(colour)7的令牌,而不存在编号为7的数据包。所有连接网络与发送和接收器的库所A,B,
C和D都是空的。最后,库所NextRec 有一个带有颜色7的令牌。因此,这个状态代表协议系统的
理想的终点状态。通过对CPN模型作出一些自动模拟研究,有可能测试简单协议设计看来是正确
的。尽管进行了一系列自动模拟,我们仍不能保证在协议所有可能的执行已被包括。因此,一般
我们不能使用模拟,来验证协议的性质,但它是测试协议和定位错误的一项有力的技术。在第5
节我们将引入状态空间分析,从而有可能确保所有可能的执行都包括在内。这使人们有可能验证
系统,即证明不同的行为性质在模型中出现还是不存在。
就像在本节中前面所讲述的,用户可能有兴趣考察某些状态和在一次模拟中出现的某些绑定
元素。为了做到这一点,一个简单的(且强力的)的方式就是检查列出发生步骤的模拟报告。图
30显示了第2.4节中层次模型的一个模拟报告的开始部分。该报告显示了前3个发生的变迁。一
个模拟报告指出了在一个模拟过程中发生的变迁的名字,变迁所处的模块实例,以及如果报告需

28
要指出发生变迁的变量值的话的用户决定。在这种情况下,Sender模块1中的实例1中的
SendPacket变迁在发生在第1步,在Transmit模块2的实例2中的Transmit 变迁在发生在第2步,
Receiver模块中实例1中的ReceivePacket 变迁发生在第3步。在步骤编号后的数字0指明了变迁
发生的模型时刻。由于出现在2.4节中的简单协议的层次模型是不赋时的,所有步骤在时刻0发生。
简单的模拟工具选项可以指明一次模拟应在一定数目的步骤或一定量的模型时间后停止,但在许
多情况下,在特定的状态下,或在特定的变迁发生时停止模拟是有用的。在CPN Tools中,监视
器(monitors)可以用来检查在一次模拟过程中发生的绑定元素和达到的状态。不同种类的监视
器可用于不同目的,断点监视器(breakpoint monitors)可以用来当具体条件得到满足时停止模
拟。一个变迁使能监视器(transition enabled monitors)是一个标准的断点监测器,可以与一
个变迁关联,而且监视器当变迁使能时(或禁用,根据监视器选项所决定的)将停止一次模拟。
另一种标准断点监测器当某一特定库所的状态空(或非空,根据监视器选项所决定)时,可以用
来停止模拟。一个通用的断点监测器(generic breakpoint monitor)可以用来定义一个特定的模
型条件,这将决定模拟应当在何时停止。然后检查模拟过程中的某些步骤,看条件是否满足了。
每个监视器都有确定其功能的监控函数。对于变迁使能的监视器,监控函数对用户来说是隐
藏的。然而,对于通用断点监视器,监测函数是可访问的,而且它必须由用户进行修改。当一个
新的监视器创建时,访问监测函数的模板代码是自动生成的。模板代码必须修改,以获取期望的
行为。这意味着用户不必从头开始写出监控函数。一个监控函数往往由5-10行CPN ML代码构成。
每个监测器与模型中的一组包括零个或更多的库所以及一个或多个变迁的节点相关联。一个监视
器只能检查与其关联在一起的节点。对于一个通用的断点监测器,用户必须定义一个谓词函数
(predicate function)决定模拟应当何时停止。一个谓词函数将在经过一定的步骤后被调用,而且
在模拟应当停止时,它应该返回值true。
一个模型特定的断点监测器的例子是,如果发送器收到低于目前正在发送的序列号的数据包
的确认,将停止协议模拟。在这种情况下,监视器仅仅与ReceiveAck变迁相关联。这个监视器的
谓词函数,每次ReceiveAck变迁出现时被唤醒,如果赋给变量k的值大于变量n的值,它会返回
true。
一个监视器通过运用Monitoring(监视)面板(没有显示)中的一个工具到适当目标创建。
这个目标可以是一个单一的库所或变迁、一组节点,一全局组节点,或该模型的名称。注意监视
器可与来自不同模块的节点关联。监视器创建后,它将被添加到索引区中,在这里与监控相关的
不同类型信息可被查看和修改。图31将显示了为协议模块中的ReceiveAck变迁创建的一个通用
的断点监视器时,被添加到索引区中的信息。监视器概况显示了用户指定的监视器名称
(CheckReceivedAck),监测器的类型((通用)断点),与该监测器相关的节点,可访问的
监控函数。用于CheckReceivedAck监视器的谓词函数看起来如下:

fun pred
(Protocol’Receive_Ack (1, {k,n})) = n < k
由于这个监测器只与一个变迁关联,谓词函数只需要检查ReceiveAck 变迁的绑定元素。谓
词函数在CPN Tools中在ReceiveAck变迁发生后被自动调用,而且在模型中任何其他的变迁发生

29
时都不会被调用。函数检查变量n和k的值,并如上文所述比较他们。为进一步得到关于实施模
型特定的监视器的详情信息,我们可以参阅[10]。
也可以禁止监视器,这意味着有可能确定一个监视器在一次模拟中不会被启动,并且不需要
从模型中移除监视器。

5. 状态空间分析

模拟只能用来考虑被分析的模型的有限数目的操作。这使得模拟适合检查错误,并在该模型
以及系统的正确性中增加置信度。对于简单的协议,我们可以进行若干模拟,结果表明该协议模
型似乎总是终止在所有的数据包已按正确的秩序接收的理想状态。这使得看起来好像是协议正常
工作,但它并不能100%的保证该协议的正确性,因为我们不能保证模型涵盖了所有可能的执行。
因此,当在进行了一套模拟后,有可能依然存在导致模型的某种状态的操作,例如,数据包没有
按正确的顺序接收。
完全状态空间表示正在分析的模型的所有可能的操作。完全状态空间的基本思想是计算CPN
模型中所有可能达到的状态和状态变化(发生的绑定元素),并将这些表示在一个有向图里,在
该有向图中节点与系列可达状态相对应,弧与发生的绑定元素对应。CPN模型的状态空间可以完
全自动的计算出,并有可能使其自动验证,即,证明在数学意义上该模型具有一定的形式化指定
的特性。我们使用非层次化CPN模型展示状态空间和行为特性。不过,完全状态空间可以概括为
层次化的和赋时的CPN模型,而CPN Tools支持层次化的和赋时的CPN模型的完整状态空间。

5.1 为状态空间分析改进模型

为引入状态空间分析,我们考虑图1中的简单协议。在我们为协议模型建造一个状态空间之
前,我们会做一个小的修改。图1中的CPN模型有无穷的发生序列,在这个CPN模型中变迁
SendPacket一个接一个的发生了无限多次(无限多次的重传第一个包)。这意味着有无限多的
可达状态。为了获得有限数目的可达状态,我们限制可能同时驻留在网络缓冲库所A、B、C和D
上的令牌数目。这可以通过象图32中显示那样增加一个新的库所Limit,它有颜色集UNIT,定义
为:
colset UNIT = unit;
这里unit是基本的CPN ML中包含单值()的类型。Limit初始的状态是多态集3 '()。带有令牌
颜色()的令牌可以认为是"无颜色的"令牌,这里附加的值不携带信息(因为它只能取一种可能
的值)。直观地讲,每次一个数据包发送到网络上时,一个令牌被从库所Limit中删除,而每次
一个数据包被从网络上删除或丢失时,一个令牌被添加到库所Limit。这就是说,在五个库所A,
B,C,D和Limit上令牌的总数是常数,和Limit在初始状态中占有的令牌的数量相同。
显然,作出这样的修改改变了模块的行为,而且这应该小心的完成。然而,对有非常大的状
态空间的模型,为了增加我们在无限制模型的正确性上的置信度,分析模型受限制的行为往往是
有用。对于协议的例子,我们选择限制网络缓冲库所中令牌数量为3个令牌。这种配置允许数据
包相互赶超,而且还允许被放在缓冲库所中的重复的数据包。不过,它有意地限制数据包超越对
方的频度和缓冲库所中的重复的数据包的数目。如果分析表明,有限制的模型是正确的,那么,
这会增加我们对“无限制的模型也是正确”的置信度。同样,如果在有限制模型中发现错误,那
么同样的错误也存在于无限制的协议模型中。我们通过增加在有限制模型的缓冲库所中被允许的
令牌的数量,来获得额外的对无限制模型的行为的洞察力是不太可能的。另一方面,如果我们已
经限制有缓冲库所中的令牌的数量为1,那将不再可能让数据包彼此超越,也不会可能有重复数

30
据包在缓冲区中。在这种情况下,限制可能过于苛刻,有限制模型的行为将大大有别于无限制模
型。

5.2 完全状态空间

完全状态空间是一个有向图,其中每个可达状态有一个节点,而且每一个发生的绑定元素有
一个弧。有一个从代表状态M1的一个节点到代表状态M2的一个节点的标注绑定元素(t,b)的弧,
当且仅当绑定(t,b)在M1中使能并且其发生导致状态M2。
图33显示了图32中CPN模型状态空间的一个初始的片段。这个片段是通过使用CPN Tools中
支持可视化的状态空间的功能创建的。每个节点标注了3个整数。最上层整数是节点数,用一个
冒号隔开的两个整数给出了前趋和后继节点的数。节点1对应于最初的状态,图中显示了所有从
初始状态开始的最多经过三个绑定元素的发生达到的状态。
与每一个节点连接的矩形节点描述符(node descriptor)提供关于在节点所代表的状态里的单个
库所状态的信息。节点描述符列出所有有非空的状态的库所。我们省略了库所 PacketsToSend
的状态,因为这个库所总是包含6个与将被传送的数据包相对应的令牌。矩形弧描述符(arc
descriptor)与每个弧相关联,提供关于相应绑定元素的信息。节点和弧描述符都有缺省的内容,
但为用户提供了控制描述符内容的选项。
在最初的状态中,只有一个绑定元素(SendPacket,<n=1,d="COL">)使能,如果库所A
中还有一个带有颜色(1,"COL")的令牌,就会产生一个新状态,且库所Limit中的令牌比原来
少一个。否则,导致与初始状态相同的状态。在图33中,新的状态是由节点2代表的。在与节点
2对应的状态中,我们有3个使能的绑定元素:
SP = (SendPacket,<n=1,d="COL">)
TPsucc = (TransmitPacket,<n=1,d="COL",success=true>)
TPfail = (TransmitPacket,<n=1,d="COL",success=false>)
而且他们的发生产生的状态分别由节点3,4和1代表。CPN模型的完全状态空间有13,215个节点
和52,784条弧并远大于绘图所能方便表示的个数。然而,一个状态空间的绘画片段,就像图33
所示,可以是一个非常有效的分析在某一给定的状态条件下,在少数步骤内可达的状态的方法。
状态空间可以完全由CPN状态空间工具用状态空间构造算法自动计算。CPN Tools在内存中存有
代表状态空间的有向图。这就是说,只有电脑存储器可以放置下完全状态空间,完全状态空间才
能产生。该工具支持一系列停止和分支的选项,使用户可以控制状态空间产生。

31
32
在大多数情况下,完全状态空间的生成是在来源于状态空间的图结构的强连通部件图
(Strongly Connected Componet Graph(SCC-graph))生成后生成的。在SCC-graph中的节点
是子图,被称作强连通部件(SCCs)。他们通过使状态空间中不相连部分节点的划分得到,以
致于两个状态空间节点在同一个SCC中,当且仅当他们是相互可达的,即存在着一条在状态空间
中把第一点和第二节点相互连接的路径,反之亦然。SCC-graph被CPN Tools用来确定一些该模
型标准行为的性质(正如我们将在下面解释的),另外,SCC-graph结构经常给出关于被分析模
型的整体行为的有用信息。
用于生成,调查,和显示状态空间的工具可以在图34中显示的 CPN Tools的State Space(状态
空间)面板中找到。可用的工具(从左向右,自上而下)是:
-为状态空间分析生成特定模型的代码。
-生成一个状态空间。
-生成一个SCC-graph。
-存储一个状态空间报告。
-在状态空间中显示一个节点。
-显示状态空间节点的后继。
-显示状态空间节点的前驱。
-计算一个CPN ML表达式,返回一列状态空间节点或状态空间弧,并在状态空间中显示所产
生的节点和/或弧。
-显示在模拟器中与状态空间节点相对应的状态。
-将目前的模拟器状态添加到状态空间中。

5.3 状态空间报告

进行状态空间分析的第一步通常是得到一份状态空间报告(state space report),报告提供了一


些关于状态空间大小的基本信息,以及CPN模型的标准的行为性质。对于图32中的CPN模型,状
态空间报告看起来像在图35-39中显示的一样。首先,我们有一些状态空间统计信息(state space
statistics)(见图35),告诉我们状态空间是多大。对于协议模型,我们有13,215个节点和52,784
条弧。完全状态空间的构造需要53秒(在一台标准的个人电脑上)。我们还得到关于SCC-graph
的统计信息。它有5,013个节点和37,312个条弧,计算时间为2秒钟。事实上,在SCC-graph中的
节点比在状态空间中的少,这告诉我们,在简单协议的状态空间中存在着循环。这意味着我们可
以有无穷的发生序列,并且该协议可能没有终止。
接下来两部分状态空间报告包含了有界性属性(boundedness properties)的相关信息。有界性告
诉我们,考虑一切可能达到的状态时,一个库所可以持有多少(和哪些)令牌。

33
图36标明了确切的上、下两个整数界限。一个库所的最佳上界(best upper integer bound)具体
规定了可以在任何可达状态中,驻留在一个库所上的令牌的最大数量。库所DataReceived的最佳
上界是1,这意味着在DataReceived上最多有一个令牌,而且存在一个可达状态,在DataReceived
上有一个令牌。这就是我们所期望的,因为DataReceived假设要始终包含一个带有一种颜色的令
牌与已收到的数据相对应。库所A具有最佳上限整数值3,这意味着在任何可达状态中,最多有
三个令牌在A上,并存在着一个恰好A上有3个token的可达状态。对于库所B、C和D存在类似的
结论。这就是我们所期望的,因为我们通过引入Limit库所,修改了原模型,以确保在库所A、B、
C和D中同时最多有三个令牌。我们从这4个网络库所的最佳上限数可以得知,存在这样状态:在
网络一个缓冲区中,允许同时存在的最多数目的数据包。
一个库所的最佳整数下界(best lower integer bounds)说明在任何可达状态中可以驻留在
库所中的令牌的最少数量。库所DataReceived有一个最佳下界1,即总是至少有一个令牌在库所
上。最佳上界和最佳下界都是1,意味着恰好只有一个令牌在任何可达状态的一个库所中。当最
好的上界和最好下界相等,意味着该库所总是包含着同样多少的令牌(由两个整数边界值)—即
使这些令牌的颜色可能会有发生改变。作为一个例子,库所PacketsToSend总是恰好包含六个令
牌。库所A的最佳下界是0,即存在一个可达状态其中在这个上库所没有令牌。这对于库所B、C
和D也是一样适用的。
如上所述,忽略令牌的颜色,我们已经考虑了目前可能存在于一个库所上的令牌的最小和最
大数量。图37指明最佳上下多态集界限。这些界限不仅考虑有令牌的数量,而且令牌的颜色。
一个库所的最佳上界多态集界限为该库所的颜色集中的每一种颜色表明在任何可达状态中带有
给定的颜色的库所上出现的令牌的最大数量。这是作为一个多态集指明的,每个值的系数是带有
给定值的令牌的最大数量。
作为一个例子,在库所C有以下多态集作为最佳多态集上界:
3‘2 ++ 3‘3 ++ 3‘4 ++ 3‘5 ++ 3‘6 ++ 3‘7
这表明有在任何可达状态中最多有3个带有颜色2的令牌在C上(对于颜色3,4,5,6,7是同样
的)。它还指明,有三个带有颜色2的令牌的库所存在一个可达状态。C的最佳上限多态集也还
指明了,在库所上不可能有一个颜色为1的令牌。这是我们期望的,因为由接收器发出的确认总
是指定下一个预期的数据包,并且第一个数据包序号为1。
另一个例子,考虑库所DataReceived ,它有以下几个最佳多态集上界:
1‘"" ++ 1‘"COL" ++ 1‘"COLOUR" ++
1‘"COLOURED " ++ 1‘"COLOURED PET " ++
1‘"COLOURED PETRI " ++ 1‘"COLOURED PETRI NET"
这指明了在任何可达状态中DataReceived上颜色为" "的一个令牌的最大数(对于多态集中的其
他值也是一样的)。上述多态集的大小是7 --即使DataReceived在每个可达状态中有一个单一的
令牌,如图36中上下整数界所指明的那样。从最佳多态集上界和最佳整数上下界说明库所

34
DataReceived的可能状态是:
1‘""
1‘"COL"
1‘"COLOUR"
1‘"COLOURED"
1‘"COLOURED PET "
1‘"COLOURED PETRI "
1‘"COLOURED PETRI NET"

35
这对应于由发送器发送的数据的预期前缀。从有界性属性,我们不能得到这些状态达到的顺序。
以上我们已经展示了,整数和多态集界限常常告诉我们不同的和补充的"故事"。
DataReceived的整数界限告诉我们这个库所总是恰有一个令牌,但与这个令牌可能的颜色无关。
DataReceived的最佳多态集界限指明了我们可能会在这个库所上持有的令牌的颜色,但不是一次
只有一个令牌。应该指出的是,不能保证存在一个有多态集的可达状态等于最好多态集上界。 这
可以通过库所DataReceived说明。
一个库所的最佳多态集下界(best lower multi-set bound),为库所的颜色集中每一种颜色,
指出了出现在这个库所上的在任何可达状态中令牌的最小数目。这用多态集表示,其中就是给定
值(令牌颜色)的令牌的最小数量。因此,最佳多态集下界提供在给定库所的每种颜色大约有多
少个令牌。简单协议的库所,除了PacketsToSend,都有空多态集作为其多态集下界。这意味着
没有总是出现在这些库所上的令牌。但是,在没有令牌在这些库所上时,我们不能断定存在状态。
这由始终分别有一个令牌的DataReceived,NextSend,和NextRec展示出来。PacketToSend的
最佳多态集下界是:
1‘(1,"COL") ++ 1‘(2,"OUR") ++ 1‘(3,"ED ")++
1‘(4,"PET") ++ 1‘(5,"RI ") ++ 1‘(6,"NET")
这意味着在任何可达状态的PacketToSend中至少有一个颜色为(1,"COL")的令牌(对于多态
集中其他值也一样)。这跟期望的一样,因为当SendPacket发生时,从PacketsToSend中删除的
数据包就立即再次被返回。
图38显示了状态空间报告表明家属性(home properties)的一部分。家属性告诉我们存在着
一个单一的家状态(home marking),其中节点编号为4868。一个家状态Mhome是一个可从任何
可达状态达到的状态。这意味着不可能拥有不能被扩展到Mhome的发生序列。换言之,我们不能
做使其以后不能达到Mhome的事情。
在协议系统在,我们有单一的一个家状态。通过要求CPN Tools展示与状态空间中节点4868
相应的状态,我们得到图29中显示的状态。可以看出,这是协议已成功完成所有六个数据包传
输的状态。事实上,这是一个家状态,意味着当协议被执行时不管发生什么(例如,网络上的丢
包和包超越),它总是有可能达到所有六个数据包的传输任务被圆满完成的状态。应当指出的是,
我们只知道可以从任何可达状态M达到家状态Mhome。但不能保证Mhome真正从M达到,即有可能
存在从M开始但永远不能达到Mhome的发生序列。作为一个例子,简单协议有无穷的发生序列,
其中有一个绑定的TransmitPacket,紧跟SendPacket丢失数据包后,一个接一个的无限次的发生。
在这种情况下,我们绝不会达到图29中的状态。如果我们要排除这种行为,我们将引进一个计
数器限制每一个数据包重传的次数。

36
在图39中的活性指明有是一个单一的节点编号为4868的死状态(dead marking)。一个死状态是
没有使能的绑定元素的状态。这意味着与节点4868对应的状态既是一种家状态也是一种死状态。
节点4868是唯一死状态的事实告诉我们,这个协议,像CPN模型所指明的那样,是部分正确的—
如果执行终止,我们就会有正确的结果。此外,由于节点4868也是一个家状态,它总是有可能
终止,从而有正确的结果。可能有点令人惊奇的是,一个死状态可以是一个家状态。但因为任何
状态都可被他自己通过长度为零的平凡发生序列到达,所以是可能的。
图39表明不存在活变迁(live transition)。如果从任何可达状态我们总能找到一个包括此变
迁的发生序列,那么我们称这个变迁是活的。换句话说,我们不能做将会使此变迁以后不可能发
生的事。我们已经看到,我们的协议有一个死状态,而这就是它不能有任何活变迁的原因—没有
变迁可以被从死状态使能。
图39还指出,没有死变迁(dead transition)。一个变迁是死的,如果没有它可以使能的可
达标志。没有死变迁意味着在协议中的每个变迁有至少发生一次的可能性。如果一个模型有一个
死变迁,那么他们对应着模型永远不能被激活的部分。因此,我们可以不用改变模型的行为,就
从模型中排除死变迁。

5.4 查询函数

如上所述,我们已经讨论了状态空间报告的内容(除了那些所谓的公平性属性)。它是完全自动
产生的,它包含若干CPN模型进行分析的关键属性的信息。在状态空间报告中调查的行为属性,
是可以从任何模型中调查的标准属性。因此,状态空间报告往往是用户需要做的第一件事。然而,
用户可能还需要调查一些不属于状态空间报告一部分的那些非普通的属性。为此许多预定义查询
函数(query functions)可以在CPN Tools中使用,使用户可以编写自定义的依赖模型的查询。这
些查询都是用CPN ML编程语言书写。当计算该状态空间报告的内容时,CPN状态空间工具就应
用了这些预定义查询函数。CPN Tools额外包括一个函数库,使之能够按照一个时序逻辑[8]阐明
查询。
一个模型的例子具体说明了图32中CPN模型的查询将检查协议是否服从“停止-并-等待”策
略,即目前正在被发送器传送的数据包的序列号,是否等于接收器期望接收的序列号,或至多比
接收器期望接收的序列号少一。为此我们可以实现谓词函数StopWait,它提供一个状态,即状态
空间中的一个节点,检查发送方(由库所 NextSend上的令牌代表)的序列号是否等于或在最多
比接收方(由库所 NextRec上的令牌代表)的序列号少一。StopWait的实现的具体内容如下:
fun StopWait (n:Node) =
let
val Sender_Seq =
ms_to_col (Mark.Protocol’NextSend 1 n);
val Receiver_Seq =
ms_to_col (Mark.Protocol’NextRec 1 n);

37
in
(Sender_Seq = Receiver_Seq) orelse
(Sender_Seq = Receiver_Seq - 1)
end;
函数提取出由作为状态空间节点的参数n给出的当前状态中库所NextSend和NextRec上的令
牌的颜色。然后如上所述比较两序列号的值。StopWait谓词函数可以提供给查询函数
PredAllNodes,从而列出满足某一特定谓词的状态空间中的所有节点。令人惊讶的是,并非所有
的节点满足谓词。原因是确认可能在库所C和D上彼此超越,这意味着发送器可能会收到一个旧
的确认,并导致发送器序列号减小。使用由CPN Tools提供的查询函数ArcsInPath,很容易得到
一个相反的的例子,即从初始状态开始到谓词满足时引导的发生序列,并使用CPN Tools的绘图
工具使之可视化。
状态空间方法主要的优势之一是他们相对比较容易使用,并且他们自动化程度高。易用性
主要是因为状态空间方法可以对用户隐藏相当大一部分基本的复杂数学运算。这意味着很多时候
用户只须用公式化属性,属性将经过验证,然后应用电脑工具。状态空间的主要缺点是状态爆炸
问题〔35〕:即使是相对较小的系统的可达状态数目也可能已是一个天文数字或甚至无限多,
这对于使用状态空间方法来验证现实系统来说,是一个严重的问题。CPN Tools包括了大量的在
减轻状态空间爆炸问题及内在的基于状态空间验证问题的约简技术。这些先进的状态空间技术以
紧凑的形式代表性表示状态空间,或只表示状态空间的部分。状态空间在这种方式下的约简,仍
能够验证系统的属性。关于这些约简方法的讨论超出了本文件的范围,详情见如,[9,18,26,
27] 的文献。
赋时CPN模型的状态空间的定义方法和一个非赋时的CPN模型是类似的,除了在每个状态空
间节点对应一个赋时的状态,即赋时的多态集,以说明库所的标志和全局时钟的值。CPN Tools
还支持赋时CPN模型的状态空间分析。

6 性能分析

基于模拟的性能分析是通过与数据收集结合的自动模拟支持的。基于模拟的性能分析的基本思想
是进行一些较长时间的模型模拟,其中有关系统性能的数据被收集起来。提供有代表性的数据通
常如队列大小、数据包的延迟、各种组件的负载等信息。数据的收集是基于数据采集器监控器
(data collector monitors)的概念,允许用户指定何时及何种数据,在一系列自动化模拟的单步
骤期间要被收集。为了后期处理,数据能够被写在日志文件里,例如,在电子表格,或性能报告
(performance report)中,报告为所收集的数据保存总结性的关键数据,如平均值,标准差,和
置信区间。典型的基于模拟的性能分析通常使用批量模拟(batch simulation),使得无需用户干
情况下,探索模型的参数空间,并对每个参数配置,进行多次模拟以获得统计上的可靠的结果。
我们通过使用简单协议的赋时模型来说明性能分析。

6.1 性能分析的赋时模型

在我们讨论简单协议的性能分析之前,我们先为定时协议例子建立一个CPN层次模型。这个
模型包含一个,为将由发送器发送的数据包的达到的模块,和一个关于协议的模块。这两个模块
在图41-42中显示,他们与图40中的System模块连在一起。
让我们首先考虑发送器必须发送的数据包。当分析一个系统的性能时,人们常常感兴趣的
是当它处理某一特定的负载时测量一个系统的性能。例如,赋时协议的负载是数据包。通过CPN

38
模型,可以利用这两个固定的负载,在一个模拟的开始预定的负载和动态的负载。
在前面几节里,库所PacketsToSend的初始状态标注,已被用来确定到底哪些数据包应该被
发送。当调试模型或通过状态空间分析研究协议的逻辑正确性时,这在有限数量的数据包下审查
模型的行为是足够的。然而,这样一个协议不可能用来发送一个规模较小,数量固定的在一个缓
冲区中总是可用的数据包。如果数据包到达的速度远远超过他们可以被发送和确认的速度,那么
大量的数据包将会在发送器排成一个长队,而且从一个数据包到达到它被确认,将需要一个令人
无法接受的大量的时间。数据包的到达就会影响协议的性能,因此,这种行为应被精确建模。对
于这一个系统,考虑一个动态的负载是很有用的。
数据包的到达,可以在Arrivals模块中建模,见图41。库所Next上的单一的赋时令牌用来控
制新数据包的到达。令牌的颜色代表了下一个将到达的数据包的序列号,而且时间戳决定一个新
的数据包将在什么时候到达。在图41中的标志中,下一个数据包将在时刻838到达,且它会得到
序号5。当CreatePacket变迁发生时,添加到库所Next上的令牌的时间延迟,是由定义如下的
nextArrival函数决定的:
fun nextArrival() = discrete(200,220);

直观来看,由nextArrival函数返回的值,代表了在下一个数据包到达前需要的时间。在这里,使
用了离散(discrete)概率分布函数,在CPN Tools中支持大量概率分布函数,包括均匀分布、正
态分布、Erlang分布和指数分布等。
当进行性能分析时,测量不同事件之间所花费的时间往往是我们感兴趣的。在赋时协议例子
中,测量从一个数据包到达发送器,直至数据包被接收器接收所花费的时间是我们感兴趣的。为
了能够做到这一点必须能够纪录和记住第一个事件发生的时间。在一个CPN模型中,记录这种信
息最容易的方法就是把它包含在令牌的值中。如下所示的颜色集DATAPACKET是用来为数据包建
模的。在这里,一个数据包的令牌颜色是一个三元组,包括一个序列号、数据内容、以及数据包
到达的时间。到达的时间是由整数颜色集TOA表达的。
colset TOA = int;
var t : TOA;
colset DATAPACKET = product NO*DATA*TOA timed;
当CreatePacket 变迁发生,一个新的数据包由返回一个类型为DATAPACKET的值的
newDataPacket函数(未显示)生成,即一个三元组。新数据包的序列号是由图41中的参数n决
定的,并且数据包到达的时间将等同于变迁发生的模型时间。
图42显示的一个赋时协议的变量,协议中的数据包在他们已确认后被丢弃。变迁

39
RemovePacket在数据包被确认后,从库所PacketsToSend中将他们删除。变迁左上角的标注,
即标注[n<k],是变迁的警卫。这个警卫确保只有序列号比NextSend上的序列号小的数据包从库
所PacketsToSend中删除。在从PacketsToSend到RemovePacket的弧上的时间延迟标注允许令牌
被提前从库所PacketsToSend中删除。从ReceiveAck到NextSend的弧标注也已经改变,使在
NextSend上的序列号不会减小。这就是说如果收到重复确认,发送器将不会重传已被接收器收
到的数据包。

数据包的丢失的表示也有某种程度的改变。对于图14中模型的自动模拟,变迁
TransmitPacket的变量success在每次变迁发生时会随机的赋值为true或false,而且这两个值是等
可能的。或者换句话说,大约有50%的数据包将在自动模拟过程中丢失。许多网络比这个更可
靠,所以在研究协议的性能时,更准确的表示损失率是很重要的。在图42中ok函数决定一个数
据包是被成功发送或丢失:
fun ok() = uniform(0.0,1.0) <= 0.9;
统一分布函数将返回一个0.0和1.0之间的随机值,而且所有在这个区间的值都有相同的被选中的
概率。ok函数决定数据包被成功传送的机会为90%。确认的丢失也用类似的方式建模。因为丢
失的数据包越少,就没有必要再经常重传数据包。因此,常量Wait的值已被改为175。

6.2 性能测量和数据收集

还有一些有趣的关于赋时协议例子的性能测度。例如,人们可能有兴趣知道,在一次模拟
中接收器收到多少个数据包或有多少重复的数据包。测量被发送的数量包的数量将表明在发送器
端是否有大量数据包。在这个例子中,数据包的延迟时间是从一个数据包到达发送器直到它被接
收器正确接收所花费的时间。计算平均及最大包延迟将指出数据包是否被及时接收。
这种性能测度,可以基于一次模拟中,从一个CPN模型中提取或收集的数值数据计算出。在
CPN Tools中,数据采集器监视器用于这一目的。就如我们将看到的,数值数据可以提取自发生
的绑定元素和一次模拟中到达的状态。不同类型的数据采集器监视器可用于不同的目的。对于任
意CPN模型,都存在可用的标准的或预定义的数据采集器监控器。我们还将看到特定模型的用户
定义的或搜集信息的通用数据采集器的例子。数据采集器监视器由监测(Monitoring)面板中的
工具创建,并且他们可以通过克隆和修改已存在的数据采集器监视器来创建。
计算有接收器收到的数据包的数量,仅仅是计算ReceivePacket变迁在一次模拟中出现的次数。
在CPN Tools中一个计量变迁发生监视器(count transition occurrences monitor)是一个仅为此目

40
的设立的标准监测器。用于计算接收到的数据包的个数的监视器被命名为RECEIVEDPACKETS。
在模型中,当ReceivePacket变迁同一个n≠k的绑定元素一起出现时,就会收到一个重复的数据
包。通用数据采集器监视器(Generic data collector monitors),可用来收集CPN模型中任何形式
的数值数据。这种监视器的行为,是由其中用户可访问的监测函数决定的。这里,我们将使用一
个通用数据采集器,监测通过计算一个具有特别绑定的变迁的出现次数,来计算接收到的重复的
数据包的数量。该检测器被命名为RECEIVEDDUPLICATEPACKETS。
因此,我们需要能够为RECEIVEDDUPLICATEPACKETS监视器确定至少两件事:1)为了更
新重复数据包的计数器,数据应该在什么时候从模型中收集,和2)计数器的增加值为多少。这
个功能是由数据采集器监视器的监测函数决定的。
在数据采集器监视器里,一个谓词函数(predicate function)将被定期调用,而且每当监视
器应该从模型收集数据时它应该返回值true。这个RECEIVEDDUPLICATEPACKETS监视器的谓词
函数看起来是这样的:
fun pred (Protocol’Receive_Packet (1,{d,data,k,n,t})) =true

谓词函数可以检查变迁的变量的绑定,但这里是定义好的,因此它忽略了变量的绑定。每次
ReceivePacket发生时该函数都返回true。
在一个数据采集监测器中,一个观察函数(observation function)从模型中收集数值数据。每一
次同一个检测器的谓词函数被调用并返回true时,一个观察函数都会被调用。以下观测函数收集
用来计算接收到的重复的数据包个数的数据:
fun obs (Protocol’Receive_Packet (1, {d,data,k,n,t})) =
if n=k then 0 else 1

上述的谓词函数决定这个观测函数在每次ReceivePacket发生时将被调用。每当一个重复的
数据包被接收器接收时此函数将返回1,并且当一个数据包第一次被接时返回0。由观测函数返
回的数据值用于计算统计值,如收集到的数据的总和,平均值,和最高值。由检测器收集的数据
值的总和将表明在一次模拟中有多少重复的数据包被接收到。数据值的平均值将是重复的数据包
在所有接收到的数据包中所占比例成比例。
每一个数据采集器监测器有两个附加的监测函数:一个初始化函数(initialisation function)和一
个终止函数(stop function)。该初始化函数可以用来从模型的初始状态中收集数据。同样,停
止函数,可以用来一次模拟的最后状态中搜集数据。初始化和终止函数不能用来从绑定元素中搜
集数据。对于RECEIVEDDUPLICATEPACKETS监测器,初始化函数和终止函数都不用从状态中收
集数据。
我们定义另一种被称为PACKETDELAY的通用数据采集器监控器,从发生的绑定元素中收集
数据。它定义来测量包延迟,并计算平均及最高包延迟。当ReceivePacket变迁发生(见图42)
时,变量t与正在接收的数据包的到达时间相对应,而且此值可用于计算包延迟。这个数据采集
器监视器只与ReceivePacket 变迁相关联。
这个检测器的预测函数恰好与RECEIVEDDUPLICATEPACKETS检测器的谓词函数相同。用于
测量包延迟的观测函数,从变迁发生的模型时间减去数据包到达时间t,加上接收数据包需要的
时间(17)(因为用于接收数据包的时间延迟应该包括在包延迟中)。该初始化和停止函数不
用来从状态中搜集数据。
我们已经看到了一些关于数据采集器监视器,如何从在一次模拟过程中发生的绑定元素中
搜集信息的例子。现在我们将看看监视器如何从一次模拟到达的状态中搜集信息。
在某一特定状态中的库所PacketsToSend的令牌数与将要发送的数据包的数量相同。在CPN
Tools中,一个状态大小检测器(marking size monitor)是一个用来测量在一次模拟中一个库所上
的令牌数目的标准监测器。这种检测器可以计算出一次模拟中一个库所上的令牌数目的平均值和
最大值。我们将使用一个名为PACKETSTOSEND的状态大小检测器测量在一次模拟中库所

41
PacketsToSend上有多少令牌,并计算出在一次模拟中被发送的数据包数量的平均值和最大值。
测量一个库所上的令牌数量的一个方法,就是计算在初始状态中一个库所上令牌数量,和
一次模拟中每一步后的令牌数量。如果模型是非赋时的,那么这是一个收集用于计算一个库所上
的令牌数量平均值的好办法,而且事实上一个非赋时模型的状态大小检测器就是使用的这种技
术。
然而,对于一个赋时模型,当计算一个库所上的令牌的数量的平均值时,它通常希望使用
时间的信息。如果我们计算发送的数据包的时间平均(time-average)数量,这样的时间信息将
被考虑。时间平均值就是指由在一次有许多数据包需要发送的模拟中,可能的数据包的加权平均
数量,由时间的比重进行加权(0,1,2,……)。在计算时间平均值时,只要当库所周围的一
个变迁发生时,衡量这个库所上的令牌的数量就足够了。当令牌的数量被测量后,直到令牌的数
量被再次测量,模型时间的经过的间隔用来为第一次测量加权。一个赋时模型的状态大小监视器
使用这种技术。
我们定义另一种被称为WAITINGFORTRANSMISSION通用数据采集器检测器,来计算等待
传送的数据包和确认的时间平均值。或者换句话说,它计算库所A和C上令牌数量的总和。因为
它计算这两个库所上的令牌的时间平均数,当一个与这两个库所中的任意一个连接的变迁发生
时,测量令牌数量就足够了。检测器与下列节点相关联:库所A和C、变迁SendPacket、
TransmitPacket、ReceivePacket和TransmitAck。只当一个变迁发生时谓词函数才会被调用,而
且不论什么时候调用这个函数,它都将返回true。观察函数返回两个库所上的令牌的总数:
fun obs (bindelem, Protocol’A_1_mark : DATAPACKET tms,Protocol’C_1_mark : NO tms) =
(size Protocol’A_1_mark) + (size Protocol’C_1_mark)

WAITINGFORTRANSMISSION检测器的初始化和终止函数与检测器的观测函数相类似。
通用数据采集器监视器在模拟中无须定期搜集信息。对于赋时协议的例子,我们更想计算
吞吐量作为接收器每秒收到的独特的数据包的数量。这可以在模拟结束时,通过用模拟时间内收
到的数据包的数量,除以用秒表示的模拟时间计算出。在这个模型中,一秒钟等于模型时间的
1000单位。被命名为THROUGHPUT的通用数据采集器检测器的终止函数是用来计算吞吐量的。
有必要定义THROUGHPUT检测器的谓词函数、观察函数、初始化函数,即使这些函数不会被用
来收集数据。

6.3 统计

由于大多数模拟模型含有随机行为,模拟输出的数据也是随机的,因此当解释和分析输出
数据时必须谨慎。性能测度是通过计算在模拟中由数据收集器检测器收集的数据统计估计的。下
面我们给出一个应用CPN Tools进行性能分析时,使用的一些统计概念的非常简短说明。如果要
更详细地了解统计请参看一本关于统计或模拟的教科书上,如[28]或[2]。
与离散数据值收集有关的计算统计,称为离散参数统计(discrete-parameter statistics)[22]。
例如,平均包延迟定义为与大量离散观测Di相对应,其中Di是模拟中第i个收到的数据包的延迟。

42
如在上一节讨论的,等待发送的数据包的时间平均量,等于库所PacketsToSend上令牌的时
间平均量。这是一个与平均包延迟相比不同类的"平均",因为时间平均被(连续)时间接管,而
不是被数据包(离散的)接管。时间平均是连续时间统计(continuoustime statistic)的一个例子。
直观地看,连续时间统计那些在模拟中,测量得到的(时间)平均,最小值,最大值或其他东西
的图示,其中x轴是连续时间[22]。
一个数据采集器检测器可以计算(正常)平均或时间平均。一个计算(正常)平均的检测
器被认为可以计算离散参数统计。一个计算时间平均的检测器,被认为可以计算连续时间的统计。
这两种监测器都可以计算若干不同的统计,包括:计数(观测的数量)、最小值、最大值、总和、
平均值。每一个数据采集监测器有预定义的函数,可用来获取用于检测器计算的统计数字,如
count,sum,avrg,max。
重要的是要记住运行不同的模拟将导致不同的性能评价的估计。置信区间(Confidence
intervals)常常被用来评估性能测度估计的准确性。精确的置信区间只能用于计算独立同分布
(IID)的数据值。直观地看,如果他们彼此不相关,并且如果他们有相同的概率分布,那么数
据值是IID。CPN Tools可以计算90%,95%,和99%的置信区间。图43显示了平均包延迟的95%
置信区间,随着从增加的模拟次数中得到等多的IID估计,而包延迟怎样普遍减少的例子。
由于所有由一个单一的数据采集器检测器收集到的数据不太可能是IID,有必要寻找另一种
收集性能测度的IID估计的方法。一种广泛使用的方法是,从一个独立的,模拟重复(simulation
replications)的方法收集IID估计,这里从同一个初始状态开始,同一个停止准则完成时停止。
例如,对于赋时协议例子的模拟重复,都可以在1000个数据包被收到后,或经过一小时模型时
间后停止。
批量均值法(batch-means method)是另一种获取性能测度的IID估计的常用技术。在该方法
中,性能测度的IID估计来自一个单一的长时间模拟中的数据值。方法后面的思路是将单独的观
测分组成一些批次,来计算每一批次内的平均观测值,然后用每个批次中的平均观测值做为性能
测度的IID估计。
正如我们将在6.5节看到的,决定IID估计是应从模拟复制或从批量均值法得到,依赖于将要
完成的模拟实验的类型。

43
6.4 性能输出

可为数据采集器监视器产生几种不同类型的输出。在本节中,我们将看到一些与性能相关
的输出的实例,包括日志文件,统计报告,和绘制数据值的脚本。
所有由一个数据采集器收集的数据可以被保存在一个数据采集器日志文件(data collector
log file)中。日志文件还包括数据被采集的步骤和模型时间的有关信息。数据采集器检测器的一
个选项决定是否应该为检测器产生日志文件。图44显示的一个PACKETSTOSEND检测器的日志文
件的例子。图44的最后一行表明发生在模型时刻220的第9模拟步之后,库所PacketsToSend上有
一个令牌,而且这是第6次测量该库所上的令牌数目。检测器要测量一个库所上的令牌的数量,
每次都是当这个库所周围的一个变迁发生时。因为当SendPacket变迁发生时,一个库所上令牌
的数目未发生改变,由检测器收集的连续的数据值可能与可以在图44第一栏中见到的值相同。
最后两栏表明经过不同的模拟步骤之后,发生在同一模型时刻可能不只一个数据值被收集。

数据采集器的日志文件可在一次模拟完成后进行后处理。举例来说,他们可以输入到一个
电子表格或被绘制。CPN Tools为绘制数据采集器的日志文件产生gnuplot程序[14]的脚本。图45
显示的一个关于PACKETSTOSEND检视器的日志文件如何用gnuplot绘制的例子。这个图通过一
个由CPN Tools生成的脚本修改版自动生成的。
用于数据采集器监测器计算的统计数字以不同类型的报告保存。一个模拟性能报告
(simulation performance report)包括,用于在一次模拟中由数据收集器收集的数据计算的统计
数字。图46显示从模拟执行性能报告中的统计数字。在接收器收到1000个数据包后,模拟停止。
除了统计数字,该报告包括一些信息(图46中没有显示),表明该模拟停止在执行了6916个模

44
拟步骤后,模型时刻188775处。
图46的上半部分显示了模拟性能报告中连续时间统计数字。有5种不同的统计数据栏。用户
可以决定在一个模拟性能报告中应包括哪些统计数字。PACKETSTOSEND检测器的统计数字表明
要发送的数据包的时间平均数为1.57,并且要发送的数据包的最大时间数为7。该检测器的计数
统计表明收集了2911个数据值,即测量了2911次库所PacketsToSend上的令牌的数目。在模型
时间0检测器第一次测量令牌的数量。WAITINGFORTRANSMISSION监测器的时间平均表明,等
待被传送的数据包的时间平均数,即在库所A和C上令牌的时间平均数,为0.14。

图46下半部分显示了模拟性能报告的离散参数统计。PACKETDEALY检测器的计数统计表明
检测器测量了1000个数据包的包延迟。平均包延迟是273.26,最低和最高包延迟分别是51和
1275。注意不是模拟报告中所有的统计数字都有用,举例来说,RECEIVEDPACKETS检测器的平
均值,最低值,和最高值都不是我们感兴趣的问题,总和和计数统计得到同样的值,即模拟期间
收到的数据包的总数。RECEIVEDDUPLICATEPACKETS检测器的统计数字表明:1000个收到的数
据包中有102个是重复的。最后,模拟的吞吐量为每一千个时间单位4.76个数据包,即每秒。记
得吞吐量由一个检测器终止函数在一次模拟的最后计算的,而这也解释了为何检测器的计数统计
是1,和为什么检测器的总和、平均值、最小值和最大值都是一样的。
性能分析报告的统计数字是不可靠的,因为他们只是各种不同的性能测量的一个估计。如
果另一次模拟被运行,将获得的不同的统计。一个可靠的性能分析估计可以通过计算性能分析的
一组IID估计的平均置信区间得到。例如,平均包延迟的IID估计可通过在CPN Tools中运行一些
独立的模拟复制获得。这种IID估计也可以被保存在日志文件中。图47显示了1000个数据包的平
均包延迟的五个模拟复制的IID估计。这个数据可以用来为赋时协议例子的平均包延迟的一个可
靠的估计计算置信区间。
另一个性能报告包括基于IID数据值的性能分析的可靠的估计。图48显示了这种性能报告的
节录。通过数字显示出来的统计,是为从五个模拟同步中收集的性能分析的IID估计计算的。95%
Half Width栏中的一个值等于在同一行中的平均值的95%置信区间的长度的一半。例如,图47
中的数据被用来计算在Packet_Delay标题下的avrg_iid行的统计数,而且基于五个模拟的数据的
平均分组延迟的95%置信区间是240.71 ±41.39。有些,但很少是全部,性能报告中的统计会提
供对于模型的有用的性能分析。

45
6.5 进行模拟实验

由于不同的原因进行性能分析研究,例如,为了评估现有的或计划中的系统,为了比较另
一种可选的配置,或者为了找到一个系统的一种最优配置。实验性的设计[28]是研究确定哪些场
景将被模拟,以及每个场景将如何在模拟研究中被模拟的。当决定运行多少模拟,以及为一个场
景中每个模拟运行多久时,有必要考虑正在被建模的是什么样的系统,而且这个模拟研究的目的
是什么。有两种系统,终止系统(terminating systems)和非终止系统(non-terminating systems),
这将会在下面介绍。我们下面将看到,不同的统计技术是用来分析这些不同种类系统的。
终止系统的特点是具有固定起动条件,和标志着系统结束的自然发生事件。一个终止系统
的例子,一家银行的一个营业日,上午十点开始和下午四点结束。模拟终止系统的目的是要认识
在某一段时间内他们的行为,而这也就是所谓的研究系统的瞬态行为(transient behaviour)。
终止模拟(Terminating simulations)可用来模拟终止系统。如果系统是一个终止系统,那么
终止模拟的长度要么是由系统本身确定的,要么是由模拟研究的目的决定的。一次终止模拟的长
度可由一个固定长度的时间确定,例如,6个小时,或者可由一些条件确定,例如,第十个客户
的离开。模拟复制通常用来为终止模拟收集性能测量的IID估计。
在一个非终止系统中,系统的持续是无限的。互联网就是一个非终止系统的例子。非终止
模拟(Non-terminating simulations)用于模拟非终止系统。在非终止模拟中,没有表明模拟结束
的事件,而且这种模拟通常用于调查一个系统的长期行为。非终止模拟当然必须停止在某一点上,
而且这是确定一个非终止模拟的适当期限的一个不小的问题。
如果一个非终止系统的行为变得在某一点上相当稳定,然后有使用非终止模拟分析该系统
的稳定状态行为(steady-state behaviour)的简单技术。确定何时,或者是否,一个模型达到稳
定状态,也是一个复杂的问题。关于稳定状态模拟的性能测量的IID估计,往往在长期模拟中通
过运用批量方式的方法得到的。
能够定义一个数据不应该在模拟的一开始被收集的热身期(warmup period),往往是有用

46
的。当用非终止模拟分析稳定状态行为时,热身期用来忽略模型达到稳定状态期间的模型的行为。
为终止模拟界定热身期这也是有用的。

6.6 模型参数及对比配置

基于模拟的性能分析通常被用来比较一个系统不同的场景或配置。一个CP-net的性能往往
依赖几个参数。举例来说,赋时协议例子的性能是受确定数据包被发送成功的概率、数据包到达
之间的最小次数及最大次数,甚至数据包交替到达次数的分布参数决定的。改变这些参数会改变
的模型的性能。在模型原来的版本,这些参数时硬编码到函数中的,例如ok函数:
fun ok() = uniform(0.0,1.0) <= 0.9;
一个包会被成功发送的概率是90%,就像由ok函数中的0.9确定的。这个参数可以通过ok函数的
声明来改变。在CPN Tools中,这些改变需要依赖于声明的语法和依赖声明的模型的部分的再次
审核。因此作出这种改变是费时间的,尤其是大的网络中的大部份必须重新审核时。如果参数是
用这种方法定义的,那么无需用户进行手工交互而自动模拟多项配置是不可能。
如果参数被定义为引用变量(reference variables),这些问题就可以避免。可以改变一个被
声明为引用变量的参数值而不需复检验模型任何一个部份的语法。这里是一个决定数据包转发成
功的概率的引用变量的声明,而且ok函数使用了引用变量:
globref successrate = 0.9;
fun ok() = uniform(0.0,1.0) <= !successrate;
关键字globref表明,一个全局引用变量正被声明,即该引用变量可以被CP-net的任何部分使用。
引用变量的名称是successrate,及引用变量最初的内容是0.9。该!函数是用来访问一个引用变
量的内容的。图49显示了successrate的值是怎样改为0.75的,可以通过使用模拟工具面板(图
28中显示的)上的Evaluate ML(计算ML表达式)工具,并运用该工具到一个辅助文本实现。一
个参数的值也可以在一个函数中改变。如果模型参数被声明为引用变量,那就是很容易改变各种
参数的值,并自动模拟不同模型的配置。
如果一个模拟研究的场景不是预先确定的,那么这项研究的目的可能是查找在一个特定的
性能测量中最具影响力的参数或寻找系统中的重要参数。敏感性分析(Sensitivity analysis)〔23〕
调查参数的极值是如何影响性能评价的。梯度估计(Gradient estimation)[28]研究将数值参数的
小变动是如何影响系统性能的。优化(Optimisation)[1]往往只是比较可选配置的一个复杂形式,
因为它是一个希望找到给出最好的结果的结合,而尝试不同参数组合系统的方法。

7 可视化

尽管CPN建模语言支持抽象和模块的概念,在许多情况下还有可能在构造的CPN模型中存在
大量的细节。此外,在一次模拟中观察每一个单独的步骤对于调查一个模型的行为来说往往过于
详细,尤其是对那些大型CPN模型。详细程度是有一个限度的,特别是当与不熟悉CPN建模语言
的同事介绍和讨论一个CPN模型时。动画图形和可视化的想法是向CPN模型中增加高层次的图
形。这意味着来自模拟的反馈,可在一个较适中的程度上,使用应用领域的概念获得,而且用这

47
种方法,基本的形式化的CPN模型对于观察者来说是完全透明的。
CPN Tools可以与支持建立CPN模型顶层特定领域图形的BRITNeY Suite动画工具〔37〕进行
交互。动画工具通过动画插入式结构支持多种类型图。下面我们举两个动画工具如何用来创建特
定领域图形的例子。其中一个例子是使用消息序列图(MSCs)说明在简单协议中消息的交换。
第二个例子说明它是怎样通过与特定系统图形的交互,提供输入并控制CPN模型的模拟的。我们
用前面显示在图1中的CPN模型作为两个例子的基础。

7.1 消息序列图

图50显示在简单协议的CPN模型的一次模拟期间生成的MSC的例子。MSC有四个栏目。最左
边一栏代表发送器,最右边一栏代表接收器。中间两栏分别代表网络的发送方一侧和接收方一侧。
MSC捕捉了一个场景,即第一个由发送器发送的数据包被丢失,而当时造成数据包重传的发生。
被重传的发数据包然后成功地传输到接收器,并且相应的确认被发送器成功收到。

执行CPN模型的图形反馈,是通过向CPN模型中的变迁附加代码段(code segments)实现的。
一个代码段包括一段顺序CPN ML代码,这段代码每当CPN模型中相应的变迁在模拟中发生时就
被执行。作为一个例子,变迁SendPacket附有以下代码段:
input (n,d);
output ();
action
msc.addEvent
("Sender","Network 1",NOxDATA.mkstr(n,d))

48
代码段提供通过代码段的输入部分供赋给变量n和d的值。然后该代码段使用提供的
msc.addEvent函数,使用动画工具创建一个从发送器栏到Network1栏的事件,标签贴有赋给变
量n和d的值。函数NOxDATA.mkstr把(n,d)对变换成相应用来标注MSC弧的字符串。代码段
的输出部分在此代码段中没有用到,但它的用途将在下小节中展现。CPN模型的其他变迁也有类
似的代码段。每一个代码段本质上由适当的动画工具中原语调用构成。代码段的另一种使用,是
用用户自定义的检测器(user-defined monitor),来调用依赖于那个变迁发生的适当原语。对于
用户自定义的检测器的进一步的细节,请参照[10]。

7.2 交互图形

图51显示了一个基于SceneBeans框架〔32〕的,用一个动画插件创建的特定系统动画图形
的例子。图解说明了由简单协议的CPN模型建模的系统。左边的计算机代表发送器,右边的计算
机代表了接收器。中间的云代表网络。当一个模拟开始时,模态对话框弹出,允许观察者输入将
由发送器转发给接收器的文本字符串。在这种情况下,文本字符串"Coloured Petri Nets"被输入。
如图52所示,模态对话框是通过加入一个连接到PacketsToSend的变迁Init创建的。该Init变迁是
在初始状态中唯一使能的变迁,而且当它发生时从库所Init中删除颜色为()的令牌,执行所附
的代码段,并在库所PacketsToSend上按照用户在模态对话框中输入的字符串创建数据包。Init
变迁的代码段中的函数setupVisualisation(未显示)调用动画工具中的原语创建模态对话框,并

49
返回输入的字符串。输入的字符串将赋给在代码段输出部分中用到的变量data。赋给data的字符
串,被用来作为CreatePackets函数的参数。CreatePackets函数将字符串分裂变成相应的数据包。
发送端计算机上面的文字表明将被发送的文本字符串,并因此成为库所PacketsToSend的一
个状态。同样,接收端计算机上面的文字表明被接收器接收的文本,并因此成为库所
DataReceived的一个状态。发送器和接收器上面的两个计数器分别代表库所 NextSend和
NextRec上的令牌的值。网络云边缘的四个数字代表在网络库所A,B,C和D上的令牌的数目。
在网络上面的数据包(1,"Col"),显示了一个目前正在网络上传输的数据包。中间在数据包下
面的两个正方形盒子(着色为绿色和红色)让用户决定是将数据包丢失(如果用户点击红色正方
形)或成功传送(如果用户点击绿色正方形)。这说明它是如何实现通过动画图形给一个正在进
行的模拟提供输入的。图51中显示MSCs的方法的交互图形是用一个类似的方法完成的,是将调
用动画原语的代码段附加到CPN模型的变迁上实现的。唯一不同的是,代码段从一个不同的动画
插件引用原语。此外,交互图形有一个描述了动画中的不同元素,即计算机,网络云,标签,和
按钮的XML场景文件。[6,37]中有关于动画工具的进一步详细介绍。

8 结论

为了应付现代并发系统的复杂性,在系统的实现和部署之前,提供系统设计的中央部分的
调试和测试的方法是很重要的。其中应对开发并发系统的挑战的一个方法是建立一个可执行的系
统模型。构建模型并模拟它,往往导致关于被考虑的系统的设计和执行的重大的新见解,并常常
产生一个更简单和更新型的设计。此外,构建一个可执行的模型,通常导致一个更完整的设计规
范,并使对场景的系统调查成为可能,以此可以显着减少设计中错误的数量。系统设计模型的构
建,通常意味着在系统开发早期阶段,即,需求工程、设计和规范化,需要付出更多的努力。在
大多数情况下,这笔额外的投资,因为由能够在执行之前得到的对系统性能的额外洞察而被证明
是必要的。此外,在需求阶段和设计阶段,而不是在执行、测试和部署阶段,许多设计上问题和
错误可以被发现和解决。最后,在大多数情况下,模型比传统设计文件更简单和更完整,这意味
着模型的构建和探索已经为实现工作奠定了一个更坚实的基础。这可能反过来缩短实施和测试阶
段,显著降低在最后的系统中的缺陷的数量。
CP-nets的发展已被发展一个工业价值的建模语言的需求驱动——同时,在理论上有充分依
据并且足够通用,可以在典型工业项目中发现的系统的规模和复杂性的实践中使用。然而CP-nets
不是一个旨在取代其他建模语言(如UML)的建模语言。我们认为它应该被用来作为一种对现有
的建模语言和方法的补充,并能和其他建模语言结合起来使用,甚至融入他们。高层次Petri网是
一个ISO/IEC(国际标准化组织/国际电工委员会)的标准[3] ,而且CPN建模语言和支持的计算
机工具符合这个标准。CP-nets的实际应用通常依赖于交互的和自动的模拟的组合、可视化、状
态空间分析和性能分析。这些活动,因为考虑了感觉上系统具有期望的性能,我们对系统的高度
信心与深刻理解而被证明是正确的,从而共同构成了系统的验证。CPN模型可以用来验证功能/
逻辑的正确性及一个系统的性能研究。这节省了很多时间,因为我们不需要构建两个完全独立的
系统模型。相反我们可以使用一个单一的模型或(更经常)非常密切相关的两个模型。存在一批
被广泛用于系统的性能分析的建模语言,例如,排队论。不过,大部份的建模语言在当他们用于
建模和验证系统的逻辑性质时又被证明相当没有用。这这些建模语言中的许多还不能应付存在不
常规行为的系统的性能分析。
本文已给出了关于CPN建模语言和相关分析方法的简要介绍。对一个建模语言和分析方法的
完整的处理感兴趣的读者可以参考[16,17,19]或即将出版的书[21]。与[21]有关的网站也包含了
广泛的关于系统的学习CP-nets和CPN Tools的幻灯片、练习和方案。关于使用CPN Tools的进一
步的详细信息可以通过包含有一个精心设计的用户使用手册,使用指南,以及其他CPN模型的例

50
子的[10] 找到。CPN Tools网站也解释了如何获得CPN Tools的许可证。除了在本文中介绍的,
CPN Tools进一步包括为不同目的大量函数库。其中一个例子是在CPN模型与外部应用程序之间
的TCP/IP对应的Comms/CPN[13]。 CPN Tools普遍有一个允许用户扩展其功能的架构,如试验
新的状态空间方法。因此,除了作为建模和验证的工具,它也为那些对研究试验新的分析算法感
兴趣的用户提供了一个原型试验环境。
我们已经说明了用于一个简单协议的建模与验证的CP-nets的使用方法。有兴趣进一步了解
CPN模型和CPN Tools的工业用途的读者可以参看[12,19,21,25],每年的CPN工作区的会议论文
[20],及关于程序理论及petri网的应用的年会的论文[15]。

鸣谢

有许多人,用他们的分析方法,和他们的工具支持对CP-nets发展产生了巨大影响。不幸的是,
我们不能在这里把他们全都提及,但我们非常感谢他们所做的巨大贡献。我们要感谢CPN Tools
的一些开发者。特别是在CPN Tools和它的前身Design/CPN的发展中起关键作用的Soen
Christensen and Kjeld Hoyer Mortensen,在设计CPN Tools的GUI中发挥了核心作用的Michel
Beudouin-Lafon 和 Wendy E.Mackay,以及从项目的开始就帮助CPN Tools开发的Henry Michael
Lassen。CPN Tools的用户们提供了非常有价值的反馈,并已经帮助改进了工具。特别是,来自
Wil van der Aalst和他的的团队的反馈已经帮助明显提高了工具的稳定性。最后,我们还要感谢
本文的评论者,尤其是他们详细和深刻的评论和注解:Charles Lakos,Guy Gallasch,Jens B鎘
Jogensen, Jo˜ao Miguel Fernandes,Jonathan Billington,Laure Petrucci,Lin Liu,and Simon
Tjell。

参考文献

1. Sigr′un Andrad′ottir. Simulation Optimization. In Banks [2], chapter 9.


2. Jerry Banks, editor. Handbook of Simulation. JohnWiley & Sons, Inc., 1998.
3. J. Billington. ISO/IEC 15909-1:2004 Software and system engineering - High-level Petri
nets - Part 1: Concepts, definitions and graphical notation.
4. J. Billington, M. Diaz, and G. Rozenberg, editors. Application of Petri Nets to
Communication Networks, volume 1605. Springer-Verlag, 1999.
5. J. Billington, G.E. Gallasch, and B. Han. A Coloured Petri Net Approach to Protocol
Verification. In J. Desel, W. Reisig, and G. Rozenberg, editors, Lectures on Concurrency and
Petri Nets - Advances in Petri Nets. Proc. of 4th Advanced Course on Petri Nets, volume 3098
of Lecture Notes in Computer Science, pages 210–290. Springer-Verlag, 2004.
6. BRITNeY Suite. wiki.daimi.au.dk/britney/.
7. ITU (CCITT). Recommendation Z.120: MSC. Technical report, International
Telecommunication Union, 1992.
8. A. Cheng, S. Christensen, and K. H. Mortensen. Model Checking Coloured Petri Nets
Exploiting Strongly Connected Components. In Proc. of International Workshop on Discrete
Event Systems, pages 169–177, 1996.
9. S. Christensen, L.M. Kristensen, and T. Mailund. Condensed State Spaces for Timed
Petri Nets. In Proc. of International Conference on Application and Theory of Petri Nets, volume
2075 of LNCS, pages 101–120. Springer-Verlag, 2001.

51
10. CPN Tools. www.daimi.au.dk/CPNTools/.
11. Alan A. Desrochers and Robert Y. Al-Jaar. Applications of Petri Nets in Manufacturing
Systems: Modeling, Control, and Performance Analysis. IEEE, 1994.
12. Examples of Industrial Use of CP-nets. www.daimi.au.dk/CPNets/intro/example
indu.html.
13. G. E. Gallasch and L. M. Kristensen. COMMS/CPN: A Communication Infrastructure for
External Communication with Design/CPN. In Third Workshop and Tutorial on Practical Use of
Coloured Petri Nets and the CPN Tools, DAIMI PB-554, pages 75–91. Department of Computer
Science, University of Aarhus, Denmark, 2001.
14. Gnuplot. www.gnuplot.info.
15. Proc. of International Conference on Application and Theory of Petri Nets and Other
Models of Concurrency. Springer-Verlag, 1980-2006.
16. K. Jensen. Coloured Petri Nets. Basic Concepts, Analysis Methods and Practical Use.
Volume 1: Basic Concepts. Springer-Verlag, 1992.
17. K. Jensen. Coloured Petri Nets. Basic Concepts, Analysis Methods and Practical Use.
Volume 2: Analysis Methods. Springer-Verlag, 1994.
18. K. Jensen. Condensed State Spaces for Symmetrical Coloured Petri Nets. Formal
Methods in System Design, 9, 1996.
19. K. Jensen. Coloured Petri Nets. Basic Concepts, Analysis Methods and Practical Use.
Volume 3: Practical use. Springer-Verlag, 1997.
20. K. Jensen. Proc. of Workshops on Practical Use of Coloured Petri Nets and the CPN
Tools, 1998-2006.
21. K. Jensen and L.M. Kristensen. Coloured Petri Nets. Modelling and Validation of
Concurrent Systems. Springer-Verlag, In preparation.
22. W. David Kelton, Randall P. Sadowski, and Deborah A. Sadowski. Simulation with
Arena. McGraw-Hill, 2nd. edition, 2002.
23. J. P. C. Kleijnen. Experimental Design for Sensitivity Analysis, Optimization, and
Validation of Simulation Models. In J. Banks, editor, Handbook of Simulation. Wiley, New York,
1993.
24. L.M. Kristensen, S. Christensen, and K. Jensen. The Practitioner’s Guide to Coloured
Petri Nets. International Journal on Software Tools for Technology Transfer, 2(2):98–132,
1998.
25. L.M. Kristensen, J.B. J鴕gensen, and K. Jensen. Application of Coloured Petri Nets in
System Development. In Lectures on Concurrency and Petri Nets - Advances in Petri Nets. Proc.
of 4th Advanced Course on Petri Nets, volume 3098 of Lecture Notes in Computer Science,
pages 626–685. Springer-Verlag, 2004.
26. L.M. Kristensen and T. Mailund. A Generalised Sweep-Line Method for Safety
Properties. In Proc. of Formal Methods Europe, volume 2391 of Lecture Notes in Computer
Science, pages 549–567. Springer-Verlag, 2002.
27. L.M. Kristensen and A. Valmari. Finding Stubborn Sets of Coloured Petri Nets Without
Unfolding. In Proc. Of International Conference on Application and Theory of Petri Nets, volume
1420 of Lecture Notes in Computer Science, pages 104–123. Springer-Verlag, 1998.
28. Averill M. Law and W. David Kelton. Simulation Modeling & Analysis. McGraw-Hill, 3rd
edition, 2000.

52
29. K. H. Mortensen. Efficient Data-Structures and Algorithms for a Coloured Petri Nets
Simulator. In Kurt Jensen, editor, Third Workshop and Tutorial on Practical Use of Coloured
Petri Nets and the CPN Tools, 2001.
30. W. Reisig. Petri Nets, volume 4 of EATCS Monographs on Theoretical Computer
Science. Springer-Verlag, 1985.
31. W. Reisig. Elements of Distributed Algorithms: Modeling and Analysis with Petri Nets.
Springer-Verlag, 1998.
32. SceneBeans. www-dse.doc.ic.ac.uk/Software/SceneBeans/.
33. Standard ML of New Jersey. www.smlnj.org.
34. J.D. Ullman. Elements of ML Programming. Prentice-Hall, 1998.
35. A. Valmari. The State Explosion Problem. In Lectures on Petri Nets I: Basic Models,
volume 1491 of Lecture Notes in Computer Science, pages 429–528. Springer-Verlag, 1998.
36. Wil van der Aalst and Kees van Hee. Workflow Management: Models, Methods, and
Systems. MIT Press, 2002.
37. M. Westergaard and K. B. Lassen. The BRITNeY Suite Animation Tool. In Proc. of 27th
International Conference on Application and Theory of Petri Nets and Other Models of
Concurrency, volume 4024 of Lecture Notes in Computer Science, pages 431–440.
Springer-Verlag, 2006.

53

You might also like