[0001]
发明人:Chitoor V.Srinivasan President,EDSS,Inc.
[0002] 优先权
申请号:US 61/195,965
[0005] 第二部分:背景技术
[0006] 第三部分:发明内容
[0007] 第四部分:具体实施方式
[0010] 词汇表:按照字母顺序的缩写
[0011] ALLEOP:允许的事件发生模式
[0012] CCP:因果通信原语
[0013] CCS:用于通信系统的微积分
[0014] CIP:蜂窝交互协议
[0016] CSP:通信序列处理
[0017] CTL:因果时间逻辑
[0019] ECT:事件特征表
[0020] FSP:有限状态处理
[0021] ndFSP:非确定FSP
[0022] NFSP:非FSP
[0023] OO:对象导向的
[0024] Sm-路径:共享存储器通信路径
[0026] TICCTM:用于集成计算和通信的技术
[0027] TICCTM-Ppde:基于TICCTM的并行程序开发和执行平台
[0028] TICCNETTM:基于TICCTM的局域通信网
[0029] TIP:线程交互协议
[0030] 第二部分:背景技术
[0031] 本发明教导如何使用TICC(用于集成计算和通信的技术,US
专利No.:US7,210,145B2,2007年4月24日,发明人:Chitoor V.Srinivasan)来建立正式验证的大量并行软件系统,该大量并行软件系统是在任意大量共享存储器多核芯片(SMMC)或由局域TM TM
网互连的共享存储器多处理器(SMP)、TICCNET (基于TICC 的局域通信网)的任意集合上运行,并且以80%-100%的效率运行。组织和操作提供:(i)用于设计、实现和正式验证并行软件系统的理想环境;(ii)从被称为蜂窝的并行软件计算单元中的交互的摘要规范TM
开始,并且逐渐地将实现改进到它的最终形式;(iii)在具有TICCNET 的SMMC网络的多样性中提供用于开发大量并行软件应用的正确的编程摘要和工具;(iv)在实现的每一阶自动生成基于正式事件的定义的计算的模型,称为允许的事件发生模式(ALLEOP),其中(v)不仅被用于正式验证定义的计算的属性,例如在因果时间逻辑语言(CTL语言)中陈述的正确性、定时、同步、调整、进展、活跃度、避免死
锁度,还用于(vi)自动实现自我监控系统(SMS),其监控在实现的应用的整个生命周期实现的应用的性能,该监控是与操作并行进行的并且不干扰实现的应用的定时,从而识别和报告性能的错误、即将发生的错误和告警情况定义的先验的发生。
[0032] TICCTM-Ppde是用于开发和执行基于TICCTM的并行程序的平台。其具有将所有将来的
应用软件转换为完全验证的并行软件系统的潜
力,在具有多核芯片的各种台式机和笔记本计算机上运行,由此提供对于在我们今天使用的技术中不能实现的大量计算能力的简单的
访问。
[0033] TICCTM-Ppde采用和集成
修改版本的七个其他编程范例(i)OO(对象导向的)范例[Martin 1,Alan 2,Armstrong 3,Bertrand 4],(ii))在参与者[Hewitt,5][Agha,6][Clinger,37]中的并行计算,(iii)如在π微积分[Milner,7,8,9]中的交互规范,(iv)如在CSP(通信序列处理)[Hoare,10,11,12]中的计算和通信的集成,(v)与通过FSP(有限状态处理)[Magee & Kramer,13]设计认证类似的实现的认证,(vi)与[Hoare,15]和[Manna,16.17,18]类似的NFSP(非NFS)系统的认证,以及(vii)使用修改的RESTCLK-路TM径的通信。在TICC -Ppde中使用的通信机制、并行程序组织和证明方法是新的。
[0034] 通过使用不同的TICCTM而可能进行这些范例的集成,其能够使得硬件和软件计算部件有计划地互换
信号。通过有计划的信号互换来驱动所有通信、并行处理、p线程(并行线程)交互、安全执行、中断处理、同步、调整和自我监控,而不需要使用
操作系统(OS),同时保持所有软件和硬件部件的相互隔离。应用的软件计算部件,称为蜂窝,并行操作并且不是如在FSP[Maggie & Kramer,13]和CCS(用于通信系统的微积分)[Milner,14]中时间分割的并发。每个蜂窝在它自己分配的硬件CPU中操作,并且除非已经被分配了CPU的该蜂TM窝暂停或终止其操作并释放了该CPU,否则其他蜂窝不使用该CPU。基于TICC 的并行处理需要并可以容纳大量CPU。除了简化并行编程和提供用于正式验证和动态自我监控的方法TM
之外,TICC -Ppde还提供一些其他益处,如在发明内容部分描述。
[0035] 具体实施方式部分通过一系列例子表示如下内容:(i)组织的基本原理;(ii)通信和计算的本质;(iii)由ALLEOP定义的计算模型,其是自动从实施中得出的;(iv)使用自动从ALLEOP得到的ECT网络(时间特征表网络)上给定CTL
断言(因果时间逻辑断言)的评估来验证实施;以及(v)同步、调整、数据保护、安全实施和自我监控。
[0036] TICCNETTM是基于TICCTM的分布式存储器硬件通信网络,可以用于在包含256或更多SMMC(共享存储器多处理器芯片)和/或SMP(共享存储器多处理器)局域超级计算格网中在SMMC和/或SMP之间组对组的高速消息互换,每个SMMC或SMP具有32或64个处理器或更多。我们以单个芯片中集成的多个SMMC想象不远的将来的多核芯片。假设将TMTICCNET 本身集成到这样的多核多SMP芯片,用于在芯片中的SMP之间高速组对组地分布TM
式存储器消息互换。在本专利申请中仅描述TICCNET 中分布式存储器路径的结构,不描述TM
在TICCNET 中安装路径并且在安装的路径上发送消息的机制。
[0037] 第三部分:发明内容
[0038] 1.通过连续改进的实施:TICCTM-范例介绍了从被称为蜂窝的并行软件计算单元的集合之间交互的概要规范开始的通过连续的改进的应用实施方法。蜂窝经由附接于蜂窝的端口连接的通信路径在蜂窝之间交换消息来执行并行计算。如果存在任何名称的自变量的话,如果与调用和执行名称和自变量的实施上下文中一起
指定名称和自变量,但是没有定义实施它们的
计算机程序,则消息子分类、方法、并行线程或条件是概要。改进涉及消息子分类和计算机程序的定义,其定义了在应用的给定概要设计中的概要方法、p线程(并行线程)和条件。在给定概要规范中随着蜂窝之间的消息流以目标导向的方式执行改进。在每一级改进中,从实施规范中自动得出由定义的计算机程序执行的计算的ALLEOP模型。该模型被用于使得在不同级的改进中在CTL语言(因果时间逻辑)中断言的属性有效。如果已经对于实施中的所有概要方法、并行线程和条件定义了计算机程序并且已经完全定义了所有消息子分类,则完全改进了实施。
[0039] 2.ALLEOP和证明:如在部分2的具体实施方式中描述,ALLEOP指定应用中的允许的事件发生模式。存在两种事件分类:通信事件分类和动作事件分类。大体来说(在具体S F D实施方式的部分2和5中详细描述),通信事件分类是(p,t),(p,t)或者(p,t)对,其中p是通过路径发送、转发和接收消息的端口,上标S用于发送,上标F用于转发,上标D用于传递,并且t被称为时间地图,代表时间点的序列,在该时间点上在应用的运行中可以发生事件分类的实例。动作事件分类是对(name,t),其中name是变量、条件或动作并且t是表示时间点的序列的时间地图,在该时间点上设置和/或访问命名的变量,命名的条件变成真或者执行命名的动作。但是动作事件的实例可以改变并行计算的世界状态,通信事件的实例仅改变通信路径中部件的状态。
[0040] 用于正确操作的条件:我们写X(t1)来指事件分类(X,t)的实例,在时间t1发生事件实例X。如果在ALLEOP中(X causes Y)保持真,我们写(X→Y),如果(X causes Y)仅C(X,Y)当条件C(X,Y)为真,则写(X →Y)或者C(X,Y)?(){X→Y}。因果关系是不自反的传递的不对称关系,表示(X→Y)是不可能的,(X→Y)&(Y→X)也是不可能的,(X→Y→Z)C(X,Y) C(Y,Z) C(X,Y)&C(Y,Z)
暗示(X→Z),并且(X →Y →Z)暗示(X →Z)。因果链是连续因果关系
C(X,Y) C(Y,Z)
的
串联,如在(X→Y→Z)或(X →Y →Z)。以下解释因果关系:
[0041] 解释1:如果在应用的运行中,X的实例X(t1)使得Y的实例Y(t2)发生,那么在C(X,Y)ALLEOP中或者(X→Y)为真或者(X →Y)&(t2)为真,并且在两种情况下,(t2≤t1+τ(X,Y))应该也保持为真。
[0042] 项目(t2)断言在时间t2条件C(X,Y)是真。项目τ(X,Y)是是在两个事件实例(X,Y)的方式之间的最大允许延时。实施者在设计时估算这些最大值并且在以完成的实施进行试验时对它们进行确认。应用的因果网代表了在该应用运行过程中可能发生的通信事件实例的所有可能因果链的集合,动作事件被忽略。仅当在应用的每个因果网中下面的条件1保持真时,正确地操作应用(部分6.5,具体实施方式):
[0043] 条件1:
[0044]
[0045]
[0046] 这个条件断言对于在任何应用运行中发生的所有事件实例解释1应该保持真。这里的定时是用于模型计算的事件的属性,不是计算的参数。每个计算步骤具有与其相关的一个或多个事件。所有这样的时间发生在离散的实时时间点。在证明构建的过程中,以与ALLEOP中指定的时间地图一致的方式对于事件假定时间点。在条件1中以给定的紧的边界TMτ(X,Y)预期事件的定时的能力是TICC -Ppde执行特征(具体实施方式中的部分4.6)和参考下面的特征4
加速技术的消除的结果。在证明构建中均使用事件发生模式、因果链、与它们相关的条件、事件定时和计算单元的状态。
[0047] ALLEOP对FSP(有限状态处理)和NFSP(无限状态处理)系统建模。不像在Maggie & Kramer[13]中使用的FSP模型,ALLEOP不是期望的系统设计的模型,而是实际实施的模型,自动地从改进的不同级的实施规范中得到。迹线自动地从ALLEOP得到并且从迹线自动地得到ECT(时间特征表)。ECT网络以表格的方式表示迹线中的信息,这对于ALLEOP证明构建是方便的。通过ECT网络上的CTL断言(因果时间逻辑断言)的符号评估进行被称为CTL断言的实施的属性的交互证明。CTL断言类似于Clark[38-40]Emerson,[41]和Sifakis,[42]中使用的断言,它们还以某种方式类似于[Magee & Kramer,13]中使用的FSP语言。但是,存在不同之处,这可以在具体实施方式的例子中被注意。用于CTL断言的特定句法不是重要的,只要其具有共同接受的毫无疑义的解释[38-42]。
[0048] 证明不需要用于CTL语言的推断引擎,证明仅需要在ECT网络(ECT的网络)上评估CTL断言的方法。然而,证明确实需要用于提议的表达式的推断引擎。在ECT网络上CTL表达式的评估提供了在证明中需要的提议推断的上下文。用户指定实施,要被证明的CTL断言以及提供可能与证明相关的定义、公理和其他CTL断言。在具体实施方式的部分6中示出的证明方法。有限ALLEOP具有等效FSP模型。给定的ALLEOP具有FSP和NFSP属性;后者的证明更复杂。
[0049] 3.动态自我监控SMS:SMS(自我监控系统)是TICCTM-Ppde程序执行机制的固有TM的内建部分。由此,当完成应用A的TICC -Ppde实施时,自我监控是自动的。实施者不用必须指定SMS的任何部分。在应用A运行时,与A的运行并行地,在A的生命周期中,对A的执行效率和定时具有很少甚至没有恶化,SMS动态地生成应用A的因果网,A的因果网是在A的运行过程中发生的所有且仅为通信事件链的网络。当违反条件1时报告错误;仅当对于ALLEOP中的一些事件分类X和Y违反了条件1中的指定上边界τ(X,Y)时报告紧急错误。甚至可以使用ALLEOP
节点作为终端符号来定义正规文法中关键行为的模式,并且当在因果网中发生了任何定义的模式时,使得SMS发布告警。SMS提供用于进行自我诊断、自我修复和学习能力的
基础。
[0050] 4.高速并行通信:如在2007年4月24日的US专利No.7210145B2中描述的,TICCTMTM采用RESTCLK[Das,19]通信范例。TICC 中的通信是面向连接的:仅当两个蜂窝具有由通TM
信路径彼此连接的端口时,该两个蜂窝可以彼此通信。对TICC -Ppde采用RESTCLK改变了用于在路径中的部件之间交换信号的协议,修改了路径的结构以并入SMS,并且更重要的,不像RESTCLK,能够通过保证的高速消息传递来进行并行同步瞬时异步通信。
[0051] 每个端口可以仅附接于被称为端口的父蜂窝的一个蜂窝(防止端口争用),并且每个端口可以仅连接至一个路径(防止消息干扰)。存在三种端口,均为软件部件:用于发出业务
请求消息的总端口,用于接收和响应业务请求消息的功能端口以及用于接收中断消息并对其做出响应的中断端口。每个蜂窝应该具有至少一个每种端口。
[0052] 在专利US7210145B2中描述的TICCTM,使用被称为通信处理器的特定蜂窝调度和实施消息交换,该蜂窝在应用A中与其他蜂窝并行操作。在应用A中的每个蜂窝发送请求以通过连接至该蜂窝的端口的路径将消息发送至A的通信处理器。通信处理器通过与在请求中指定的路径相关联地执行协议来发出消息。以通信处理器接收请求的顺序执行协议。由此,尽管使用具有1千兆比特每秒存储器总线的2千兆赫兹CPU,在共享存储器环境中仅花费几百纳秒来传递消息,用于传递消息的等待时间可以是6到10微妙那么多,因为用于发送消息的请求将不得不在队列中等待轮到它被通信处理器服务。在应用中可以被同时并行发送的消息的数目被限制为在该应用中不同通信处理器的数目。
[0053] 这个组织应该与下面说明的其中没有使用通信处理器的TICCTM-Ppde中的并行消息交换机制进行比较。每个蜂窝本身发送和传递所有它的消息并且可以被同时并行发送的消息的数目仅由在应用中不同路径的总数目限制。此外,在共享存储器和分布式存储器环TM境中均可以发生通信。如下列出在TICC -Ppde中通信的特征:
[0054] (4-i)路径和协议:蜂窝C的每个端口C.p连接至唯一的路径C.p.pathway。存在两种路径sm路径(共享存储器路径)和dm路径(分布式存储器路径)。术语路径指的是它们中的任一个。仅传递消息的路径具有与它们相关的虚拟存储器。不传递消息仅传递信号的路径被称为简单路径。在安装路径时对于路径
声明虚拟存储器。在编译时间或者在运行时间将真实存储器分配给虚拟存储器。虚拟存储器保存被交换的消息,还保存处理和建立消息的方法和p线程(并行线程)。
[0055] 每个sm路径具有与其相关的唯一虚拟存储器。如果c.p.pathway是sm路径,则C.p.vM参考C.p.pathway的虚拟存储器。如果C.p.pathway是dm路径,则连接至C.p.pathway的每个端口q(C.p是这些端口q中的一个)将具有与其相关联的不同虚拟存储器q.vM,这些不同的虚拟存储器驻留在由dm路径互连的不同SMP(共享存储器多处理器)。每个端口C.p也具有与其相关联的不同的协议C.p.protocol。仅端口C.p的父蜂窝可以执行C.p.protocol。C执行C.p.protocol以通过C.p.pathway发送消息。在C.p.pathway上行进的信号最终建立了如下上下文:如果C.p.pathway是sm路径,则C.p.vM中的信号被传递给也连接至C.p.pathway的它的期望的接收者端口。在C.p.pathway是dm路径的情况下,C.p.vM中的消息通过硬件传输线被传送到连接至相同dm路径的其他端口q的虚拟TM TM
存储器q.vM。TICCNET 是包含在应用中的所有dm路径的通信网。在TICCNET 中不同的dm路径的数目可以是成千。简单路径将不具有与其相关联的虚拟存储器。
[0056] (4-ii)协议和CCP:所有协议由CCP(因果通信原语)序列定义,当执行这些序列时,使得与协议相关联的路径中的部件在它们之间交换信号,并且对接收的信号做出响应。每个CCP具有格式X:x→Y,其中X和Y是在路径中嵌入的部件,并且x是信号。由CCP的串联定义协议,该串联具有格式X:x1→Y:x2→Z,其中X、Y和Z是相同路径中的所有部件,并且x1和x2是信号。由路径部件交换的信号在路径上行进并且最终建立用于消息传递或传输的上下文。协议中的CCP可以嵌入到其他编程语句中,如在具体实施方式的部分1和
7所述。
[0057] 如在具体实施方式的部分1中描述,每个CCP的操作由路径部件中嵌入的ndFSM(非确定有限状态机)定义。花费了大约25到50纳秒以100百万比特每秒存储器总线在2千兆赫兹CPU(硬件计算单元)执行在软件中实施的CCP。CCP也可以被实施为CPU中的硬件机器指令。如果在硬件中实施,CCP执行将在2千兆赫兹CPU中花费不超过5纳秒。
[0058] (4-iii)调度延时的消除:为了发送消息,蜂窝C首先在与一个它的端口C.p相关联的虚拟存储器C.p.vM中写入要发送的消息。在C.p.vM中写入要发送的消息之后,蜂窝C本身立刻执行也与端口C.p相关联的协议C.p.protocol。C.p.protocol的执行使得信号沿着C.p.pathway行进。C.p.pathway可以是dm路径或sm路径。消息写和协议执行事件以相同方式发生,而不管哪种路径连接至端口C.p。当执行协议时在路径上行进的信号最终将C.p.vM中的消息或者传递或者传送到期望的接收者。不具有虚拟存储器的路径将仅传递信号而不是消息至它的期望的接收者。
[0059] 当执行协议时,蜂窝不使用在协议本身中没有定义的任何方法,蜂窝也不调用蜂窝外部的任何处理。在蜂窝执行的计算以创建和写入消息至虚拟存储器以及相同的蜂窝执行的计算以分派和传递消息/信号至它的期望的接收者之间不存在差异,除了定义这些计算的计算机程序的细节之外。这两个计算对于该蜂窝是严格私有的,并且完全独立于在其他蜂窝中发生的一切。因为只要蜂窝准备好发送消息/信号,由相同的蜂窝立即进行消息创建和消息/
信号传输,完全消除了调度延迟。
[0060] (4-iv)同步延迟的消除:通过保持交换信号的每个路径的硬件和软件部件总是彼此调谐来消除同步延迟。每个这样的部件将总是准备好接收和立即响应由路径中的其他部件发送的信号。这种调谐是使用具体实施方式的部分1中描述的方法来实现的。调谐总地消除了在信号交换过程中的同步延时。
[0061] (4-v)异步通信&序列缓存的消除:任何蜂窝可以在它准备好发出和传递消息/信号的时候这样做。在通信的过程中既不阻碍消息发送也不阻碍消息接收。所有消息/信号交换是异步的。如在具体实施方式中定义的,从不使用队列缓存来支持这样的异步消息/信号交换,而是使用并行缓存机制,使用路径的虚拟存储器。
[0062] (4-vi)并行同步消息交换:不同的蜂窝可以同时仅执行与不同路径相关联的不同协议,这总是真的。这是因为:(a)每个蜂窝可以执行仅与附接于该蜂窝的端口相关联的协议,(b)每个蜂窝在任何时间仅执行一个协议,(c)每个端口可以仅附接于一个唯一的蜂窝,(d)没有路径可以在附接于相同蜂窝的两个端口之间传输消息,(e)连接至路径的消息发送和消息接收的父蜂窝在任何时间不能均执行与该路径相关联的协议,(f)由该路径上的代理自动调整多于一个连接至该路径的消息发送端口的由父蜂窝的路径的协议的同时执行,(g)路径(sm路径或dm路径)的协议的执行可以仅改变路径中部件的状态而不改变其他,(h)没有两个路径(sm路径或dm路径)共同共享任何部件,以及(j)每个蜂窝在它自己指定的CPU中运行,该CPU不与任何其他蜂窝共享。这些特征在一起保证了由不同蜂窝同时并行执行协议而不相互干扰,由此使得能够在sm路径和dm路径二者中进行并行消息传送,这样的并行同时消息传送的数目仅由应用中的不同路径的数目限制。
[0063] (4-vii)确保的高速并行通信:在TICCTM-Ppde中通信的下面四个特征确保在几百纳秒或更少的范围内的等待时间进行高速并行消息交换:(a)没有协议执行曾经由任何处理中断;(b)通过不同路径可以交换多个消息;(c)所有同步和调度延时可以被完全消除;以及(d)在异步通信中不使用序列缓存。
[0064] 如果在硬件中将CCP实施为在具有1千兆比特每秒存储器总线的2千兆赫兹计算单元中的机器指令,可以以几十纳秒通过sm路径交换点对点消息。根据每个端口组中端口的数目花费一百到三百纳秒经过sm路径进行从一组端口到另一组端口的组对组消息交换。可以在小于500纳秒(估计)加上信号传输时间中通过dm路径交换组对组消息/信号,在一个SMP中的消息发送端口组总是同步地将消息/信号传递到另一个SMP中的一个或多个消息接收端口组。在任意给定时间内在应用中同步发生的并行消息/信号传送的数TM目仅由应用的TICCNET 中不同dm路径的数目(其可以为上千个)加上在该应用的共享存储器环境中不同sm路径的数目(其可以为上万个)限制。
[0065] 由此,不像RESTCLK[Das,19],TICCTM-Ppde能够在大量并行软件应用的共享存储器和分布式存储器环境下在蜂窝之间进行高速同时并行消息/信号交换,具有确保的消息传递。
[0066] 5.自我调整和自我同步:在TICCTM-Ppde中由发送信号的路径中的代理自动调整和同步组对组通信和计算。每个组对组sm路径将一组总端口连接至一组功能端口。在端口组中没有两个端口属于相同蜂窝。sm路径仅包含一个虚拟存储器M。M具有附接于M的两个代理。一个代理连接至所有消息发送端口并且另一个代理连接至所有消息接收端口(见具体实施方式的部分7,图19)。组对组路径将由端口组发送的消息传递回到相同的端口组也是可能的(图17),这样的路径被称为在自我闭环路径。
[0067] 在端口组中的端口的父蜂窝被称为蜂窝组。如图19所示,总端口组G的父蜂窝可以经过将G中的端口连接至F中的端口的路径将联合业务请求消息发送给功能端口组F。与G中的所有端口和F中的所有端口相关联的路径的虚拟存储器被称为G.vM=F.vM。这个虚拟存储器保存由G中的端口发送的业务请求消息。仅在G中的端口的所有父蜂窝已经完成了它们各自的计算之后,路径中的代理分派G.vM中的业务请求消息,并且对G.vM中写入的联合业务请求消息做出贡献。这是分派调整,一旦被分派,在相同路径中的其他代理以在F中的连续端口之间在传递时间上不超过2或3纳秒来同步地将G.vM中的消息传递给F中的所有端口。这是传递同步。答复消息由F中的端口的服务网联合地写入到相同的虚拟存储器F.vM。在路径中的相同的两个蜂窝再次执行从F到G的答复消息的分派调整和传递同步。我们假设,通常端口组可以包含一个或多个端口,我们使用符号P来指代路径。
[0068] 彼此通信的蜂窝组中的蜂窝不参与分派调整和传递同步。在蜂窝组中的每个蜂窝与在该蜂窝组中的其他蜂窝并行地简单执行组对组路径的协议,只要蜂窝完成将要被发送的消息写入到路径的虚拟存储器中。在蜂窝组中的蜂窝的协议执行可以不都是同步发生,因为由蜂窝执行的计算不是彼此同步的。在路径中的蜂窝调整它的并行协议执行并且确保仅一次将联合业务请求消息同步地传递给接收功能端口。在路径P中的代理还执行若干其他任务:它们发送信号至连接至P的SMS(自我监控系统)的部件,从而指示这些部件安装与经过P发送的每个消息相对应的SMS中的消息分派和消息传递事件。此外,P中的代理实现数据安全性。仅当端口满足用于消息和端口的先验指定的安全条件时,代理将消息传递给端口。
[0069] 由P的协议指定在P中的代理执行的所有动作。所有这样的动作由代理独立于连接至P的蜂窝组中的蜂窝执行。系统实施者不用必须对它们的程序指定调整和同步方法。我们称这个为自我调整和自我同步(在具体实施方式的部分1和7中描述)
[0070] 蜂窝组中的每个蜂窝在它自己指定的CPU中运行,该CPU是不同的并且不与应用的任何其他蜂窝共享。当蜂窝组中的蜂窝处理被联合地传递给所有蜂窝的业务请求消息时,它们可能遇到彼此调整它们各自的计算的需要。它们通过彼此交换数据同时通过由保存业务请求消息的虚拟存储器提供的便签式存储器来对服务请求进行响应来进行调整。实施者应该并入由这样的蜂窝组中的蜂窝使用的方法、机制以通过使用便签式存储器交换数据来调整它们各自的计算。
[0071] 在TICCTM-Ppde中的组对组通信在并行计算中实施并行自我调整的和自我同步的分支/接合操作。
[0072] 6.有效的低粒度执行:TICCTM-Ppde的组织允许有效的高速执行,因为:(i)消除了通信、处理和p线程(并行线程)管理、调整、同步、中断处理、数据包含的安全加强中的操作系统干涉;(ii)消除了在所有通信中的调度和同步会话的需要;(iii)非常低的通信等待时间;(iv)并行同时消息交换;(v)消除了异步通信中的序列缓存;(vi)精确定时的程序和协议执行以及(vii)使用便签式存储器使得虚拟存储器组织可能进行最小存储器争用。因为通信的等待时间处于纳秒范围内,可以在大量并行计算中以几十到几百微秒量级的非常低的粒度来以好的效率(80%到100%)运行并行程序。
[0073] 7.多核芯片的理想环境:TICCTM-Ppde引入若干编程概要,他们中的许多对于编程技术是新的。与概要相关的软件工具有助于建立可以在多样化的多核芯片中运行的并行程序。在下面的列表中分项说明概要在并行程序开发和多核芯片环境的执行中的
角色以及与它们相关的工具。
[0074] 概要1:蜂窝、端口和路径:这些概要不是新的,但是它们在TICCTM-Ppde中特定的体现是新的。它们隔离和包含由在多核芯片中的每个CPU执行的计算,并且防止在由芯片中的不同CPU并行同时执行的计算之间的相互干扰。路径也隔离和保护消息,并且防止在芯片的不同CPU组之间并行同时交换的异步消息之间的相互干扰。提供工具以定义、安装和更新蜂窝和路径,管理至蜂窝的CPU分配、在分配的CPU中的蜂窝活动以及控制由CPU对TM虚拟存储器的访问。在TICC -Ppde中预先定义在任何并行编程应用中要被使用的端口和TM
路径的子分类。实施者必须定义在TICC -Ppde中没有被定义的非常规端口和路径子分类。
在应用中使用的每个蜂窝子分类应该被实施者定义。
[0075] 概要2:附接、调谐和代理:仅附接的和相互调谐的应用/软件部件可以彼此共享方法和数据,并且彼此交换信号。这不仅实现了蜂窝、CPU和消息隔离,而且巩固了在使用计算的自我同步和自我调整,以及消息/信号交换。附接和调谐作为编程概要对于编程不是TM TM新的。软件代理的概念不是新的。然而,TICC -Ppde中的代理的特定特性对于TICC -PpdeTM
是唯一的。由TICC -Ppde从蜂窝和路径的定义自动地执行附接和调谐。实施者不用必须TM
指定它们。在TICC -Ppde中预先定义在任何并行编程应用中可能使用的代理的子分类。
TM
实施者必须仅定义在TICC -Ppde中还没有被定义的非常规代理子分类。
[0076] 概要3:虚拟存储器:在计算系统中将专用硬件存储器与硬件系统相关联是常见的。但是使用专用的虚拟存储器作为软件系统中使用的硬件存储器的软件概要的概念是新的。这个概念首先由Gopinath[21]引入(即使没有使用这个术语),并且下面后本发明的TM发明人适配,对于TICC -Ppde中的并行程序开发和执行进行一些实现。在编译或运行时间的过程中,真实的存储器被分配给虚拟存储器。虚拟存储器简化了使用多核芯片的并行编程以及多核芯片的设计。
[0077] 虚拟存储器保存消息并且实现蜂窝/消息隔离。除了它们实现数据保护、数据安全之外,对处理和创建消息使用的方法提供
执行环境,最小化存储器干扰(具体实施方式TM部分6.2),并且对于蜂窝组中的蜂窝便签式存储器以调整它们的动作。TICC -Ppde提供工TM
具来定义、声明、安装和更新虚拟存储器。在TICC -Ppde中预先定义要在任何并行编程应TM
用中使用的虚拟存储器的子分类。实施者仅必须定义在TICC -Ppd没有被定义的非正常虚拟存储器子分类。
[0078] 如下面的特征4和特征7中所述,虚拟存储器使能在SMMC(共享存储器多核芯片)中存储器组织的新方法,该方法简化了SMMC设计并且改善了它的性能效率。在SMMC中的每个CPU由最小量的私有存储器实施,具有10千字到1百万字的范围内的尺寸,并且没有
高速缓冲存储器或任何其他加速机制。然而,SMMC具有10千字到1千兆字的尺寸的范围TM的硬件共享存储器模
块SMM的池。TICC -Ppd在编译时间或者在运行时间将SMM分配给应用中定义的每个虚拟存储器。在并行程序执行过程中,运行蜂窝的CPU被动态地连接至已经被分配给由这些蜂窝使用的虚拟存储器的SMM。当需要时,应用中的端口动态地调度并CPU和SMM之间的这样的连接的建立和拆除。每个SMM仅可以同时服务约8到16个CPU。
这个组织极大地减小了在包含256或更多CPU的大规模SMMC中的存储器干扰,并且还有助于数据安全和保护。
[0079] 概要4:CCP和协议:一个重要的概要是CCP(因果通信原语),其实际上使得所有TM其他概要的集成变为可能。在TICC -Ppd中使用CCP来定义通信协议,当执行时,使得信号在与这些协议相关的路径上行进。它们使得硬件/软件部件动态地和程序化地交换信号,由此将它们隔离并且还使得它们能够彼此合作。CCP导出的信号交换同步、调整和管理异步TM
软件/硬件部件,就像开始/完成信号同步、调整和管理异步硬件部件。在TICC -Ppd中预TM
先定义在任何并行编程应用中要被使用的协议。实施者仅必须定义在TICC -Ppd中没有被定义的非常规协议。
[0080] CCP消除了使用操作系统来管理硬件/软件交互、资源分配、处理/线程管理、中断TM处理、同步、协作和安全加强的需要。因为CCP本身可以是机器指令,CCP消除了TICC -Ppd中计算和通信之间的不同。执行计算的相同的蜂窝也执行所有需要的通信。不需要来自操作系统的支持以交换消息/信号,不需要监视器来管理处理/线程,不需要旗语[23,24]用于软件调整,并且不需要会合技术[10,12]用于软件同步。CCP的使用极大加速了通信并且TM
自然地导致了TICC -Ppd并行处理结构。使用CCP作为基本编程语言原语的概念对于编程技术是新的,并且将其实施为机器指令对于CPU的设计也是新的。
[0081] 概要5:TIP:TIP是线程交互协议。在实施中附接于蜂窝C的每个端口C.p具有对其定义的TIP,C.p:TIP()。TIP执行下面的功能:(i)它们通过应用中的端口之间的交互的概要规范有助于软件开发,并且逐渐将概要规范改进为最终规范。(ii)它们隔离来自每个蜂窝中的消息处理和消息构建计算的通信。(iii)隔离由不同蜂窝执行的并行计算。(iv)在细化的不同级允许用于实施的基于模块化事件的ALLEOP模型的自动获取。(v)使得在细化的不同级能够进行实施的系统的形式验证的ALLEOP的灵活使用。(vi)能够进行SMS(自TM我监控系统)组织。TICC -Ppd提供工具以定义、安装和更新在实施规范中的TIP,细化它们,并且从给定的规范在细化的每一级得到ALLEOP和迹线。作为编程概要,TIP对于编程TM
技术是新的。存在一共10个不同种类的TIP。这是实施者的责任来以与TICC -Ppd中的TIP定义格式一致的形式对于应用中的每个端口定义TIP,以及在正在被实施的应用中的TIP的期望功能。
[0082] 概要6:同步:
[0083] 周期同步:如果总是在p:TIP()的评估完成之后开始q:TIP()的评估,并且仅在前一个q:TIP()的评估完成之后开始下一个p:TIP()的评估,则与在应用中任意两个不同端口p和q相关的两个TIP,p:TIP()和q:TIP()是周期同步的。端口p和q可以属于应用中的任两个蜂窝;它们甚至可以属于相同的蜂窝。周期同步在应用中强加动作的调整(顺TM序)。TICC -Ppd提供帮助以周期同步与应用中的任意两个端口相关的任意两个TIP。
[0084] 同步:属于不同蜂窝的端口的TIP,p:TIP()和q:TIP()是同步的,如果总是在相同TM时间开始它们的评估。TICC -Ppd提供帮助以同步与应用中的任意两个不同蜂窝的端口相关的任意两个TIP。
[0085] TICCTM-Ppd提供系统化的方法以将周期同步和同步引入到设计中,或者通过适当TM的TIP和路径的定义引入到实施中。TICC -Ppd还在细化的任何级提供方法以引入这些同步作为事后同步,不需要改变对该点完成的任何细化(具体实施方式的部分6.6)。我们将TM
用于这样的事后同步的方法称为自组织同步方法。在TICC -Ppd中使用的所有同步和调整TM
方法对于编程技术来说是新的,并且对TICC -Ppd是唯一的。
[0086] 概要7:CIP:CIP是蜂窝交互协议。CIP是与蜂窝的初始化过程一起在蜂窝的端口定义的所有TIP的集合。CIP指定了蜂窝周期地轮询它的端口的顺序。存在两种CIP:在端口上一旦感应到消息的存在就立即调用为该端口定义的TIP的那些CIP,以及根据蜂窝本地的排序规则将具有消息的端口放到排序的端口列表中,然后以端口在列表中出现的顺序通过执行端口的TIP主体对端口做出响应的那些CIP。也可能蜂窝立即响应于某些端口而不是首先将该端口排序然后将其他端口排序。
[0087] 每个CIP与在唯一的CPU中与并行处理系统中的所有其他处理并行运行的唯一处理相关联。我们将参考这个CIP处理作为C:CIP()。C:CIP()在对其发送了消息的C的端TM口周期地执行TIP,继续它的操作直到它终止或暂停。TICC -Ppd将运行C:CIP()的CPU分TM TM
配给蜂窝C。此外,TICC -Ppd将每个蜂窝在它指定的CPU激活。CIP处理是TICC -Ppd并行程序执行中的唯一处理。它们的调度、CPU中的激活、暂停、重新开始、同步和调整都是由TM
TICC -Ppd完全管理而不需要使用操作系统。轮询以识别业务请求的接收并且以某种顺序对其做出响应的概念不是新的。在所有软件系统中广泛使用该概念。但是在CIP中的这个TM
业务的特定体现对于TICC -Ppd是唯一的。
[0088] 概要8:TICCTM网络:这以图形格式指定了在实施中使用的蜂窝、附接于蜂窝的端TM口间的路径互连。TICC 网络暗含地指定和实现了在应用中发生的并行计算动作的所有同TM
步和调整。实施者有责任指定用于应用的TICC 网络。一旦完成该指定,实施者对于下述完全没有责任:在应用正在运行时,在它们的并行计算程序中并入用于调整、同步或任意种类的并行计算的监控的任意设施。
[0089] TICCTM网络提供了正确种类的概要以指定和分析并行程序执行的控制结构。就像数据结构概要能够以不同的数据结构定义运行相同的序列程序以优化序列程序,只要序列TM TM程序的结构与数据结构相匹配,TICC 网络结构能够以不同的TICC 网络运行相同的并行应用程序的集合,从而试验和优化并行程序组织,只要应用中的每个C:CIP()中的初始化TM
例程与TICC 网络结构匹配。
[0090] 使用图形表示以捕获系统的部件之间的交互的控制结构不是新的。但是使用基于TM TMTICC 的并行软件系统的唯一解释的TICC 网络的具体体现是新的。
[0091] 概要9:ALLEOP和迹线:这两个概要被定义和使用的方式是新的并且对于TM TMTICC -Ppde是唯一的。TICC -Ppde提供了工具以从实施规范中自动地得到ALLEOP,并且使用它们以使软件系统有效。迹线的概念本身来说并不是新的。术语迹线用于指代在特定轮的程序执行中发生的描述。不同的编程规程使用不同的句法结构或图形工具来指定迹线。
TM
TICC -Ppde迹线具有唯一的特性:它们不仅指定在特定轮的应用中所有发生的,还定义并行计算的语义。迹线从ALLEOP和动作的输入/输出特性中自动得到。动作可以是p线程TM
(并行线程),或者单独的程序语句或条件。TICC -Ppde提供交互地定义动作特性所必须的TM
工具并且使用工具以自动地从ALLEOP得到迹线(具体实施方式的部分2)。TICC -Ppde还提供使用从迹线中自动得到的ECT网络(时间特征表网络)来使实施的属性有效的方法。
[0092] 概要10:SMS、因果网和eb蜂窝:因果网是迹线的概要,它们仅包含在迹线中发生TM的通信事件的因果链。由TICC -Ppde的SMS(自我监控系统)与A的运行并行地建立应用A的因果网,同时A正在运行。在应用A中的每个路径p中的代理发送信号至连接至路径P的SMS的特定蜂窝,称为事件建立者蜂窝(eb蜂窝),同时信号沿着P行进。每个路径P由专用eb蜂窝服务。给定的eb蜂窝可以服务多个路径。由P的eb蜂窝接收的信号指示eb蜂窝来在应用的增长的因果网中安装在P中发生的消息分派和传递事件。在由接收消息的端口的父蜂窝正在处理由P传递的消息的时候,eb蜂窝安装分派和传递事件。以路径上的信号传输并行地发生eb蜂窝的信令,并且以防止SMS事件的定时和应用事件的定时之间的干扰的形式,在由消息接收蜂窝完成的消息处理并行发生分派和传递事件安装。当SMS中的eb蜂窝正在建立增长的因果网时并行运行四个动作:(i)在应用中运行的所有蜂窝的动作,(ii)在SMS中向eb蜂窝发送信号的路径中的代理的动作,(iii)在eb蜂窝以新的消息分派和传递事件更新增长的因果网时eb蜂窝的动作,以及(iv)分析增长的因果网的SMS的ea蜂窝的动作(见下面的概要11)。
[0093] 每个eb蜂窝使用运行eb的CPU的本地时间来确定在应用中何时发生给定的消息分派和传递事件。因为运行eb蜂窝的所有CPU的本地时间与标准的全球时钟同步,所以通过eb蜂窝与因果网中的事件实例相关联的所有定时将与相同的全球时钟同步。运行应用中的其他蜂窝的CPU可以使用既不与全球时钟同步也不彼此同步的不同本地时钟。
[0094] 应用实施的规范自动地定义应用所需的SMS结构。TICCTM-Ppde自动调用和使用对于应用这样定义的SMS以动态地监控应用的每次运行。应用实施者不用必须写任何程序TM以对此进行帮助。在分布式存储器计算网格中由TICCNET 互连的每个SMMC(共享存储器多核芯片)X将具有它自己独特的本地SMS,X:SMS()。由X:SMS()建立的因果网将驻留在TM TM
本地共享存储器X中。当需要时,使用TICC -GUI(图像用户
接口),TICC -Ppde可以在分布式存储器计算网格的不同SMMC中集成因果网并且限制在给定蜂窝中心的或应用中的端口的它的任何部分。
[0095] 概要11:SMS和ea蜂窝:SMS使用特定的蜂窝,称为事件分析器蜂窝(ea蜂窝)来在每轮应用中正在创建因果网时,持续地监控增长的因果网。按照条件1中的定义,目标是识别和报告在增长的因果网中的错误和未决的错误。Ea蜂窝也可以监控因果网以识别在因果网中的先验定义的事件模式的发生,并且发布告警。Eb蜂窝通过使用CCP交换信号来与ea蜂窝通信,从而以ea蜂窝执行的因果网分析来调整它们自己的因果网更新。SMS是部分TMTICC -Ppde并行程序执行机制。
[0096] 总结:在TICCTM-Ppde并行程序开发、有效、执行和自我监控中使用的所有上述编TM程概要和方法对于TICC -Ppde是唯一的。概要和方法一起提供所需的工具以安装和管理TM
并行程序中的概要的实例并且正式建立可以在与TICCNET 集成的各种多核芯片中运行的验证的并行软件系统。
[0097] 8.TICCTM-Ppde的显著特征:
[0098] 特征1:集成的环境:TICCTM-Ppde执行对蜂窝的CPU分配、在分配的CPU中的蜂窝激活、并行处理管理,p线程(并行线程)管理、通信、中断管理、安全实现、同步和调整,而不用调用操作系统或任何其他部件来执行这些蜂窝的任何部分。在当前的
原型实施中,TMTICC -Ppde仅使用用于存储器管理、高速缓存管理和对次级存储设备的访问、输入/输出和因特网访问的操作系统。如在特征4中所述,高速缓冲存储器和通常用于CPU设计的所TM
有其他种类的加速技术可以在被用于运行TICC -Ppde程序的SMMC(共享存储器多核芯片)TM TM
中被完全分配。当前由操作系统向TICC -Ppde提供的所有服务可以被并入到TICC -PpdeTM
本身。由此,TICC -Ppde提供集成的并行程序开发、验证、执行和运行时间监控环境,其完美地适于开发、验证、运行和监控SMMC中或由若干SMMC构成的计算网格中的并行程序。
[0099] 特征2:TICCTM-GUI:TICCTM-GUI显示了在给定蜂窝固定的TICCTM-网络的段、在给定端口或蜂窝固定的ALLEOP的段、以及在给定端口或蜂窝固定的因果网的段的图形表示。TM TM
在具体实施方式的部分中仅出现TICC -网络显示的例子。TICC -GUI提供帮助以检查在应用中任意蜂窝的状态,同时在响应于接收的业务请求GUI轮询蜂窝状态的时间点运行TM
TICC -GUI。实际上不可能在与进行显示请求的时间请求精确一致的时间点显示蜂窝的状态。然而,可以设置断点并且当发生某个事件时显示状态。然而,将这样的断点引入应用A将改变在A中发生的事件的定时。由此仅可以在测试模式使用断点。GUI对文档系统实施和动态系统监控是有用的。TICC-GUI是TICC-Ppde的完整部分。
[0100] 特征3:任意可升级性:只要由升级引起的交互开销是小的,当与程序执行时间相TM TM比,在TICC -Ppde中的并行程序是任意可升级的。TICC -Ppde并行程序的独特之处是可TM TM
相关于TICC -网络的结构来精确定义交互开销。假设N是蜂窝和路径的TICC -网络,并且nmax(N,C)是在任意轮询周期中N中由蜂窝交换的消息的最大数目。假设nmax(N)是在N:nmax(N)=Maximum{nmax(N,C)|C∈N}中对于C的所有nmax(N,C)的最大值。假设v(N)是网络N中蜂窝的数目,并且假设N’是具有v(N’)蜂窝的N的升级版本。那么用于任意可升级性的要求是:nmax(N’)是独立于升级因子α=[v(N’)/v(N)]。如果条件满足的话,α的值将达到百万。这主要是说每个蜂窝的通信和调整开销不应该随着升级因子的增加而增加。
[0101] 特征4:消除高速缓冲存储器和加速技术:可以分配高速缓冲存储器用于运行TMTICC -Ppde并行程序。在我们的原型实施中,我们发现了更大程度上是损害的高速缓冲存储器。通过小粒度执行,在高速缓存补充和高速缓存不连贯中浪费太多时间通常是个问TM
题。我们必须更新主存储器中的数据以避免高速缓存不连贯。对于TICC -Ppde中的高吞吐量程序执行,不需要高速缓冲存储器。高吞吐量可以由蜂窝中的低粒度并行程序执行的TM
任意升级所实现的。实际上对于TICC -Ppde中的高效率和高吞吐量不需要任一个通常的加速技术,例如多指令流执行[29]、预测未来调度[30]、流
水线处理[31]和高速缓存的执TM
行[32]。在TICC -Ppde中,每个CPU专
门用于服务一个蜂窝,仅使用与该蜂窝相关的虚拟存储器。每个蜂窝在任意给定时间仅执行一个TIP并且TIP执行是不可中断的(部分5,具体实施方式)。包括计算和通信的用于执行TIP时间可以是10到100微秒那么小。不存在TM
同步、调整和监控开销。由此,在TICC -Ppde中不存在自然的上下文来有利地应用任意上述加速技术。这具有两个优点:(i)简化在SMMC(共享存储器多核芯片)中的CPU设计由此增加在芯片中的CPU
密度,以及(ii)能够以紧的边界进行事件定时预测。
[0102] 特征5:通过自我监控开发验证的计算机物理实时系统的理想环境:在给定边界TM中以精确定时的软件执行是建立计算机物理实时系统的必要和重要的需要。TICC -Ppde有助于软件系统的形式有效、使用SMS的自动自我监控,以及通过精确定义的边界预测事件TM
定时。现在应该清楚的是TICC -Ppde提供理想环境来开发、有效和应用计算机物理实时系统等用于实例
飞行器或空间飞行系统的自动导航、自动的多
传感器应用、在军事车辆中的自动防御/侵犯协调或任意其他这样的时间关键的反映系统。它还被用于建立安全信息系TM
统等医疗信息系统或智能信息系统或任意其他
数据库系统。对于TICC -Ppde显著的最广泛使用的应用是具有SMMC的个人
计算机系统,其确保私有性和保护不受到所有未授权的入侵和攻击。
[0103] 特征6:动态灵活性和移动性:通过动态地改变路径连接并通过动态地引入新的TM蜂窝和路径,TICC -Ppde并行程序可以被动态地修改和更新。见专利US7210145B2用于在正常操作中使用具有很小或没有改变的老版本并行地本地测试新版本的蜂窝。通过将一个处理器中的虚拟存储器的整个内容转移到在分布式系统中其他存储器的其他虚拟存储器来实现分布式环境中的程序移动性。
[0104] 特征7:需要的CPU特征:在本发明中假设每个CPU将具有需要的特定应用以帮助允许它的本地时钟由连接至蜂窝的固定有限数目的端口(最多10或15)并行同步轮询。端口可以使得运行它的父蜂窝的CPU的时钟在消息传递给该蜂窝的时候通过发送CCP消息而被轮询,从而注册消息传递时间。可以在硬件中如下实施这个设施:运行蜂窝C的CPU可以将它的当前时间持续广播给在蜂窝的端口C.p的虚拟存储器C.p.vM中安装的特别指定的时间寄存器的集合,RT(C.p)(‘T’用于‘时间’)。每个端口C.p可以具有与其相关的额外的时间寄存器,称为传递时间寄存器RD(C.p)。每次向端口C.p传递信号时,在RT(C.p)中的当前时间被自动电波传送进入RD(C.p)。由此,在RD(C.p)中的时间将标记在C.p中的信TM号传递时间。这个布置将建立到TICC -Ppde使用的所有CPU。不需要使用操作系统来执行这个任务的任何部分。
[0105] 对于端口C.p,使用方法C.p:timestamp()来调用在C.p的这个时钟读取设施。应该注意到,不由时钟时间正在被读取的CPU,而是由允许将消息传递给C.p的蜂窝的CPU执行方法C.p:timestamp()。由此需要上述布置。每次将传递信号发送给应用中的任意端口C.p(具体实施方式的部分7)时调用该方法。不需要应用中的所有时钟同步。仅eb蜂窝的时钟应该均同步于公共全球时钟。在每个蜂窝中需要时钟的并行同步读取,因为消息可能被并行地同步传递给蜂窝的端口。
[0106] 存在用于CPU的若干其他需要。在SMMC(共享存储器多核芯片)中的CPU应该被设计不具有高速缓冲存储器,而是具有大约10千字到1百万字尺寸的有限数量的私有存储器。每个SMMC应该具有在这样的模块的池中保持的硬件共享存储器模块的集合。我们将它们称为SMM(共享存储器模块)。每个SMM的尺寸可以在10千字到1千兆字的范围内。每个SMM应该具有同时服务最多仅16个CPU(蜂窝组的最大尺寸)的容量。在编译时间和TM TM
运行时间由TICC -Ppde将SMM分配给应用中的虚拟存储器,TICC -Ppde从给定的实施规范中决定要被分配给不同虚拟存储器的SMM的尺寸。当蜂窝给出到这些虚拟存储器的访问权时,运行蜂窝的每个CPU可以被动态地连接至被分配给此时由蜂窝使用的虚拟存储器的SMM。可以使用CPU设计中的可编程逻辑网络来动态地将CPU连接至SMM存储器总线。
[0107] 这个方案消除了将SMMC与多个千兆字尺寸的共享存储器集成(存在数据安全和存储器争用的问题)的需要。这里提出的方案显著地减少了运行时的存储器争用。此外,单个大的共享存储器的缺乏和具有用于共享的严格有限的容量的虚拟存储器的使用提供了增加的安全性、私有性和数据保护,因为:(i)仅当端口满足对该消息和端口指定的先验指TM定安全条件时,每个代理将虚拟存储器中的消息传递给端口,以及(ii)在TICC -Ppde中的每个端口保护它的虚拟存储器中的消息,仅对它的父蜂窝并且仅当父蜂窝准备好发送消息或准备好响应于安全地传递的消息/信号的时候给出对它的虚拟存储器的访问权。此外,TM
TICC -Ppde不具有中央调度机制,并且没有中央处理和方法激活目录(动态链接库)。这些特征在一起建立了对数据偷盗和系统破解的强大屏障。
[0108] 第四部分:具体实施方式
[0109] 1.因果通信原语(CCP)和RESTCLK路径的适配
[0110] 为了方便和连续性,我们在这个部分描述在US专利No.:US 7,210,145B2,(发明人Chitoor V.Srinivasan)介绍的一些概念和机制,但是从不同的观点。在这个部分中我们还描述简单TIP(线程交互协议)、CIP(蜂窝交互协议)和简单通信协议的结构。
[0111] 在硬件系统中,通常使用信号来控制、同步和调整硬件部件的活动。在同步硬件中,使用
时钟信号,在异步硬件中,使用开始和完成信号。如在US专利No.,US7,210,145B2,Gopinath[21]首先提出了在软件/硬件部件之间有计划地交换信号,并且[Das,19]首先定义了在其上信号可以行进的共享存储器RESTCLK路径的结构。Gopinath和Das使用短线程来发送、接收和处理信号,并且使用操作系统(OS)管理的时间分割的并发来实现它们的系统。使用由线程定义的信号交换机制来实现在共享存储器环境中的信息交换。使
用例如以太网的网络设施来完成分布式网络上的通信[Spurgeon,22]。
[0112] 时间分割的并发线程调度和活动对信号交换引入了不确定性。不能在有界限的TM等待时间内传递消息并且常常丢失消息。TICC 适配并修改Gopinath和Das介绍的
框架以在几十或几百纳秒范围内以有界限的等待时间提供确保的并行消息传递,用于应用以在OO(目标引导的)编程语言的情境下并行编程共享的存储器和分布式存储器系统。
[0113] 以高速进行软件/硬件部件之间信号的确保的有计划交换允许软件直接控制该TM软件在硬件系统中的执行,同时保持部件隔离。在TICC 中,我们当前在共享存储器和分布式存储器环境中,对所有的通信、处理和p线程(并行线程)调度和活动、中断处理、数据保TM
护、安全实施、同步、调整和自我监控进行上述处理。原型TICC -Ppde仅对存储器管理、分TM
页、缓存和输入/输出使用操作系统。应该最终在TICC -Ppde本身中实现所有操作系统业务。
[0114] 1.1.CCP和有计划的信号交换
[0115] 通过使用被称为因果通信原语CCP的新的编程原语在TICCTM中有计划地指定硬件/软件部件对之间的信号交换。每个CCP具有格式,X:x->Y,其中x是开始或完成信号,并且X和Y是软件或硬件部件。每种类型的信号可以具有为其定义的子类型。CCP类似于分配,因为其将信号分配给部件。但是与分配不同,信号分配的效果仅在一定延时之后出现。TM
在TICC 中,期望的效果最终是消息传递或者消息分派,由此命名为CCP。
[0116] 使用CCP指定信号交换具有如下优势:(i)仅作为分配,CCP可以自由地嵌入到其他编程语句中,由此能够在计算中进行有计划的信号交换;(ii)CCP可以被实现为CPU中的硬件机器指令;(iii)灵活地组织程序执行;(iv)消除通信和计算之间的区别;(v)对于共TM享的存储器和分布式存储器使用相同的协议调用格式;以及(iv)即使TICC 信号交换机制不同于RESTCLK[Das,19]信号交换机制,也可以仅以最小的改变来保持RESTC LK路径结构。
[0117] 由2态或4态ndFSM(未确定有限状态机)实现每个CCP。仅对于在FSM的每个状态中对于所有输入没有定义状态转换,FSM是不确定的。在2千兆赫的计算机中使用100兆比特每秒的存储器总线,花费大约25到50纳秒来执行在软件中实现的CCP。如果在硬件中实现为机器指令,在2千兆赫的CPU中,应该不超过5纳秒(估算)。
[0118] 对于点对点的消息传送,仅使用CCP控制的四个2态ndFSM,对于在共享存储器环境中从一组蜂窝到另一组蜂窝的消息传送,根据在一个组中蜂窝的数目(第七部分)可以TM使用8个或更多2态ndFSM,并且在使用TICCNET 的分布式存储器环境中,对于类似的消息传送使用直到10个或更多2态和4态ndFSM。将SMS机制集成到消息传送中还需要两个2态ndFSM(第七部分)。由此,如前所述,如果CCP被实现为硬件指令,则仅使用几十或几百纳秒用于点对点和组对组消息传送。
[0119] 每个蜂窝在分配给自身的CPU中执行所有它自己的通信协议。通信被减少为由ndFSM执行的Turing计算[Turing,20],并且变成由蜂窝执行的计算的完整部分。只要蜂窝的消息准备好,每个蜂窝立即通过连接至蜂窝端口的硬件/软件路径发送它的消息。不存在同步或调度延迟。由并行操作的蜂窝执行多个协议而没有相互干扰。然而,每个蜂窝可以在任何时间仅执行一个协议。这使得能够进行并行同步消息传送。所有的通信是异步的,并且不使用顺序
缓冲器。
[0120] 在读者可以看到如何从此直接得到发明内容中提及的优势之前,必须解释如何使得上述处理变得可能并且如何组织由每个蜂窝执行的计算和通信。
[0121] 1.1.路径协议、TIP、消息传输和计算
[0122] 蜂窝使用它们的端口经由与端口互连的路径来彼此交换消息。每个端口可以仅附接于一个唯一的蜂窝,称为它的父蜂窝(防止端口干扰),并且每个端口可以仅连接至一个路径(防止消息干扰)。存在三种端口:总端口g,蜂窝通过总端口g向其他蜂窝送出业务请求(类似于π微积分代理的输出端口[Milner,7,8,9]),功能端口f,通过功能端口f从其他蜂窝接收业务请求并且对其做出响应(类似于π微积分的输入端口),以及中断端口2
i,通过中断端口i从其他蜂窝接收中断消息(对此没有π微积分的类似物)。总端口 (
黑体字用于分类的名称,普通字体用于分类实例)和功能端口是摘要分类,端口的子分类。中断端口是功能端口的子分类。每个蜂窝子分类应该具有至少一个每种端口。
[0123] 每个端口持有通信协议以通过与其连接的路径发送信号。使用具有格式X:x->Y:y->z的CCP的串联来定义该协议,其中X、Y和Z是路径中的分量,并且x和y是信号。CCP可以出现在能够嵌入到其他编程语言语句中的协议。随着路径的改变而动态地更新协议。由执行CCP的相互作用的ndFSM的集合定义每个路径。仅端口的父蜂窝可以执行与该端口相关的协议。
[0124] 路径和CSP通道:在共享存储器环境中的路径仅包含软件部件,类似于CSP通TM道[Hoare,10-12]。但是与CSP通道不同,并且TICC -Ppde中的并行线程对应于CSP中的通信序列处理。路径(i)允许与时间同步的消息传递进行组对组的异步通信;(ii)在TM
TICC -Ppde中的相互作用的并行线程之间的数据交换机制没有被编码到并行线程;(iii)路径仅发送信号;以及(iv)如果发送了消息,则路径包含虚拟存储器,该虚拟存储器保留消息和并行线程以建立和处理消息。在编译时间或运行时间过程中,将实际存储器分配给虚拟存储器。
[0125] 在路径上行进的信号最终建立了如下情境:在共享的存储器路径(sm路径)的情况下将虚拟存储器中的消息传递给预期的接收者,或者在分布式存储器路径(dm路径)的情况下发送给属于预期的接收者的其他虚拟存储器。对于每个sm路径,保持消息的虚拟存储器(如果存在一个)是对该路径唯一并私有的。类似地,对于每个dm路径,在该路径中的所有虚拟存储器对于该路径是私有的。没有路径可以使用另一个路径的虚拟存储器。与CSP通道不同,路径不妨碍发送者和接收者。
[0126] 我们参考作为Das路径的具有虚拟存储器的sm路径,因为它们是首先由Souripriya Das[Das,19]引入的。我们使用术语路径来指代sm路径和dm路径。
[0127] 1.2简单sm路径
[0128] 让我们首先考虑一些简单的sm路径。端口的父蜂窝执行在端口处的协议,从而通过与该端口连接的路径发送信号。当执行协议时,父蜂窝仅使用它的本地存储器,以及与路径分量相关的存储器。协议执行将不调用任何在协议之外定义的方法、线程或处理。由此操作系统(OS)不用于消息交换。
[0129]
[0130] 图1:最简单的点对点路径
[0131] 考虑图1中所示的简单路径:这里,软件分支将蜂窝C的总端口C.g连接至蜂窝D的功能端口D.f。在图1中,请求业务的信号首先行进通过从C.g到D.f的分支,然后指示请求的业务完成的响应信号从D.f到C.g行进回来。仅当蜂窝通过端口发出信号或者当蜂窝接收和响应在端口接收的信号时,蜂窝使用它们的端口(软件部件)。如图1所示,连接至路径的两端的两个蜂窝可以从不使用在相同时间连接至该路径的端口。信号一个时间仅在一个方向上在路径上进行。这对于TICCTM中的所有路径均适用。
[0132] 如图所示,图1中的每个端口包含2态非确定有限状态机(ndFSM),具有状态S(发送)和R(接收)。所有总端口g以初始状态开始,并且所有功能端口f以初始状态R(图1中的双圆)开始。图1中的路径是[C.g,D.f]。该路径的初始状态是[S,R]。在这个初始状态中,路径准备从端口C.g到端口D.f发送信号。我们现在讨论图1中给出的规范。在下文中我们使用g来指代C.g,使用f来指代D.f。
[0133] 在Hoare′s[Hoare,15}前提条件/后置条件符号中表示了图1中的CCP特征。CCP的前提条件可以依赖于信号发送和信号接收ndFSM的状态。下面以从前到后的顺序描述图1中特征的解释。
[0134] (1到4)从g到f的信号传输:(1)当端口处于状态S,它从它的父蜂窝接收信号c(完成信号)作为它的
输入信号。(2):当在输入c的状态S中,端口发出信号s并且移动到状态R,同时接收该信号s的ndFSM处于状态R。该接收ndFSM接收s作为它的输入信号。(3,4):当端口的父蜂窝感应到输入信号s时,接收ndFSM移动到状态S,该父蜂窝执行信号感应测试:mR?()(用于“信号准备好?”的‘mR?’)。如在后置条件所示,信号的感应返回真值true,如果输入信号是s,则返回false。信号s这里指的是消息传递信号。由接收蜂窝对消息传递信号的感应构成消息接收。应该注意到,在功能端口f处的传递信号可以被成功地感应多次,直到发送回响应消息,因为仅当发出响应时改变传递信号。
[0135] (5到10)从f到g回复信号传输:(5)蜂窝D发送完成信号c到f,指示完成了任务。(6)f发送开始信号s到端口g并且将其状态改变为R。这是来自D的响应信号。(7-10):蜂窝C可以使用两个感应测量中的一个来接收在其端口的传递信号g:g:mR?()或者g:pR?()(用于“路径准备好?”的‘pR?’)。注意,可以使用感应测试仅感应一次在总端口的传递信号g:mR?(),因为信号在感应后被复位到 (空符号)。然而可以成功地重复使用g:pR?()测试,因为在感应之后g状态改变为S。实际上,对于任何端口,p,其中p是总端口或功能端口,传递信号的感应总是使得p成为状态S。
[0136] 线程交互协议,TIP:在图1中的TIP(1)表示如下内容:如果路径准备好,则C执行并行线程g:x(),以在发送业务请求前做它应该做的任何事情。在蜂窝C中定义该并行线程(在整篇文章中我们使用符号‘X:’来代替符号‘x->,用于调用在对象X中定义的方法。这里假设X是对象x的
指针。由此,在C.g:pR?()中,是在C.g的端口分类中定义的方法。我们还是用符号X.atbt来指代X的属性atbt的值。这里X可以是指针或实际对象),g:x()≡C:x(g),并且在指定给C的私有存储器中执行。在执行g:x()之后,在与连接至g的路径中的部件相关联的存储器中,C立即执行g:s()。在图1中,这将是与端口g和f相关联的共享存储器。这使得要执行图1中的通信协议(1),导致将业务请求信号传递到端口f。
[0137] 在图1中的TIP(2)指定以下内容:当D通过应用f:mR?()测试感应到由C对其端口f发送的业务请求信号时,D开始通过执行在蜂窝D中定义并且在D的私有存储器中执行的线程f:r()≡D:r(f)(‘r’用于“答复”)来响应于接收到的信号。在完成f:r()的执行之后,D立即执行f:s()。这使得要执行图1中通信协议(2),这导致答复信号传递回到端口g。由端口g的父蜂窝关系该答复信号标志事务(transaction)的结束,该事务是当C发送它的业务请求信号到D时开始的。
[0138] 由路径状态改变而施加的限制:在事务开始的时候,连接的状态是[S,R]。在蜂窝D感应信号的时候,路径的状态是[R,S]。在这个新状态中,路径准备好发送回答复信号。当蜂窝C感应到答复信号时,事务结束并且路径状态反转回到[S,R]。这些状态改变强制执行了下面的限制:仅在完成了交易之后,C.g可以发送第二业务请求信号,并且D.f可以仅在已经响应了第一业务请求之后接收第二业务请求信号。仅在接连的事务完成之后可以通过路径发送接连的业务请求信号。
[0139] 对业务请求的强制响应:对于所有TICCTM路径通用的总的规则是通过接收了请求的相同的路径不失败地响应每个业务请求。在“单程环形道路”(部分8.2)中发生了该总的规则的例外。由此,通过专用的路径发生每个事务。响应的接收者总是将路径复位到它的初始状态,即使在单程环形道路。在每个信号传输会话中,路径中的每个ndFSM总是处于TM以下状态:它准备接收并且立即响应于由另一个ndFSM发送的信号。对于所有TICC 路径都是成立的,不论它们多么复杂以及有多少ndFSM嵌入其中。这被称为调谐(tunning)。调谐消除了在信号传输过程中的同步会话的需要并且显著地加速信号传输。
[0140] 调谐:通过以下步骤彼此调谐路径中的ndFSM:(i)将它们设置到恰当的初始状态,(ii)通过要求经由相同的路径发送答复信号应该完成通过路径启动的每个交易来维持调谐,以及(iii)仅在通过路径完全完成了当前事务时候可以通过路径启动新的事务。
[0141] 计算和通信的集成:由相关的蜂窝执行计算和通信。在计算和通信执行之间不存在差异。二者均由线程交互协议TIP调用和执行。蜂窝的每个接口具有对其定义的TIP。由端口的父蜂窝执行TIP。TIP具有格式C.p:?(){},其中p是蜂窝C的端口。如果C.p:?()是真的,那么执行,否则跳过该端口。我们将使用C.p:tip()来指代由p的父蜂窝C在端口C.p执行TIP-body。每个蜂窝以某种顺序轮询它的端口。轮询顺序并不确定蜂窝的端口服务的顺序,因为仅当在端口感应到传递信号执行业务,并且信号传递时间和轮询时间彼此不同步,通信是异步的。
[0142] 1.2.1.具有虚拟存储器的简单的Das路径
[0143] 图2示出了Das路径,具有虚拟存储器M、在连接至M的所有端口的TIP、在端口的协议以及用于代理和端口的CCP特征。路径具有两个代理,a0和a1。每个端口仅当状态为S时给出对它的父蜂窝的访问以访问与其连接的虚拟存储器M中的数据。数据被包含并保留在虚拟存储器中直到进行访问。在图2中的路径中的代理按照需要在虚拟存储器中路由信号。
[0144] 在图2中,并行线程g:x()≡g:msg():x(g)和f:r()≡f:msg():r(f)。在由g和f写入到虚拟存储器M中的消息的消息子分类中定义了这些并行线程。这里,M对并行线程提供执行环境,并且虚拟存储器是蜂窝C和D的共享存储器环境的一部分。在部分7.2中描述允许用于这种活动的虚拟存储器的结构。
[0145]
[0146] 图2.具有虚拟存储器的点对点的Das路径
[0147] 在图1和2中的蜂窝D在传递信号的时候没有感应到信号,可以是因为D在这个时候正在服务于其他的端口中的一个。最终,当蜂窝D轮询它的端口D.f并且评估保护间隔(guard),在图1和2中的第二TIP中的D.f:mR?(),蜂窝D感应消息传递信号。蜂窝不会错过传递给它们的任意端口的任意信号。在一个轮询循环中错过的信号将在随后的循环中被捕获。在图2中给出的CCP特征类似于在图1中给出的。
[0148] 事务的校正:如在图1的情况下,当端口g感应答复消息(m’)的时间将标志事务的结束,该事务是从端口g发送出它的业务请求消息(m)时开始的。让我们假设在时间t2将m’传递给g,并且在时间t1由g发送m。如果消失m和m,满足预先定义的关系R(g,f)(m,m′)并且此外定时限制t2<=t1+τmax(g,f)成立,其中τmax(g,f)是对于g和f之间的事务完成所采用的最大时间,则端口g和f之间的事务是正确的。如图1所示,在不交换消息的情况下,仅上面给出的定时条件成立。如果并仅当对g和f之间的所有事务这些条件都成立,端口g和f是很好匹配的。如果由路径连接的实现中的所有端口对被很好地匹配,则实现是正确的。
[0149] 1.2.2.具有分支和接合操作的sm路径
[0150] 图3示出了具有代理a0的简单路径。代理将时间同步的信号广播给[D1.f,D2.f]中的两个端口。附接到不同的蜂窝并连接至相同的代理的相同种类的端口(即,所有的总端口或所有的功能端口)形成端口组。由此,在图3和4中的端口[D1.f,D2.f]组成端口组。由于所有的蜂窝并行操作并且蜂窝活动与信号传递不同步,D1和D2没有在同时感应到并响应于信号。最终D1和D2将每个由感应到传递的信号并且对其做出响应,每个均在其自己的时间。仅在从D1.f和D2.f接收完成信号之后,代理a0将响应信号发送回到C.g。我们*参考这个作为调整。在图3的第二协议中的一致协议方法a0:AP[c1,c2] 强制执行调整。
代理a0由此进行时间同步的信号传递以及调整的信号分派。
[0151]
[0152] 图3:具有分支的简单的点对点路径
[0153] 如下进行在图3中协议(2)的执行:D1.f和D2.f具有相似的协议:在D1.f的协*议是″D1.f:c->a0:AP[c1,c2]:s->C.g″,并且在D2.f的协议是″D2.f:c2->a0:AP[c1,*
c2]:s->C g″。D1和D2在它们各自的端口D1.f和D2.f并行地开始执行协议,但是不必须同步地,从而在它们完成各自的任务之后发送响应信号至C.g。由此并行评估一致协议方法*
a0:AP[c1,c2],在执行它们之后,各个CCP,D1.f:c->a0和D2.f:c2->a0。仅在a0接收了信号* *
c1和c2之后,条件a0:AP[c1,c2] 变成真。D1和D2保持周期性评估a0:AP[c1,c2] 直到它变*
成真。只要a0:AP[c1,c2] 变成真,由a0不确定地选择蜂窝D1和D2中的一个以执行剩余协议并且强迫其他停止它的协议执行(这会是部分8中表述的组对组协议的简化版本)。读*
者可以验证在a0:AP[c1,c2] 之后协议的部分对于D1.f和D2.f是相同的。这确保信号被传*
递给端口C.g一次。由此,在满足a0:AP[c1,c2],图3中的代理a0发送响应信号s至端口C.g,无论谁执行该协议。由此,a0在蜂窝组中由蜂窝D1和D2调整并行执行协议的不同部分。
[0154]
[0155] 图4:具有虚拟存储器的分支
[0156] 在图4中示出了具有虚拟存储器的类似Das路径和相关的TIP和协议。在该图中,a1进行时间同步的消息传递和调整的消息分派:当发出业务请时,a0进行消息分派,并且当发送回响应消息时进行消息传递。
[0157] 图3和4中的网络表示同步分支/接合操作:当端口g将信号发送到功能端口组,则发生分支,当功能端口组中的端口发送回响应信号,则发生接合。我们将分支和接合概念延伸到包含多于一个端口的总端口组发送接合请求至功能端口组的情况。在部分7中描述了这样的组对组分支和接合操作的协议。
[0158] 1.3.共享的存储器和分布式存储器路径
[0159] 在路径中将端口连接至代理或其他端口的链接被称为支路。互连代理的链接被称为h分支(隐藏支路)。Sm路径的所有部件、端口、代理、支路、h分支和虚拟存储器是软件部件。它们都在包含它们的路径的共享存储器环境中操作。
[0160] 在TICCNETTM的dm路径中的代理和一些端口是硬件部件,每个硬件部件在它的本地存储器中操作;在dm路径中的支路和h分支是信号传输线路。除了代理、端口和虚拟存储器之外,dm路径也具有嵌入其中的硬件交换机和路由器。在两个阶段发生通信:(i)路径建立(ii)信号/数据交换。在路径建立过程中使用交换机和路由器。一旦建立了路径,保持该路径并重复使用该路径直到该路径被拆除并建立了新路径。可以仅通过已经建立的dm路径交换消息。通过CCP执行管理通过信号/数据传输线路的信号和数据交换。如在sm路径,在交换信号/数据的dm路径中的所有代理和端口都保持彼此调谐。没有两个dm路径共享部件,除了在消息传输中没有被使用的交换机和路由器之外。TICCNETTM可以容纳成千个不同的彼此不干扰的点对点和点对组dm路径,引起了成千个同时并行消息交换。
[0161] 在下面三个分类中列出了sm路径和dm路径共享的属性,尽管存在上面已经提到的属性的一些重复:
[0162] (1).TIP格式独立于路径结构:(i)通信原语是p:s()(‘s()’用于发送)和p:f()(<‘f()’用于转发),其中p是端口:f()将接收的消息转发给另一个蜂窝的端口,可以是经过一些修改后的;s()发送新形成的消息。原语p:s()和p:f()用于调用和执行与端口p相关的唯一的协议。(ii)由此与端口p相关的协议是依赖于连接至p的路径的本质;对于不同的路径本质可以不同。(iii)相同的通信原语p:s()和p:f()用于调用和执行在端口p的协议,无论哪种路径连接至p。(iv)在端口p调用和执行协议引起信号要通过连接至端口p的路径发送,这反过来引起消息(如果有消息的话)被传递或发送到它的接收者端口,该接收者端口也连接至相同路径。(v)仅p的父蜂窝可以调用和执行通信原语p:s()和p:f()。(vi)在端口p的TIP格式独立于连接至p的路径种类。(vii)在交换信号的任意路径中的所有部件在任何时间总是保持彼此调谐。这些属性消除了共享存储器和分布式存储器通信之间的软件系统的差异,并且总地消除了在信号传输过程中的同步会话的需要。
[0163] (2)组对组消息交换的同时并行执行:属于端口组的不同端口的不同父蜂窝(部分1.3和7)构成蜂窝组。(i)在蜂窝组中的蜂窝同时并行执行它们指定的协议段,对蜂窝组中的不同蜂窝指定不同段。所有段一起并行执行实现了在该路径的两端连接的蜂窝组之间的路径上的组对组异步消息交换(图19);在该路径上的代理调整这样的同时并行协议段执行(部分1.3和7)。(ii)在分布式存储器环境中,在一个共享存储器多处理器(SMP)TM中的总端口组可以通过TICCNET 的dm路径将接合消息广播给网格中一些其他SMP中的功能端口组。广播消息被并行传递给所有目的地功能端口组。功能端口组以多工模式将它们的答复发送回到源总端口组,通过相同路径一个接一个地发送。这保持dm路径中的部件的相互调谐。
[0164] (3)高速并行消息交换和灵活性:(i)在所有路径中,只要消息准备好,所有消息被立即发送。(ii)在交换信号的路径中的所有代理和端口总是彼此调谐,使得彼此发送的信号被接收者连接接收并且在恰当的时候做出响应,而不管路径多么复杂。这消除了同步会话的需要。(iii)没有两个路径共享部件,并且由此没有不同协议的两个并行执行将彼此TM干扰。这对于SMP中的软件sm路径和TICCNET 中的硬件dm路径成立。由此,(iv)可以被并行交换的消息数目仅受限于路径的数目。(v)在dm路径中不发生对事务中间的路径目的地节点的连接的动态变化(见部分3.2中的灵活性)。这样的变化仅在sm路径中发生。
[0165] 在下面一些部分中表示支持通用并行计算的TICCTM-Ppde中计算设施的概括。在TM部分3-5中详细描述。在部分2中描述TICC -Ppde实施的例子,并且在部分5中描述ALLEOP-证明的例子。
[0166] 1.4.TICC分类和目标
[0167] TICCTM定义下面的顶级分类:蜂窝、端口、代理、虚拟存储器、支路和消息。我们使用字符蜂窝、端口、代理、虚拟存储器、支路和消息来指代对象,其是这些分类、所有软件部件的例子。类似于施动者[Hewitt,5,6]和π微积分代理[Milner,7,8,9],每个蜂窝是在它们自己的分配的计算单元(CPU)中运行的内部并行软件部件。在蜂窝和施动者和π微积分代理之间存在一些不同。我们将稍后进行描述。
[0168] 没有属于相同蜂窝的两个端口可以由支路连接并且没有支路可以将属于相同蜂窝的两个端口在相同路径连接至代理,除非这个端口属于端口矢量(见部分5.2(例如将图19中的路径,这里端口eb.f1和eb.f2分别连接至属于相同路径的代理a2和a3。这里,[eb.f1和eb.f2]是蜂窝eb的端口矢量)。在蜂窝的一个端口不能发送消息至相同蜂窝的另一个端口的所有情况下,这防止了可能的死锁。然而,属于不同蜂窝的不同端口可能由支路连接至相同代理。如上所述,这样的端口形成了排序的端口组;在图4中的[D1.f,D2.f]是一个例子。没有两个不同的端口组可以彼此交叉并且在相同的端口组中不能有属于相同蜂窝的两个端口。在超级计算网格中,在任何蜂窝组中的所有蜂窝将总是驻留在相同的SMP。如我们将在部分7中所见,这些限制可以通过组对组路径在端口组之间交换消息。
[0169] 1.5.蜂窝操作、CIP和轮询
[0170] 每个蜂窝以某个顺序轮询它的端口p,并且基于由蜂窝自身选择的排序标准根据未决的消息将所有端口排序到排序的端口列表。对于在排序的端口列表中的每个端口p,以端口出现在排序的端口列表中的顺序一个接一个地执行TIP主体,p:tip()。蜂窝可以参加连续的p:tip()执行之间的中断处理(除非提供特别的硬件设施以处理动态中断)。中断消息可以改变端口在排序的端口列表中的顺序,或者改变端口优先级、或者以顺序方式执TM行CIP执行的暂停/终止,而不违背任何TICC -Ppde需要。当下一个中断消息被传递到相同的中断端口时,暂停的CIP自动重新开始。操作系统不能打断蜂窝的活动,仅在应用中的TM
其他蜂窝可以打断。TICC 管理对在共享的存储器多处理器(SMP)中的蜂窝的动态处理器分配。由用户进行对网格中的SMP的蜂窝的分配。CIP定义在SMP中下面的操作。
[0171] 在蜂窝的端口处定义的所有TIP的集合,每个端口一个,与蜂窝初始化方法一起被称为蜂窝交互协议CIP。如下所述的初始化和中断消息处理示出用于CIP操作的总的控制结构。根据什么时候在蜂窝的轮询周期中识别了中断消息以及中断消息的本质,中断处理可以在每个蜂窝中不同。CIP具有格式,
[0172]
[0173]
[0174] 并行线程i:r()=i:msg():r(i)被定义在中断端口i的虚拟存储器i.vM中消息的消息子分类。让InterruptMsg指代该消息子分类。下面示出了InterruptMsg::r(i)的定义并且在第二段讨论下面的定义。
[0175]
[0176] 初始化:在上面的CIP中,initialize?()是蜂窝的本地变量initialize的真TM值,并且“i”是蜂窝的中断端口。休眠的蜂窝由传递给i的第一中断消息在由TICC 选择的处理器中被激活。总的来说,休眠的蜂窝可以由传递给任意端口的第一消息激活。传递消息的协议执行该激活(部分7)。一旦激活,如果initialize?()是真,则蜂窝设置initialize=stopPolling=false,发送确认回到通过执行i:s()开始它的蜂窝,如果实际上在端口i由中断消息激活,并且在此之后,执行在init()中指定的初始化,并且然后进行至while-loop。
[0177] 中断端口服务:在while-loop中,蜂窝首先轮询它的中断端口。如果不存在中断消息,跳过该端口。如果存在,则执行(1.2)中示出的i:r()=i:msg():r(蜂窝)。存在四种情况来考虑在(1.2)中的selectOne。(i)如果cell:suspended?()是真,那么意味着蜂窝已经被暂停。在这种情况下,cell.suspended被设置为假并且蜂窝立即处理以执行剩余的while-loop。(ii)如果i:msg():suspend?()是真,那么cell.suspended被设置为真并且蜂窝准备暂停其本身并且立即释放它的分配的处理器;在此之后,蜂窝变得休眠。被传递给蜂窝的下一个interruptMsg将自动激活在可用处理器中的蜂窝。当这样被重新激活时,蜂窝将跳过初始化并且处理进行至while-loop,由于initialize?()将是假。(iii)如果i:msg():terminate?()是真,那么蜂窝在while-loop的当前周期的结束终止操作并且释放其处理器,由于cell.stopPolling被设置为真,(iv)在(1.2)selectOne的默认情况是将优先级分配给在interruptMsg中指定的蜂窝的端口。这些优先级可以由(1.1)中TM随后的poll&SortPorts()方法使用。由TICC 管理这里的暂停/重新开始操作而不用调用操作系统。
[0178] 轮询:在蜂窝轮询它的中断端口之后,蜂窝开始轮询它的其他端口;通过执行poll&SortPorts()将具有未决的消息的端口排序到它的排序的端口列表,并且对于在该列表中以出现顺序对每个p执行p:tip()。重复while-loop直到stopPolling变成真。轮询周期与信息传递不同步。当在轮询周期中轮询端口时,如果端口不具有已经传递的信息,那么蜂窝跳过该端口并且轮询它的下面的端口。被跳过的端口可以在执行周期中接收新的消息。在一个轮询周期中错过了未决的消息的端口将被
感知并且在下一个轮询周期中包括在排序的端口列表中。由此,不能以传递消息的相同的顺序服务端口。然而蜂窝不会错过输入消息,除非蜂窝被永久地终止或者在应用系统中存在死锁。由此,在正常操作情况下完成TM每个事务。这在TICC -Ppde中是重要的。
[0179] 端口服务的其他模态:蜂窝在端口p感应到未决的消息时可能立即执行p:tip(),由此跳过排序周期。还可能具有下面这种的同步计算:蜂窝在它的端口等待直到接收消息(或者直到端口准备好);当消息到达(或当端口准备好时写入并发送新的消息)时,响应于该消息,然后仅轮询它的下一个端口。通过使用TIP中的格式C.p:?()*的保护间隔来指定这样的同步计算。‘*’指示需要等待。用星表示的保护间隔被称为同步保护间隔;它们被重复地评估直到变为真。
[0180] 例子:在部分2中,我们使用图1-4中简单的网络来表示从[Maggie & Kramer,13]TM得到的简单的两个例子。这些例子示出了TICC -Ppde实施的本质。第一个例子用于介绍由系统从实施规范、从ALLEOP得到的迹线和因果网以及由SMS在运行时间所扮演的角色生TM
成的ALLEOP。例子也示出了由TICC 网执行的并发、自动调整和时间同步,而不需要使用TM
监视器[Hoare,12]或旗语[Dijkshtra,23,24]。第二例子介绍了TICC -Ppde中的封装的概念并且示出了非确定保护间隔的使用。
[0181] 2.简单例子
[0182] 在每个例子中的实施规范包括TICCTM网、用于各种端口的TIP、用于蜂窝的CIP和TM用于每个蜂窝的轮询周期,其指定了端口在该蜂窝的轮询顺序。TICC 网是消息交换、在计算中发生的同步和调整的概括。它指定了并行计算的控制结构。对于这一部分中的例子不描述证明并且具有ALLEOP证明的例子将在部分7中描述。
[0183] 2.1.Bill和Ben例子:ALLEOPs、迹线(Traces)和因果网(Causalnet)
[0184] 我们从[Magee & Kramer,13]开始简单的游戏,如在[Magee & Kramer,13]中给出的,游戏的FSP模型是:
[0185] ‖BILL_BEN=BILL‖BEN;
[0186] BILL=play→meet→BILL;BEN=work→meet→BEN; (2.1)
[0187] 这里在传统感应[12,13]中的同步被假定为在行动术语‘meet’上发生。在这里TM描述游戏的TICC -Ppde实施。我们示出了从实施规范中得到的ALLEOP模型、从ALLEOP得到的迹线和SMS产生的因果网。所有的衍
生物由系统自动完成。ALLEOP模型是实施的模型而不是系统的期望设计的模型。由此,它们比FSM模型更复杂。但是它们的结构方面类似于FSP结构。
[0188] 图5中示出了TICCTM网。每个TICCTM网具有至少一个环境蜂窝E;有时也称为配TM置器蜂窝。配置器蜂窝被用于配置网络并开始操作。当TICC -GUI(图形
用户界面)屏幕TM
被打开时,出现了其中安装的E。应用程序员应该已经在打开TICC -GUI之前定义了蜂窝子分类E和应用所需的其他蜂窝子分类。用户点击GUI屏幕上的环境蜂窝E的图像来将其激TM
活,并且发送中断信号至它的中断端口E.i。E被用于安装TICC 网中的所有其他蜂窝和所有路径。在用户执行图像的重新
定位之后,所有安装的蜂窝和路径以及得到的图片出现在TM
TICC -GUI屏幕上,看起来如图5所示。一旦完成上述操作,通过点击E并且通过端口E.gl将中断信号广播给网络中的蜂窝的中断端口开始应用。这激活了蜂窝。
[0189]
[0190] 图5:Bill和Ben实例:在‘meet’上的同步
[0191] 下面我们使用缩写‘Be’用于‘Ben’,‘Bi’用于‘Bill’,Me用于Meeting以及‘B’用于‘Ben和Bill’。[Be.f,Bi.f]=B.f和[Be.g,Bi.g]517=B.g是端口组。Ben和Bill均通过这些端口组接收同步的信号并发出调整的信号:图5中的代理a1和a2执行同步和调整,如部分1.3.2中描述。如下示出蜂窝E的CIP:
[0192] E:CIP()定义:
[0193]
[0194] 上面的CIP指示下面的操作:由用户发送给中断端口E.i的第一中断信号激活E并且使得E执行在init()中定义的初始化,安装应用所需的所有蜂窝和路径。此后,E通过端口gl发送中断信号至游戏中蜂窝的中断端口。这激活了在图5中的网络中的蜂窝。然后,F答复将其开始的中断信号,初始化它的变量并且然后进行至执行它的while-loop。在while-loop中,首先轮询它的总端口E.g。如果端口E.g准备好送出信号并且E准备好开始游戏,则E.g发送信号至[Be.f,Bi.f]=B.f。这开始了游戏。已经开始了游戏后,E在它的端口E.g等待以接收新游戏结束信号。
[0195] 在接收到游戏结束信号之后,E轮询它的中断端口E.i。如果E感应到中断信号然后E开始终止其操作。这将是E从用户接收到的第二个中断信号。第一个开始E。在终止之前,E经过它的端口gl对所有其他蜂窝广播中断信号。这将是由E广播的第二个中断信号。第一个中断信号开始蜂窝。收到第二个中断信号的每个蜂窝发送回响应并且然后终止本身。E仅在从所有蜂窝接收到由图5中的代理a3转发的调整的响应之后终止。这是在所有应用中使用的总的开始/停止处理(具有较小的变化)。
[0196] 如果在E.i不存在中断信号,那么E可以重复其轮询周期,如(2.2)和(2.7)所示。图5中的其他蜂窝具有相似的CIP。注意,在(2.2)中具有端口E.g的TIP具有另一个TIP g:mR?()*{},,嵌入其中。在这种情况下,TIP主体是空的。但是,通常不需要这样。例如,在下面的TIP(2.4)和(2.5)中,嵌入TIP的TIP主体不是空的。在TIP中可以出现多个这样的嵌入。我们已经忽略了开始/停止处理以及在下面的讨论中的中断端口轮询和服务。
[0197] TIP:所有TIP具有通用结构{}.。
[0198]
[0199] 当Bill和Ben感应到由E发送的信号,它们开始它们各自的事情,玩和工作,如(2.4)和(2.5)所示。在完成它的做的事情之后,它们中的每一个经过各自的端口Bi.g和Be.g将信号发送给Me.f。当然,它们不同步它们发送信号的时间。代理a2等待直到它从Bi.g和Be.g二者接收到信号并且发送调整的信号至Me.f。由此,仅当Bill和Ben准备好的时候开始会议。当会议结束时,Me.f通过代理a2发送
同步信号至[Bi.g,Be.g]=B.g(见图5)。当Bill和Ben接收到该信号时,他们都通过a1发送调整的游戏结束信号回到E.g。在这一点,E可以开始游戏的下一个循环,如果游戏没有在端口E.i由中断信号终止。
TM
[0200] 在[Magee & Kramer,13]的FSP框架中的同步在TICC -Ppde中被称为调整。在TMTICC -Ppde中的同步总是指的是并行发生的事件的同步。在这个例子中,当来自E.g的信号由代理a1传递给[Bi.f,Be.f]=B.f并且当来自Me.f的信号由代理a2被传递给[Bi.g,Be.g]=B.g时发生时间同步。
[0201] 轮询周期://这里已经忽略了中断端口轮询。
[0202] E:Polling()=[E.g:pR?()→E:Polling()] (2.7)
[0203] Be:Polling()=[Be.f:mR?()→Be:Polling()] (2.8)
[0204] Bi:Polling()=[Bi.f:mR?()→Bi:Polling()] (2.9)
[0205] Me:Polling()=[Me.f:mR?()*→Me:Polling()] (2.10)
[0206] 轮询是递归的,因为在CIP(见(2.2))中的while-loop。这里给出的规范执行的计算的特征在于下面的ALLEOP。
[0207] 2.1.1.BILL-BEN游戏的ALLEOP
[0208] 读取′→′在下面作为“原因”并且′●→′作为“立即原因”。这被称为因果连TM接。在部分5中定义上述符号。ALLEOP合并TIP、TICC 网和轮询周期中的信息。当从TIP中得到ALLEOP时发生四个简单的变换:(i)″;″由′●→′替代,(ii)在TIP中出现的端口p的信号发送动作p:s()在与时间地图相关的信号发送和传递事件中由它们的扩展代替,如下所述;(iii)指定由信号传递引起的并行动作;以及(iv)每个信号感应动作p:mR?()(或p:mR?()*)给出了由其感应的信号传递事件作为它的自变量。下面描述的ALLEOP示出这些变换。每个端口ALLEOP具有两个要素:ALLEOP-guard()和ALLEOP-body(),具有结构,guard(){ALLEOP-body()}:如果ALLEOP-guard()是真,调用ALLEOP-body(),否则跳过主体。让我们首先考虑用于端口E.g的端口ALLEOP。这是从E.g:TIP Q(2.3)、图5的TM
TICC 网和(2.7)中的轮询周期得到的。在(2.11)中示出并且如下描述。
[0209]
[0210] 这里,E.g:ALLEOP-guard()与(2.3)中出现的E.g:TIP-guard()一致。在(2.3)中的TIP-body中出现的E.g:s()已经被变换为当执行E.g:s()时发生的信号发送/传递事件:信号发送事件是E.g[t(E.g,0)](用于发送),并且信号传递事件是)[t(E.g,1)]和(Bi.f>[t(E.g,1)](用于传递)。在信号发送和传递事件中出现的自变量t(E.g,0)和t(E.g,1)是时间地图。如下所述,每个时间地图映射到增加序列的时间点。出现在(2.11)中的传递事件周围的细线角括号‘<…>’指定在时间地图中指定的时间S点完成事件。在发送事件E.g 周围缺乏这样的角括号表示,它在时间地图中指定的时间点开始。由此,在事件周围角括号的出现和缺乏区别这些事件的开始和结束时间。
[0211] 在(2.11)中的这两个信号传递事件Be.f和Bi.f具有相同的时间地图t(E.g,1)。这指定信号在t(E.g,1)中相同的时间点被传递给端口[Be.f,Bi.f]。在时间地图中#的不同的值,用于#=0和1,t(E.g,#),唯一地识别与相同的端口E.g相关的时间段的两个不同的序列。在CIP或TIP中出现的在不同端口的不同通信事件具有与它们相S D D关的不同#值。事件E.g、Be.f 和Bi.f 全都由在端口E.g的协议的评估引起。
[0212] 与时间地图相关的时间点的序列被如下解释:序列T(E.g,0)=(t0,t1,…,tn-1),[t0<t1<…<tn-1]表示通过经由E.g向端口组B.f=[Be.f,Bi.f]发出信号,对于0≤ith<n E开始游戏的i 个循环的时间点,并且序列T(E.g,1)=(t0’,t1’,…,tn-1’),ti<ti’<ti+1,0≤i<n-1表示发生了信号传递给B.f中的端口的对应的时间点。对于(0≤i<n)ti对应于ti’,在时间ti开始信号发送并且在时间ti’完成传递时间的并且两个序列配合形成整个有序的链[t0<t0’<t1<t1’<t2<t2’<…<tn-1<tn-1’]。
[0213] 传递事件引起其他ALLEOP的并行激活。在(2.11)中传递事件中出现的符号′‖′指定信号并行激活ALLEOP Be.f:ALLEOP()和Bi.f:ALLEOP()。椭圆、→…→和′‖′一起指示在信号传递之后不会立即发生激活。在信号传递的时候Ben和Bill可能已经做了一些其他的事情,而不是侦听传递的信号。然而,最终他们回来感应信号并且对其做出响应。
[0214] 最后,在(2.11)中在″E.g:mR()?((E.gD)[t(B.f,1)])*″中出现的自变D量″[t(B.f,1)]″识别出由E.g:mR?()*感应的信号传递事件。这是由端口[Be.f,Bi.f]=B.f传递回到E.g的信号。这个信号的接收者对E指示通过经由E.g发送信号而开始的游戏已经终止了。在(2.11)中的同步信号感应操作E.g:mR?()*指定蜂窝E在端口E.g等待接收该终止信号。在(2.11)中的感应动作E.g:pR?()没有给出任何自变量,因为在这种情况下,仅测试端口E.g的准备好发送信号的状态;它不测试传递的信号。
如果在TIP中使用p:pR?()来感应传递的信号,那么将对其提供自变量。
[0215] 在任何ALLEOP(2.11)到(2.14)中不存在与E.g:pR?()相关联的并行激活。由此,在(2.11)中的E.g:pR?()不具有自变量。然而在(2.12)和(2.13)中的E.g:mR(…)*具有并行激活并且由此具有自变量。在指定并行激活的时间,系统对ALLEOP-guard中的信号感应操作提供自变量。下面给出的其他ALLEOP是类似地从它们各自的TIP中得到:
[0216] //从(2.4)中的Be.f:TIP()、图5中的网络和轮询周期(2.8)得到
[0217]
[0218]
[0219] 注意在(2.12)中,信号发送事件中的时间地图Be.gS(T[Be.g,0)]不参考端口组DB=[Be.g,Bi.g],然而信号传递事件中的时间地图(T[B.g,1)]参考B。这是因为Ben没有与Bill调整他经过Be.g发出信号的时间,但是代理a2(见图5)发送调整的信号,D S D
引起传递事件(T[B.g,1)]发生。在事件Be.f[T(Be.f,0)]和[T(B.f,1)]中出现类似的规范。
[0220] //从(2.5)中的Bi.f:TIP()、图5中的网络和轮询周期(2.9)中得到
[0221]
[0222] 在不同的端口-ALLEOP中出现的相同的时间地图指示在不同的ALLEOP中在相同时间发生与这些时间地图相关联的事件。由此,在ALLEOP(2.12)、(2.13)和(2.14)D中的[T(B.g,1)]指示相同的传递事件正在三个ALLEOP中被参考。类似地,在D
ALLEOP(2.12)、(2.13)和(2.14)中的[T(B.f,1)]参考相同的传递事件。注意,在(2.12)、(2.13)和(2.14)中的并行激活之后不存在椭圆、‘→…→’,。这是因为信号接收单元在它们各自的端口等待信号;所以它们立即感应到传递的信号。
[0223] //从(2.6)中的Me.f:TIP()、图5中的网络和轮询周期(2.10)得到
[0224]
[0225]
[0226] 从TIP得出ALLEOP的规则是简单的。ALLEOP结构看起来与FSP结构类似。但是,读者可以看到,存在一些不同。ALLEOP代表事件和因果链接。FSP代表状态和转换。我们稍后将看到ALLEOP和FSP的关系。应该指出,在ALLEOP中指定的动作,例如动作Be.f:work()、Bi.f:lay()和Me.f:meet()可以总地引起在ALLEOP中发生支路因果序列。存在两种支路:一个是选择支路,其中通过评估与因果序列相关联的选择条件并且选择被评估为真的第一个来从因果序列的有限集合中选择一个代替品来在运行时间运行。我们使用符号‘|’来分离出选择替换物(见(4.14))。在上面的ALLEOP中没有出现选择支路。另一种支路,称为多并行支路(分支),类似于作为通信结果发生的ALLEOP(2.11)和(2.14)中的分支。
[0227] 时间地图的部分顺序:在这个例子中各种时间地图和它们的部分排序是,[0228] T(E.g,0),信号被发送给Bi.f和Be.f,开始游戏 <[0229] T(E.g,1),信号被传递给Bi.f和Be.f <
[0230] (T(Be.g,0),T(Bi.g,0))Bi.g和Be.g发送开始会议信号至Me.f <[0231] T(B.g,1),开始会议信号由代理a2传递给Me.f <
[0232] T(Me.f,0),会议结束信号给发送给Bi.g和Be.g <[0233] T(Me.f,1),会议结束信号被传递给Bi.g和Be.g <
[0234] (T(Be.f,0),T(Bi.f,0)),游戏结束信号至E.g <[0235] T(B.f,1)],游戏结束信号由代理a1传递给E.g (2.15)[0236] 不可比较的时间地图对:
[0237] (T(Be.g,0),T(Bi.g,0))≤T(B.g,0),a2发送调整的信号至Me.f
[0238] (T(Be.f,0),T(Bi.f,0))≤T(B.f,0),a1发送调整的信号至E.g (2.16)[0239] 在(2.16)中的不可比较的时间地图对可能彼此交叉,即T(Be.g,0)∩T(Bi.g,0)≠φ和T(Be.f,0)∩T(Bi.f,0)≠φ。这暗示有时Ben和Bill将同时发出信号,仅是偶尔。合并的ALLEOP是,
[0240]
[0241] 这里,由(2.15)和(2.16)中的部分排序限制蜂窝的并行操作。该限制由网络结构和信号交换定时自动施加。不调用调度。为了改进这些ALLEOP并完成实施,我们必须定义并行线程Me.f:meet()、Be.f:work()、Bi.f:play(),和条件E:readytoStart?(),无论它们是什么。在语句(2.11)到(2.14)中定义的端口ALLEOP是由应用执行的计算的模型。TICCTM-Ppde生成与TICCTM网一致的端口ALLEOP和轮询规范的串行/并行组合,从而生成实施的完整的ALLEOP模型。使用ALLEOP模型我们证明的任何属性将是实施的有效属性,而不只是期望设计的属性。所有ALLEOP以全局时间运算符□开始。我们在ALLEOP描述中忽略这个运算符。总是假设该运算符存在。
[0242] 2.1.2CIP的ALLEOP
[0243] 让我们对于(2.2)中的CIP写入ALLEOP:这里我们已经假定称为User.g的端口,该端口向E.i发送中断信号。在图5中没有示出用户。
[0244]
[0245]
[0246] 注意在(2.18)中使用T(E.g,2)和T(E.g,3)。这是因为T(E.g,2)和T(E.g,3)已经在E.g:ALLEOP()(见(1.11))中使用,并且E.g:ALLEOP()出现在(2.18)中 的E:CIP-ALLEOP-body()。 这 里,E:initialize ?()= E.initialize;类 似 地,对象的每个布尔属性具有这种判定。在(2.18)
中,蜂窝E的端口在它们的TIP主体被执行之前不进行排序。
[0247] 下面在(2.19)中示出用于(1.1)中这种CIP的CIP-ALLEOP,其中在执行端口的TIP主体之前对端口进行排序,在下面的(2.19)中示出。在(2.19)中已经进行了下面的假设:端口X.g发送激活蜂窝的中断信号,并且在(1.1)中出现的poll&SortPorts()方法已经被分成两个分量:轮询和排序。在(2.19)中Cell:sortInto(…)中出现的自变量,Cell.ports是蜂窝附带的端口的矢量,Cell.sortedPortsList(Cell.spl)是另一个矢量,其将包含具有未决的消息的排序的端口,并且自变量sortR是排序关系。这些所有动定义在蜂窝分类中。
[0248]
[0249] 这里, 和 被用作特定范围内的索引的计数器;在它们的各自范围内的动作被应用于计数的索引中。
[0250] 2.1.3迹线
[0251] 迹线和ALLEOP之间的差异如下:(i)迹线假定虚拟时间点(下面简称为时间点),在上述时间点开始和/或结束事件和评估。(ii)当
是已知时,迹线将前提条件和后置条件与相关联。的特征A()具有格式,[0252]
[0253] 其中,
或者是并行线程、或者是协议或者是程序语句;τmax(A)是完成A()的执行所花费的最大时间,●→是执行符号,当precondition?()变成真时,A()开始在相同时间t0执行并且A()的执行在时间t1结束,当A()的执行结束时,(A.output:C?()& postcondition?())成为真。(iii)迹线还在的前提条件和后置条件中指定交换的消息的特征,如果存在的话。迹线还包含指定替代和并行分支的支路,如果它们对应的ALLEOP包含它们。我们忽略在迹线语句中的‘□’符号;假设该符号存在。[0254] 当系统得出用于端口ALLEOP的迹线,考虑到相同的虚拟时间点与端口ALLEOP中的同一时间地图相关联,它简单地假定对于端口ALLEOP中的不同事件具有不同虚拟时间点。这捕获在不同端口ALLEOP中发生的事件的同步和调整。在迹线中时间点的排序由事件在端口ALLEOP中发生的顺序指定。关于这个排序进行三个假设:(i)由●→链接的连续动作将一个接一个地立即发生,终止链接结尾的动作,该动作与在链接开始的动作同时开始。(ii)每个动作花费有限量的非零时间来使用已知的上边界完成执行,(iii)如果蜂窝在信号被传递给端口的时间在该端口等待该信号,那么在与信号传递时间相同的时间传递的信号被立刻感应,否则可能在信号传递之后的某个时间发生信号感应,(iv)当蜂窝通过端口C.p在虚拟时间Cp.t发出信号时,如果C.p属于端口组pG,那么系统知道接收由pG中的端口发送的信号的代理仅在从pG中的所有端口接收信号之后才分派调整的信号。我们说这个分派发生在时间pG.t。在这种情况下,系统引入排序Cp.t≤pG.t到迹线中。
[0255] 下面描述在(2.11)到(2.14)中的端口ALLEOP的迹线以及它们的说明。用于Ben-Bill解决方案的迹线包含并行分支。在对应于(2.11)中的ALLEOP的下面的迹线(2.21)中,在包括在括号内的‘(…‖…‖…)’表示描述并行分支。在这个迹线中没有出现
。在迹线(2.22)到(2.24)中出现,play(),work()和meet(),但是这些不具有为其定义的前提条件和后置条件。由此,在迹线中不出现它们。在(2.26)中出现具有前提条件/后置条件和消息条件的迹线。[0256] 在每个迹线中,仅当trace-guard是真时调用trace-body,否则跳过trace-body。在端口E.g的迹线E.g:trace(Eg.t0)用于(2.11)中的ALLEOP,E.g:ALLEOP(),如下所示:
[0257]
[0258] 在(2.21)中的E.g:trace-guard(Eg.t0)中的(E.g:pR()&E:readyToStart()*)断言条件(E.g:pR()&E:readyToStart()*)的评估在时间Eg.t0开始,并且在时间Eg.t1终止。D D
在(2.21)中对两个事件<→Be.f>和<→Bi.f>的相同时间Eg.t2的分配指示传递给端口S
Be.f和Bi.f的信号在相同的时间点同步。在E.g:trace-body中的规范“[●→E.g(Eg.S S
t1∈T(E.g,0))]”不具有角括号,“●→E.g”断言引起事件E.g 发生的动作的评估在时间S
Eg.t1∈T(E.g,0)开始。注意,“●→E.g”的开始时间和“<(E.g:pR()&E:readyToStart()*)S
(Eg.t0)>(Eg.t1)”的结束时间相同。没有指定“●→“●→E.g”的结束时间。与(2.21)中其他语句相关联的定时的解释与在ALLEOP中相同,不同点是在每种情况下假定了虚拟时间点。正像时间地图代表时间点的序列,每个虚拟时间点也表示时间点的序列。由此在(2.21)中,Eg.t1∈T(E.g,0)是E开始(bill‖ben)游戏的时间点的序列。下面示出在Bill-Ben游戏中与ALLEOP相关联的其他端口迹线。
[0259]
[0260]
[0261] 不可比较时间点:
[0262] (Bif.t1,Bef.t1)(Bif.t2,Bef.t2)(Beg.t0,Big.t0) (2.25)[0263] 在(2.22)和(2.23)的第一行中的存在的声明指定Bif.t0=Eg.t1<Bif.t1和Bef.t0=Eg.t1<Bef.t,指出在虚拟时间Eg.t1同步地将信号传递给端口Bi.f和Be.f,但是没有同步地感应传递的信号。感应的信号在不可比较的时间点Bif.t1和Bef.t1感应。类似地,当Bill和Ben分别在虚拟时间Bif.t1和Bef.t1发出信号至E.g时,它们并不调整它们发出信号的时间。然而,当在时间Bf.t0两个信号由代理a1接收时,a1将调整的信号分派给E.g。这个信号分派时间总是≥信号发送时间。由此在(2.22)和(2.23)中出现声明Bif.t2≤Bf.t0和Bef.t2≤Bf.t0。类似地,由代理a2在时间Bg.t0调整(Beg.t0,Big.t0)≤Bg.t0。Bill和Ben在时间Bg.t1在信号传递之后
马上感应到传递给它们的端口Bi.g和Be.g的信号,因为他们都在信号被传递的时间等待信号。
[0264] 读者应该理解在不同端口迹线中的彼此相同的时间点如何通过它们在时间地图中的成员资格而被识别。这样识别的虚拟时间点之间的等同性被引入到每个迹线顶部的存在的声明中。在不同蜂窝的端口的迹线中发生的所有时间点(通过等同性和不等同性必须不相关)是不可比较的时间点。
[0265] 一旦生成了所有的迹线,系统获知在ALLEOP中指定的时间地图中出现的虚拟时间点和在任何时间地图中没有出现的所有虚拟时间点。然后系统将不同端口迹线中的相同时间地图中出现的时间点设置为彼此相等。这识别了所有调整的和同步的信号传递。在(2.21)中迹线的情况下,在迹线的顶部的时间点的存在的声明中这样声明:Eg.t3=Bf.t1,其中Eg.t3是端口E.g接收到代理a1传递给它的信号的虚拟时间,其中Bf.t1是a1传递该信号的虚拟时间(见图5)。这识别了传递给由ALLEOP(2.11)、(2.12)和(2.13)中的时间地图T(B,f,1)指定的端口E.g的调整的信号。在(2.22)和(2.23)类似地,Bef.t0=Eg.t1=Bif.t0。这指定了传递给端口[Be.f,Bi.f]=B.f的同步信号。虚拟时间点的这些识别与(2.15)所示的部分排序相一致。在建立了虚拟时间点之间的关系之后,系统以由这些事件激活的迹线一致的形式将传递事件自变量分配给迹线中的所有信号感应操作。如果知道与动作相关的消息特征和前提条件/后置条件(用户帮助可能需要获取),将ALLEOP翻译成迹线不是复杂的。
[0266] 在该应用中的端口迹线仅使用信号感应条件。在部分6.4和附录III中,迹线包括各种条件和分支动作,前提条件/后置条件与这些东西相关联。每个迹线引起了它的事件特征表(ECT),其以表格的形式简单地重新组织了迹线中的信息,以便于证明生成。我们将在部分6中看到这些例子。
[0267] 2.1.4.CIP的迹线
[0268] 下面在(2.26)中描述CIP-ALLEOP的迹线
片段,以证明如何处理具有 计数器的语句。在(2.26)中出现的语句 断言在端口p[i]和q[i]之间存在路径。以一定顺序由 计数器对索引和项目进行计数。在下文中,假设索引i的计数之后跟着索引i+1的计数,其中0≤i<n-1。出于方便,下面重现在(2.19)中出现的具有计数器的ALLEOP语句(将spL读为sortedPortsList):
[0269]
[0270] 下面给出上述计数器语句的迹线:
[0271]
[0272] 在(2.26)中要注意的特征如下:(i)信号在时间q[k].t0被传递给端口p[k],并且在时间Cp[k].tk感应传递的信号。对于索引k排序动作Cell:sortInto(…)在相同的时间Cp[k].tk立即开始。当用于索引(k+1)的排序动作开始时,用于索引k的这个排序动作在Cp[k].tk+1终止。这在顶部的定时规范中声明,其中出现声明Cp[k].tk+1=Cp[k+1].tk+1。对于其他计数器语句出现相似的定时结构。(ii)对于[<●→Cell:sortInto(p[k],spL,sortR)(Cp[k].tk)>(Cp[k].tk+1)]动作表示前提条件和后置条件。使用上述迹线片段生成用于CIP-ALLEOP的迹线将十分直接地进行。
[0273] 3.1.5ALLEOP和因果网的图形表示
[0274] 在图6A中示出了用于这个应用的ALLEOP的图形表示。它表示在(2.11)到(2.14)中描述的端口ALLEOP的串行并行分量。在图6A中的ALLEOP图形中出现的节点被称为事件分类,因为当交替地运行应用时可能发生每个节点的许多实例。在节点对之间的直接链接表示节点之间的因果关系。在图6A中链接上的标签标记条件,对于那些要发生的链接条件应该保持为真。这里仅出现信号感应条件。
[0275] 对于图6A中的ALLEOP图形,在图6B中示出了在单轮游戏中由SMS产生的因果网。在图6B中的每个节点是它对应的ALLEOP节点的例子。尽管ALLEOP示出了用于paly、work和meet的动作事件,因果网仅显示通信事件,其是在ALLEOP和迹线中出现的通信事件分类的例子。取代在迹线中假定的虚拟时间点,与因果网事件相关联的时间例子是在与应用相关联的全球时钟的时间点。这是在该轮应用中发生事件的时间。图6C示出了当重复游戏几次时的因果网。因果网保留图6A所示的时间顺序,不同之处在于图6A所示的循环链接由图6C所示的
迭代替代。显而易见,就像时间地图,在迹线中的虚拟时间点也具有与其相关联的时间实例的序列。
[0276] 在因果网中出现的事件节点的集合仅为在一轮应用中发生的所有通信事件的集合,并且它们各自的发生时间一起出现在应用的迹线中。如果迹线包括选择点,不是所有在迹线中出现的事件都具有因果网中的对应事件,仅在选择点选择的事件将具有在因果网中的对应事件。可以忽略所有前提条件/后置条件、事件的感应和在迹线中出现的动作事件。由此因果网是与在一轮应用中发生的图像数据对应的迹线片段的概要。接收同步输入信号的节点具有与它们相关联的相同的全局时间实例。类似地,通过代理分派调整的
输出信号的节点具有与它们相关联的相同的全局分派时间实例。与迹线中的事件分类相关联的每个不同的虚拟时间点对应于与从迹线中生成的因果网中的事件分类的实例相关的不同时间S
实例序列。由此,在(2.21)中的语句E.g(Eg.t1∈T(E.g,0))中出现的虚拟时间点Eg.t1表示时间点的序列,如图6C所示的T(E.g,0)=[t0,t8,t16,…,t8n]。
[0277]
[0278] 图6:Bill_BEN解决方案的ALLEOP和因果网
[0279] 在因果网中通过图6B和6C所示的定向链接彼此链接节点。链接指定节点的部分排序。存在两个链接:(i)因果链接,其指定在TIP执行过程中发生的事件的排序,以及(ii)执行链接,其指定当不同TIP在一轮应用的过程中发生在蜂窝中时的执行的排序。在因果网中的事件实例的部分排序是由这两种链接引入的部分排序的联合。在图6C中,游戏的连续迭代之间的链接是执行链接。所有其他的链接是因果链接。在这种情况下,每个蜂窝仅具有一个TIP,因为我们已经忽略了中断端口活动。如果蜂窝具有多个该端口和功能端口,在因果网中将出现更多的执行链接。
[0280] 如果在端口ALLEOP中发生因果链接X→Y or X●→Y,并且在因果网中发生事件实例x的x(),那么在一定延时τ>0,在因果网中必须发生Y的事件实例Y(t+τ),按照部分5.4中定义(5.27)。如果在端口ALLEOP的图形,或者端口ALLEOP的文本描述中的C(X,Y) C(X,语句C(X,Y)?(){X→Y}or C(X,Y)?(){X●→Y}中发生因果链接X →Y或X
Y)
●→Y,那么仅当在时间(t+τ)时条件C(X,Y)是真,在一定延时τ,τmax(X,Y)≥τ>
0之后在因果网中一定发生事件实例Y的Y(t+τ)。这是因为如在部分5.5中所述(i)由蜂窝执行的任何并行线程或协议是不可中断的,(ii)并行线程和协议的激活是自动的(不是由蜂窝外部的任何程序计划的)并且(iii)除非当存在系统故障、死锁或活锁(部分系统死锁),保证
进程。在通常情况,必须提供死锁和活锁的
自由度。
[0281] 任何时候当应用的因果网偏离它的ALLEOP时,可以设置自我监控系统SMS来发送告警。此外,可以通过将事件模式定义为ALLEOP节点的常规表示来指定告警情况。由此,如果在X→Y和X●→Y中,在指定的上界限τmax(X,Y)之后没有发生事件Y,则SMS将发布错误告警。如果在用于延时的指定的上界限之后发生了事件Y,则SMS将发布未决的错误告警。在正常操作模式下,一旦发生了对应于底部节点的事件,如果满足了它的前提条件,图6A中的ALLEOP中的每个事件必定发生,否则将发生告警。
[0282] 如部分7所述,在因果网中的事件是由被称为时间建立者蜂窝(eb蜂窝)的指定蜂窝与应用的操作并行动态安装,同时运行应用并且在应用中正发生事件。在成长的因果网中出现的事件模式由事件分析者蜂窝(ea蜂窝)分析。如果在成长的因果网中发生先验指定的告警条件中的模式,那么与该模式相关联的ea蜂窝将生成告警。SMS可以被设置为注意从ALLEOP中指定的进程的任何背离并且发布告警。基于在成长的因果网中动态识别的模式,通过设置应用中ea蜂窝的
选定的总端口和恰当的蜂窝的中断端口之间的路径并且对于这些端口定义TIP,SMS还可以设置以影响应用中正在进行的计算。
[0283] 2.1.6注解
[0284] 在TIP执行中的非确定性:在不同蜂窝中的TIP指示彼此不同步。它们也不与信号传递事件同步。仅在端口的父蜂窝轮询该端口的时候在该端口处存在传递信号,在端口处执行TIP,否则跳过该端口。不能预测信号到达蜂窝的不同端口的顺序。由此,不能预测何时蜂窝将感应传递给蜂窝的一个端口的信号并对其做出响应。因为在一个轮询周期中在端口错过的信号总是在下一个轮询周期被捕获,在信号已经被传递给端口之后,可以设置C蜂窝可以何时对信号做出响应的边界:如果Δmax是在蜂窝C的轮询周期中服务所有具有C TM
未决的消息的端口所需的最大时间,那么这个边界<2Δmax。这是TICC -Ppde固有的非确定的源。
[0285] 共享CPU:图5所示的网络需要至少三个CPU来运行网络。环境E可以暂停它的操作并在将信号发送给Bill和Ben之后释放它的CPU。当Meeting从Bill和Ben接收到信号时,可以在可用的自由CPU中自动激活该会议,并且稍后当E从Bill和Ben接收信号时,类似地在任何可用自由CPU中重新开始暂停的操作。通常,运行网络需要的CPU的数目为至少一个加上并行运行的蜂窝的最大数目。如果蜂窝已经被编程暂停/重新开始它们的操作,那么CPU在间歇地运行的蜂窝周围切换。
[0286] 进展:在图6所示的图表中,存在暗示的假设,并行线程、play、work和meet是无条件的并且假定它们总是终止。通过这样的假设,应用不具有死锁或活锁,并且在游戏的每个迭代中发生会议同步。我们在部分6中介绍正式的证明方法。我们将看到在Dining Philosopher实例中的情况,其中采用
预防措施来确保实施不具有死锁和活锁,并且计算的细化结构在能够提供这样的保证中发挥作用。
[0287] ALLEOP和FSP:如前所述,如果移除在ALLEOP中的循环,在ALLEOP中的节点和TIP的迹线是事件分类并且链接指定部分排序。应该注意到,如果在图6A中移除循环链接,那么ALLEOP是点阵。这是特殊情况。如前所述,ALLEOP没有表示状态和转换。然而,如果在由ALLEOP建模的应用的状态表中状态的数目是有限的,那么ALLEOP应该在某种意义上等效于FSP。我们参考这样的ALLEOP作为有限ALLEOP。在有限ALLEOP中所有可能因果链的集合是规则集合。
[0288] 被看做有限ALLEOP的概要的FSP:假设在ALLEOP(2.11)到(2.14)中,我们仅关注蜂窝和动作,例如在蜂窝中执行的play()、work()和meet(),并且忽略信号交换事件和信号感应操作。然后ALLEOP(2.11)到(2.14)产生下面的实施的FSP描述:
[0289] E=[(readyToStart→[BILL‖BEN])|(interrupt→STOP)];
[0290] BILL=play→meet→E;BEN=work→meet→E; (2.27)
[0291] 在中断之后E停止。在ALLEOP中没有示出这个,而是在CIP中指定。我们在此已TM经采用了特权来将其包括在这里。按照FSP约定,在meet和E中发生FSP同步。这在TICCTM
中被称为调整。当同步和调整用于TICC 范例的时候,FSP不辨别同步和调整。此外,FSP没有简单的框架来指定不同动作的时间同步(即,具有不同名称的动作),除非基于它们的同步特性来重新命名动作。
[0292] 当蜂窝包含多个功能端口、总端口和中断端口,并且动作是有条件的时,交换消息并且TIP是复杂的(如在部分4中讨论)。对应于ALLEOP的FSP描述也将是复杂的。然而,看起来可以将具有固定有限数目的端口的任何应用的ALLEOP概括以获得它们的等同的FSP规范。由此,看起来具有固定的有限数目的端口的每个应用的ALLEOP是有限ALLEOP。
[0293] 将FSP反向翻译到它们对应的有限ALLEOP以实施将是困难的,因为(i)FSP不能辨别同步和调整,(ii)识别状态之间的通信链接,或者(iii)引入事务的概念。例如,在(2.27)中的FSP并没有指定,在meet之后对E经由Bill和Ben通过同步和调整的通信通知游戏的结束。这里存在FSP中没有出现的隐藏状态(端口和代理的状态)。发生这种情况的原因是FSP不具有端口、代理、事务、路径和协议的概念。我们没有充分地调查对FSP的ALLEOP概要以及对ALLEOP的FSP细化,以进一步进行注解。由该讨论得出的ALLEOP和FSP之间的关系是显著的,并且应该被进一步追踪。
[0294] 仅依赖于有限ALLEOP的结构的所有证明将具有FSP证明的简单性。用户定义要被证明的CTL断言,并且还可以提供断言来引导证明搜索。系统验证在接收断言之前,由用户提供的每个断言对于给定实施是有效的。
[0295] NFSP证明:依赖于计算中使用的变量值的ALLEOP证明可以请求NFSP(非FSP)证明方法。这样的NFSP证明可以获取对ALLEOP的结构的感应。我们将看到部分6中的FSP和NFSP的简单例子。对于在计算中网络动态增长的应用,它的ALLEOP可以是NFSP ALLEOP,包含上下文相关以及具有潜在无限数目ALLEOP节点的通用递归结构。在部分6.7中示出例子。
[0296] 下面的例子是[Magee & Kramer,13]中 描述的“谈话和期 望(talking and itching)”例子的增大版本。这里,期望证明非确定性保护间隔、并发、封装(encapsulation)、隐藏和调整(coordination)的使用。
[0297] 2.2.谈话和期望:封装、并发和调整
[0298] 人们同时谈话和期望。在[Magee & Kramer,13]中,仅存在一个人,并且该人通过时隙并发来进行谈话和期望。我们考虑具有两个人的该例子的通用版本,其中在它们之间发生交谈,并且每个人在谈话的时候间歇地搜寻。该机制可以用于多于两个人。通过在任何时间不超过一个人谈话来保持有序的谈话。这个例子使用了具有虚拟存储器的Das路径,其已经在图4中介绍。
[0299]
[0300] 图7:两个人的谈话和期望实例
[0301] 在图7中所示的网络,P0和P1是两个人。每个人Pj(j=0,1)是合成的蜂窝,包含一个对话蜂窝Cj和一个期望蜂窝Ij。这两个蜂窝在每个人的不同CPU中并行运行。每个合成蜂窝隐藏的内部连接并且一些具有与外部端口的连接。让我们首先看一下对于两个封装的蜂窝的内部和外部连接以及它们支持的网络活动。
[0302] 外部连接:对于j=0,1,存在路径Cj.f0,Pj.f0,a1,a0,E.g1](见图7)。这里,端口[P0.f0,P1.f0]形成端口组;代理a1将同步的信号传递给[P0.f0,P1.f0],并且经过代理a0从[P0.f0,P1.f0]将调整的信号传递回到E.g1。类似地,E.g0通过代理连接至端口组[P0.i,P1.i]中的外部中断端口,端口组[P0.i,P1.i]反过来分别连接至内部中断端口(C0.i,C1.i)。E使用这个路径来激活蜂窝Cj(j=0,1)。存在路径[Cj.f2,Pj.f2,Pk,g2,Ck,g2],其中i,k=0,1,并且i≠k,这允许Cj.f2 and Ck,g2之间的通信。类似地,路径[Cj.f3,Pj.f3,Pk,g3,Ck.g3]能够进行Cj.f3和Ck.g3之间的通信。
[0303] 内部连接:Pj.g具有至中断端口Ij.i的内部连接。当Pj被激活时,它使用这个连接来激活Ij。其他两个内部连接是 和 Cj和Ij使用这两个连接来调整它们的活动。
[0304] 隐藏:仅链接至封装的蜂窝的外部端口的端口和代理可以从外部世界访问。封装内部的路径对外部世界隐藏,我们将这称为隐藏。
[0305] 网络活动:环境E通过将中断信号广播给端口组[P0.i,P1.i]中的端口来激活交谈蜂窝Cj(j=0,1)。一旦被激活,蜂窝初始化、确认中断信号的接收并且然后开始轮询它们的端口。在初始化的过程中,每个蜂窝Cj通过经由Cj.g将中断信号发送至Ij.i来激活期望蜂窝Ij(见图7)。这引起期望蜂窝在执行它们自己各自初始化之后开始轮询。在激活之后,对话蜂窝E广播随机选定的2比特信号[b0,b1]至端口组[P0.f0,P1.f0]中的端口。关于这些比特的限制是它们不能均为“0”,或者均为“1”。仅当b0=1(b1=1),代理a1(见图7)发送传递信号至P0.f0(P1.f0),否则不发送。
[0306] 当一个人在端口Pj.f0接收信号,信号通过内部连接行进到Cj.f0。当Cj感应到这个信号,它开始谈话。由于b0和b1不能都是1,两个人不能同时开始说话。当一个人说话时,另一个人的蜂窝将轮询他们的端口,并且假定侦听该谈话。在开始说话之前,Cj通过Cj.g0发送信号至Ij.f0(见图7)。当Ij感应到这个信号时,基于布尔变量、Ij.itching和Ij.continue是否均为真,他开始间歇地搜寻,并且当Cj说话时,它继续间歇地搜寻。通过随机真值发生器Ij:random()在每个搜寻周期中设置Ij.itching和Ij.continue的真值。由此,一个人不能总是在谈话会话中搜寻。这里假设,总是在比谈话间隔短得多的间隔中进行搜寻。由于期望和对话蜂窝并行操作,由它们执行的动作并行发生,即使一个人开始说话和开始搜寻的时间点并不彼此同步。这里的异步将是在2千兆赫兹CPU中几百纳秒。
[0307] 在说话之后,Cj首先通过路径 发送信号。这通知Ij停止搜寻。Cj然后以下两件事情之一:(i)它通过路径中的端口[Cj.g2,Pj.g2,Pk.f2,Ck.f2]发送信号至Ck.f2(k≠j)(见图7),以建议Pi开始谈话以继续对话,或者(ii)通过路径中的端口[Cj.g3,Pj.g3,Pk.f3,Ck.f3]发送信号至Ci.f3,以终止对话。稍后描述在两个功能端口Ck.f2和Ck.f3这些相互排他的信号被用于继续或停止对话的方式。
[0308] 下面TIP中的一个使用格式 的不确定的保护间隔。符号‘|’指定替代物。这里,每个Ci在轮询周期中的每一个中评估该保护间隔。
仅当保护间隔中指定的替代物之中的一个端口具有向其传递的信号,保护间隔被评估为真。在保护间隔中被传递给端口的信号应该是相互排他的,为了成功地操作不确定的保护间隔。如果在ci.f2感应到信号,那么对话继续,如果在Ci.f3感应到,那么对话终止。如果对话终止,那么信号通过端口Ci.f0发送回到E.g1,如果这个端口准备好发送那个信号。
仅当ci.f0通过代理a1从E.g1较早地接收了信号,ci.f0将准备好发送那个信号(见图
7)。由此,仅从E接收了信号的蜂窝对其响应。这里发生调整,在这一点,代理a1将期望仅从对其较早传递了信号的端口接收信号。当a1传递这个信号到E.g1时,它通知E对话终止。在该点,E可以开始另一个对话会话,或者通过发送第二个中断信号至中断端口Cj.i(j=0,1)来终止游戏,Cj将在终止自身之前通过发送中断信号至Ij.i(见图7)来终止Ij。
在下面的TIP中没有示出开始和终止处理。
[0309] 每个人的蜂窝具有下面的轮询周期:
[0310]
[0311] 让我们假设Cj开始对话并发送信号至Ci来继续对话。在发送该信号之后,Cj将开始轮询它的端口,根据上述轮询周期,假定在相同时间侦听其他人说话(在这个实施中不包括侦听处理)。Cj可以经过多个轮询周期,同时继续对话。这将引起重复地感应在Cj.f0处接收的传递信号。因为只要对话继续就不发送响应,每次完成感应时,在cj.f0的信号的感应将成功,如图1中所述。由此,当Ci正在说话时,Cj也将开始说话。为了防止这种情况,Cj在cj.f0感应到传递信号之后立即设置Cj.f0.input=φ。这防止了在Cj.f0重复感应信号。我们使用语句Cj.f0:suspend()来进行。因为暂停不会改变端口的状态,当这样做恰当时,将通过暂停的端口来发送响应。
[0312] 通过这个序言,以及下面给出的注释,读者现在能够遵循下面描述的TIP。
[0313] 对于个人Pj,j=0,1:TIP用于谈话部分。.
[0314]
[0315] 对于个人Pj.j=0,1.TIPS用于期望部分.
[0316]
[0317]
[0318] 每次在P0.f0或P1.f0接收信号时开始对话。每次对话开始或间歇地继续时开始搜寻。我们将如何发生正确的调整留给读者。网络不提供侦听。为了提供侦听,通过与对话蜂窝的恰当调整在封装中引入第三侦听蜂窝。
[0319] 2.3观点TM TM
[0320] ALLEOP集成由TICC 网提供的结构信息,使得在TICC 网、TIP和轮询周期中暗示的并行计算、同步和调节的控制结构明确,并且定义由时间地图假定的时间点的部分排序语义。它们表示可访问机器处理的格式中的集成的信息。对于人类,他们如下回答问题:路径做什么?什么是TIP?什么是轮询周期?什么是通信模式?可以如下回答这些问题:路径使得端口之间能够进行信号通信,执行通信的同步/调整,对交换的消息提供访问,并且激活信号接收蜂窝中的并行计算。TIP处理/创建消息、发送/接收信号、并且从通信中隔离用于消息处理/创建的方法。轮询周期指定蜂窝参加在它们的端口的TIP执行的顺序。因为基于相关的条件使得在可选因果链中进行选择,并且通过信号传递并行任务/分支的激活,得到通信模式。事件模式由此定义并行计算中支路、分支和接合控制结构的模式。可以使用常规语法或使用ALLEOP节点作为终端符号的其他种语法来描述这样的模式。然而,ALLEOP没有指定由蜂窝执行的计算的细节。每个ALLEOP节点表示事件分类。可以在因果网中发生ALLEOP节点的多个实例。
[0321] 就像可以以不同数据结构定义运行相同的时序程序,对应用定义的并行线程的相TM TM同集合可以对于相同应用在不同TICC 网中并行运行。由此,可以将TICC 网看做并行计算的控制结构的概要,就像数据结构是序列程序中数据操作的概要。
[0322] 迹线将信息加入到ALLEOP。迹线假定虚拟时间点并将其与ALLEOP中发生的事件分类和时间地图以与ALLEOP规范一致的方式相关联。由此很清楚定时在ALLEOP中是清楚的。迹线还通过将前提条件/后置条件与动作相关联并且通过表征交换的消息(如果有的话),定义由TIP执行的计算的语义。对于人类,他们回答下面的问题:动作计算什么?动作被正确执行了吗?同步发生了什么事件?调整了什么事件?对这些问题的答案如下:由为了动作成功表征在动作执行之前什么应该保持为真的前提条件以及在执行终止之后表征什么应该为
帧的后置条件来定义动作。在这些前提条件/后置条件中可以包括由动作处理/创建的消息的特征。如果每次执行动作时,在恰当的时间满足前提条件和后置条件两者,则动作的实施是正确的。同时发生具有相同虚拟时间点的事件。具有相同虚拟时间点的消息分派事件是调整的事件。
[0323] 因果网是仅关注在应用中的通信事件并发上的迹线的概要以及它们的同步/调整特性,忽略所有条件和动作。如部分7中所述,事件分析者蜂窝(ea蜂窝)可以分析与应用并行的应用的增长的因果网,同时由事件建立者蜂窝(eb蜂窝)创建因果网,而与应用的正在进行的操作的定时不存在干扰或存在很少干扰。由ea蜂窝执行的分析是基于先验定义的事件模式,或者由ea蜂窝动态学习的事件模式。甚至由ea蜂窝识别的模式可能被用于指引应用中执行的计算。
[0324] 对于应用部分排序的域是对于应用可以运行的所有可能的方式SMS可以生成的所有可能的因果网的简单表示。由此,这个域和从该域映射到本身的单调连续映射一起足TM以定义TICC -Ppde的指称语义。这与π微积分观点一致:逻辑不需要用于计算;具有合适的隐藏和替代规则的通信就足够了。逻辑仅需要用于定义和证明计算的正确性。这就是为什么需要迹线提供的信息以提供CTL断言。ECT重新组织在迹线中的信息,并且轮询周期和ECT网络提供实施中的端口ECT的串行/并行组合。它们被用于提供CTL断言。我们将看到部分6中的一些例子。
[0325] 在附录I到III中表示的实施和在部分6中表示的证明示出了上面提到的观点。值得注意ALLEOP很容易由系统从实施规范中自动地得到。如果系统已知动作的前提条件TM
和后置条件,则从ALLEOP中容易地并自动地得到迹线。TICC -Ppde提供用于动作的前提条TM
件/后置条件的交互开发的工具。TICC -Ppde的四个特征使其成为可能:(i)关于具有附TM
带的端口的蜂窝、具有代理和可选的虚拟存储器的路径的TICC 网的组织;(ii)关于TIP、轮询周期、并行线程和协议的通信的组织;(iii)计算和通信的集成:执行计算的每个蜂窝也使用CCP的协议执行所有它的通信;以及(iv)蜂窝的相互隔离(部分3.2中讨论)。
[0326] 3.关于蜂窝和路径的更多情况
[0327] 3.1附件和调谐
[0328] 附件和调谐在TICCTM中具有特殊的意义。仅附带和调谐的部件可以彼此自由地共享数据和方法。由此,附带的和相互调谐的端口、蜂窝、代理和虚拟存储器可以彼此自由地共享方法和数据。
[0329] 我们使用a.M来参考代理a附带的虚拟存储器,使用M.a[i]来参考M附带的第i个代理,并且设置p.M=p.a.M,其中p.a是对其调谐p的代理。仅通过分支或h分支(隐藏分支)彼此连接的部件或者彼此附带的部件可以在路径中彼此发送信号。在图4和5中,端口被附带于它们的父蜂窝,通过分支连接至代理,并且代理通过h分支彼此连接(它们是h分支,因为当动态地改变路径时,不能动态地改变代理互连)。由此,在路径中的代理和端口以及代理对可以交换信号并且蜂窝可以发送信号至它们的端口。如前所述,在任何给定时间路径仅在一个方向上允许信号转移,并且交换信号的部件总是彼此调谐。
[0330] 调谐:通过分支b将端口p连接至代理a,将p调谐至a,通过设置(i)p和a的初始状态,该初始状态使得它们能够彼此交换信号,并且(ii)向p转移a.M=p.M中的数据的地址以及方法,使得当p的状态是S时,p的父蜂窝能够访问p.M中的数据和并行线程。由此,将p调谐到a也将p和它的父蜂窝调谐到虚拟存储器a.M=p.M。因为蜂窝可能具有多个端口,蜂窝可能具有对其调谐的多个虚拟存储器,蜂窝的不同端口具有不同的虚拟存储器。通过将两个蜂窝连接至设置蜂窝的初始状态的h分支来彼此调谐这两个蜂窝。
[0331] 事务完成:如前所述,在每个蜂窝中的端口的周期轮询确保了被发送给蜂窝的端口的每个业务请求被感应到并对其做出响应。当任何蜂窝正在对业务请求做出响应时不能中断该蜂窝。蜂窝仅在连续的TIP执行之间感应和响应中断。这些特征与下面的子部分描述的蜂窝隔离一起确保每个事务的事务完成,并且这保持路径部件总是彼此调谐。
[0332] 3.2蜂窝隔离
[0333] 蜂窝通过轮询它们的端口并且执行在端口定义的TIP主体来执行计算。由于蜂窝在不同的计算单元并行操作,它们提供并行执行机制并且不使用时间分割的中断驱动的并行线程执行。并行线程和协议与蜂窝和它们的端口唯一相关。蜂窝的每个端口可以具有并行线程并且将具有与其相关的唯一协议。由项目的两个属性定义蜂窝隔离。
[0334] 私有和本地并行线程:当执行并行线程时,蜂窝可以仅使用蜂窝中定义的数据和处理,或者附带在蜂窝上或者与蜂窝调谐的部件。在这样的并行线程执行过程中不能使用其他数据或处理。特别地,操作系统不能干扰TIP执行。可以由任何其他蜂窝执行与蜂窝相关的并行线程,即使相同并行线程的副本可以由不同蜂窝并行执行,每个服务在它自己的私有存储器或相关的虚拟存储器中。并行线程执行仅可以改变执行并行线程的蜂窝的状态。蜂窝的这些特征类似于施动和π微积分代理。
[0335] 在端口组中端口的父蜂窝(见图19)可以在端口组中的端口的共享虚拟存储器中同时执行相同的并行线程。在这样的执行过程中,它们可以使用共同共享的变量。在部分6.2中我们将看到如何组织并行线程以阻止这样的执行过程中的存储器干扰。与协议相关TM
的这些特性和下面提及的特性对于TICC -Ppde组织是唯一的。
[0336] 私有和本地协议:不同的端口具有对其定义的不同协议。在蜂窝的端口定义的协议可以由除了端口的父蜂窝之外的任何蜂窝执行。当在蜂窝的端口执行协议时,蜂窝执行在连接至端口的路径上的协议中的CCP和其他动作语义(见部分7)。协议执行没有使得蜂窝执行在协议本身中没有定义的任何其他线程或处理。也没有使用在路径的部件中没有定义的数据。不同的蜂窝可以仅并行执行不同的协议(由此协议是在端口实例中定义的方法而不是端口子分类。在我们的C++实现中,这强制执行我们解释性地执行协议,追踪路径的部件。这对于由于在协议执行过程中发生的重复的高速缓存再充满引起的显著的无效率有贡献。由此,即使在2千兆赫兹的机器中花费了20到50纳秒来执行CCP,则花费350到500纳秒执行具有四个CCP的协议。这可以通过提供C++中的Eval运算符以及通过消除高速缓冲存储器的使用来避免,如在本文中稍后建议的那样,其中Eval运算符类似于用于评估与端口相关的编译的协议的LISP中的eval运算符)。如前所述,经过相同的组对组路径由端口的父蜂窝并行执行端口组的端口处定义的协议段(见图19),如部分7中描述。
[0337] 3.3并行缓冲、并行电报和灵活性
[0338] 不需要序列缓存Ever:在接收到对第一次请求的业务的响应之前,总端口不能发TM送第二个业务请求消息至功能端口,类似于例如图1和2中的端口D.f。这对于TICC 网中的所有总端口和功能端口均保持真。由此,没有虚拟存储器将在任何时间保持多于一个未决的业务请求消息。在它的虚拟存储器中保留每个未决的业务请求消息直到感应到该请求并做出响应。
[0339] 类似地,在它的虚拟存储器中保留每个答复消息直到由消息接收蜂窝感应并使用该答复消息。没有虚拟存储器将在任何时间保持多于一个答复消息。因而,每个虚拟存储器在任何给定时间最多保持一个业务请求和一个答复。连接至不同路径的不同端口将具有TM与其相关的不同虚拟存储器。由此,在TICC 网中的虚拟存储器对于业务请求和答复提供并行缓冲机制。这些特征消除了序列缓存的需要。不像施动者系统,不需要解决缓冲竞争,并且不需要串行器。
[0340] 并行消息传送:我们已经提到了一些。我们将再次提及:由于(i)每个蜂窝本身在其他蜂窝并行执行消息交换所需的协议,(ii)没有两个不同的路径共享共同的部件,并且(iii)没有协议执行在路径的部件中没有定义的任何线程或处理,不同的协议可以没有相TM互干扰地并行执行,无论它们是通过点对点还是组对组路径。由此,在TICC 网中蜂窝之间并行地同时交换的消息的数目仅由网络中激活的蜂窝的数目和不同路径的数目限制。CCP保持路径部件与蜂窝隔离并且彼此隔离。
[0341] 灵活性:可以动态地改变连接至端口的路径从而引入灵活性,只要不违反下面的路径需求:(i)没有端口连接至多于一个路径;(ii)没有相同蜂窝的两个端口可以连接至相同的路径,除非该端口处于端口矢量(见部分4.2和部分7);以及(iii)没有两个不同的路径可以共享部件。在事务的中间,路径的消息目的地功能端口可以从路径中断开并且路由到不同的目的地功能端口。然后新的目的地端口的父蜂窝将处理路径的虚拟存储器中的业务请求消息,在虚拟存储器中写入答复消息,并且将路径重新连接回到它的原始目的地端口,然后如果需要,该原始目的地端口的父蜂窝可以修改该答复,并且将该答复发送到请求该业务的总端口。由此,总是通过传递业务请求的相同路径发送回来答复。在事务的中间不能动态改变连接至路径的总端口。
[0342] 在分布式存储器系统中,通过将虚拟存储器的整个内容传送到分布式系统中的其他虚拟存储器来实现程序灵活性。
[0343] 3.44.TICCTM、π微积分、施动者和CSP
[0344] TIP执行使得要执行并行线程和协议,并且使得蜂窝彼此交互。蜂窝之间的交互类似于π微积分中和施动者中代理之间的交互。通过使用施动者和π微积分代理,并行线程执行是严格的蜂窝的私有操作。然而,存在若干个显著的不同。
[0345] TICCTM和施动者:在施动者系统,通信协议调用OS方法以及施动者外部的其他处理。异步通信需要使用串行缓存。需要序列缓冲器来解决缓存竞争。不能预测由一个施动者发出的消息何时将到达接受方施动者。通信不是顺序保留:消息不能以发送的顺序到达目的地。
[0346] 在TICCTM中,不像施动者系统,通信是面向连接的。仅当已经建立了两个蜂窝之间的路径时,才能在这两个蜂窝之间发生通信。蜂窝执行协议以交换消息。该给定的边界中TM可以精确地预测消息发送和传递时间。在TICC 中协议执行和并行线程执行之间的唯一不同在于协议不包含声明。由此,它们不能在执行过程中创建/破坏数据容器(在部分5中介绍的保持数据的存储器单元)。除了传送消息之外,协议也转送对传递的消息的访问权限。协议定义蜂窝执行的计算的限制的形式。这消除了计算和通信之间的经典二分法。由TM
此得到名称“用于集成的计算和通信的技术”(TICC )。
[0347] 还不像施动者系统,TICCTM支持组对组通信,自动同步和调整以及动态SMS(自我TM监控系统)。TICC 通过使用并行缓冲机制消除了在异步通信中序列缓存的需要。不能象TM
TICC -Ppde中的SMS那样定义施动者系统中的SMS。对于事务的支持不是施动者系统固有的。
[0348] TICCTM和π微积分:如在TICCTM中,在π微积分中的通信是面向连接的。通过已经建立的链接在π微积分代理之间交换名称,并且可以动态地建立链接。在事务的中间可以动态地改变路径传送信号和至它的目的地功能端口的路径连接。π微积分不使用事务的TM概念。对TICC 中的路径连接的动态改变和对π微积分中的链接连接的动态改变看起来要实现不同的计算目标。路径可以分支并且进行对若干不同端口的相同信号的时间同步的传递,每个端口属于不同蜂窝,如图3、4和20所示。不像π微积分链接,路径具有包括端TM
口、协议、虚拟存储器、代理、分支和h分支的结构。此外,不像π微积分代理,在TICC 中蜂窝之间的交互是精确定时的。
[0349] 重要的不同之处如下:如前所述,路径协议将通信定义为通过交互ndFSM执行并且由送出消息的蜂窝执行的图灵计算[Turing,20]。π微积分没有对于它的链接指定通信机制。实际上,不能指定使用π微积分形式所需的通信机制。在这种情况下,π微积分不能指定所有并行计算。仅当通信被假设为给定原语时,它指定并行计算。π微积分不具有同步和调整机制。不可能定义π微积分中的SMS。
[0350] TICCTM和CSP:我们已经提到了不同之处。我们将再次陈述。没有并行线程(对应于CSP中的序列处理)将包含通信语句。通信原语不能被编码到序列处理(并行线程)。仅TIP包含通信语句。TIP将通信与交互序列处理(并行线程)隔离。不像CSP通道,路径不能阻碍交互并行线程。也不像CSP通道,路径支持点对点和组对组异步通信。不可能定义CSP中的SMS。
[0351] 并行线程的成对独立:没有在一个蜂窝子分类中定义的并行线程可以调用并且执行在另一个子分类中定义的另一个并行线程,除非该子分类实例附带于蜂窝或与蜂窝调谐。然而,并行方式运行的两个蜂窝执行相同的并行线程的副本,每个副本处于它自己的不同的执行环境中。由一个蜂窝指定的并行线程不能改变另一个蜂窝的状态。由不同蜂窝指定的并行线程的对保持彼此相互独立。然而,存在一种例外。当端口组中的端口的父蜂窝联合发出业务请求消息,或者联合处理接收到的业务请求消息时,发生该例外。在这种情况下,需要端口组中的端口的父蜂窝调整它们的计算。它们使用由保持消息的虚拟存储器提供的公共的便签式存储器来进行这样的操作。由端口组中的端口的父蜂窝执行的并行线程彼此依赖。它们必须被联合验证。这使得独立地和分离地验证绝大多数并行线程称为可能。
[0352] 4.关于TIP和TICCTM-Ppde的更多情况
[0353] 4.1生成(spawning)新的计算
[0354] 通常蜂窝C在它的一个功能端口C.f处的业务请求不能由它自己计算对接收的业务请求的响应。在这种情况下,C可能必须在一个或多个其他蜂窝中生成新的计算,从而计算响应。具有下面的格式的TIP被用于这个目的:
[0355] C.f:mR?(){C.f:r(C.g);C.f:spwn?(){C.g:s();C.f:suspend();}
[0356] else{C.f:s();}} (4.1)
[0357] C.f:suspend()被定义为
[0358] {(t0)}[ ● → C.f:suspend()(t0)]{(t1)} (4.2)
[0359] 其中,φ是空符号。这防止C在它的随后的轮询周期中在端口C.f感应到传递信号。我们看到这用于不同的上下文,在部分2.2中的谈话和期望例子中。在(4.1)中,并行线程C.f:r(C.g)≡C.f:msg():r(C.f,C.g)被定义在与端口C.f调谐的虚拟存储器中消息的消息子分类中,C.f:spwn?()=C.f.spwn是与C.f相关联的局部布尔变量。在C.f:r(C.g)中设置C.f.spwn的真值。
[0360] TIP(4.1)做下面两件事情之一:在执行并行线程C.f:r(C.g)之后,TIP根据C.f:spwn?()的值通过端口C.g或者端口C.f将消息发送出去。并行线程C.f:r(C.g)或者在C.f的虚拟存储器中写入响应消息并且设置布尔变量C.f.spwn=false,或者在C.g的虚拟存储器中写入新的业务请求并且设置C.f.spwn=true。在这种情况下,C在接收通过C.g发送的业务请求的蜂窝内部生成新的计算,并且暂停在端口C.f的活动。暂停C.f破坏了在C.f的传递信号。由此,轮询在随后的轮询周期中将在C.f失败。在暂停C.f之后,C立即继续至服务它的下一个端口。在C.f的虚拟存储器中保留数据和执行状态。仅当C后来在端口C.g感应到答复消息时,C才继续它在端口C.g的活动。注意在(4.2),在C.f的暂停并没有改变C.f状态。由此,当在端口C.g接收响应并且重新开始计算时,C.f将准备好发送回响应。
[0361] 在(4.1)中具有else子句的条件语句,
[0362] C.f:spwn?(){C.f:s();C.f:suspend();},else{C.f:s();}”,被如下解释[0363] selectOne{C.f:spwn?(){C.g:s();C.f:suspend();}
[0364] C.f:spwn?(){C.f:s();}
[0365] true{}/*在这种情况下C.f.spwn=φ*/},
[0366] 其中,selectOne从上到下扫描它的条件并且选择被评估为真的一个条件。存在无条件的退出子句,在selectOne中的最后一个。由此,如果C.f.spwn=φ,则不发出消息。当蜂窝不满足发送消息所需的条件则发生这种情况。这种情况下,如果要使用在端口C.f接收的消息重新开始计算,则设置C.f.spwn=φ的并行线程将复位C.f.input=s,或者如果要使用在端口C.g接收的消息重新开始计算,则设置C.g.input=s。这将使得C在随后的轮询周期中在C.f或C.g感应消息,并且在蜂窝满足要求的条件时通过C.f或C.g发送消息(见部分4.1.1)。
[0367] 当在随后的轮询周期中在端口C.f感应到消息接收者时,C执行具有与(4.1)中TIP相似主体的TIP,不同之处在于使用在C.g接收的消息现在执行C.g:r(C.f)而不是C.f:r(C.g),并且TIP重复相同模式的消息传输。
[0368] C.g:mR?(){C.g:r(C.f);C.g:spwn?(){C.g:s();C.f:suspend();}
[0369] else {C.f:s();}} (4.3)
[0370] 由此在经过端口C.f发送回响应并且完成事务之前,按照需要重复生成多次。在每个这样的计算中,事务的完成是强制的。这里,C.g:r(C.g)=C.f:msg():r(C.g,C.f)被定义在端口C.f处接收的消息的子分类中,并且C.g:r(C.f)=C.f:msg():r(C.f,C.g)被定义在端口C.g接收的消息的子分类中。
[0371] 对于每个功能端口C.f,通过其可以生成新的计算的总端口C.g是唯一的。没有C的其他功能端口可以使用c.g。这是用于防止否则会发生的可能的死锁。可以知道,任何时间C经过C.f送出业务请求,端口C.g将准备好发送该消息。
[0372] C.g对其发送它的业务请求的蜂窝可以本身类似地生成新的计算。此外,C.g可以将它的业务请求广播给功能端口组。这可以使得计算在网络上传播。对其发送业务请求的每个蜂窝被强制进行响应并且将总是这么做。最终所有生成的事务终止并且由C.g接收响应消息。然后在C.g的响应消息将由C使用来对它在C.f接收的业务请求做出响应(或者可以再次生成)。
[0373] 4.1.1具有替代物的ALLEOP和迹线
[0374] 我们下面证明由于在由TIP(4.1)和(4.3)指定的生成计算中由选择点引起的分支,在ALLEOP和迹线中替代物的发生。假设在(4.1)中TIP中的端口C.f在T(B.g,1)的时间点从端口B.g接收它的消息,并且在TIP(401)中的端口C.g与端口D.f通信。用于TIP(4.1)的ALLEOP具有以下形式
[0375]
[0376]
[0377] 在(4.4)中,ALLEOP指定在括号‘(…|…|…)’之间包括的替代物,由‘|’隔离。在(4.1)中的并行线程C.f:r(C.g)也将具有由下面的(4.5)中所示的选择点指定的替代物。在(4.5)中的C.f.M是与C.f调谐的虚拟存储器;类似于用于C.g.M。
[0378]
[0379] 注意,当在(4.5)中将C.f.spwn设置为φ时,C.f.input被复位为s,使得C可以在它的下一个轮询周期中再次感应在端口C.f接收的消息。这是防止,通过执行(4.1)中所示的C.f.suspend(),在端口C.f在前一个业务尝试中C.f.input已经被设置为φ。并行线程C.g:r(C.f)=C.g:msg():r(C.f,C.g)具有类似的结构,不同之处在于C.f和C.g扮演的角色互换了。
[0380]
[0381] 用于(4.5)的ALLEOP具有下面所述的结构,具有可替代规范:
[0382]
[0383]
[0384] 用于(4.6)的ALLEOP于此类似。
[0385] 4.2端口矢量
[0386] 当使用端口矢量时发生分支和接合。端口矢量p=[p1,p2,…,pn]是端口的矢量,所有相同种类的、所有附接于相同的蜂窝的端口。在与这个端口矢量相关联的TIP中,在矢量中的端口的父蜂窝将使用具有该形式的保护间隔,p:mR?()(或者p:pR?())来检查消息(或者检查端口准备就绪),其中
[0387] p:mR?()=[p1:mR?()&p2:mR?()&…&pn:mR?()]以及 (4.8)
[0388] p:pR?()=[p1:pR?()&p2:pR?()&…&pn:pR?()] (4.9)
[0389] 由此,仅当在矢量的所有端口具有传递给它们的信号(或者所有信号已经准备好)时,蜂窝才开始在它的端口矢量响应于信号。如果对于端口矢量中的所有端口保护间隔不是真,则跳过端口矢量并且父蜂窝开始轮询它的下一个端口。在图1和2中,当在总端口g执行g:mR?()测试时,输入信号s=g.input被复位为φ。对于属于端口矢量g的总端口gi将不发生输入信号的复位。这是因为在对于g中的所有端口成功之前在连续的轮询周期中必须重复g:mR?()测试。通过写入p:mR?()*(或者p:pR?()*)指定同步的保护间隔,这里重复地评估保护间隔直到它变成真。这里的TIP具有一种以下格式:
[0390]
[0391] 在(4.11)中,在g中的端口不具有向其传递的消息。在(4.12)中,在g中的端口具有向其传递的消息。这种情况下,当经过f发送回答复时,对于g中的每个gi设置g.input=φ将表示已经听到并使用通过gi接收的消息。在(4.12)中的C:suspend(g)执行这个任务。在(4.10)、(4.11)中的C:r(f),C:r1(g,f)以及(4.12)中的C:suspend(g)这里被定义在端口矢量中的端口的公共父蜂窝中。端口矢量C.g被保留用于C.f的排他使用。应该被注意到,当C发出消息时,在C.g中的所有端口总是准备好发出消息。蜂窝可以根据在C:r(g,f)(或C:r(f)中的计算仅使用来自C.f的子集的消息。类似地,可以发出消息,该消息仅通过C.g中的端口的子集生成计算。在这种情况下,C将记住发出消息的总端口,使得稍后可以仅在这些端口侦听响应。但是它总是响应于f中的每个端口。
[0392] 在保护间隔表达式中不允许分离,除了在部分4.4中描述的非确定保护间隔的上下文中。我们看到了在部分2.2中使用非确定保护间隔的例子。然而,对接收的消息的分离性的响应可能依赖于C:r(g,f)(或C:r(f))如何使用在C.f的端口接收的消息。由此,当在端口矢量的一个端口处感应到消息时,可能根据消息的本质,忽略在相同的矢量的另一个端口处接收的消息。指定具有分离的保护间隔以及端口矢量方法之间的本质区别在于在后一种情况,仅在端口矢量中的所有端口已经接收到消息并且准备好发送响应之后发生响应,并且将用于分离的使用的预期的计算偶然性编码到并行线程。总是通过端口矢量中的每个功能端口发送回答复。即使没有处理该消息,也将发送用于消息接收者的确认。由此将总是完成事务。
[0393] 这个约定的结果是引入蜂窝的端口矢量中的端口之间的某种交互模式,类似于例如在一个端口的消息禁止在另一个端口响应,必须改变已经被编码的并行线程,该并行线程由蜂窝使用来响应于通过端口矢量接收的消息。我们倾向于这个选项,因为避免分离简化了实施的分析。
[0394] 4.3周期同步
[0395] 在网络中的两个端口被称为周期同步,如果仅在它们服务了它们的第n-1个输入消息(发出它们的第n-1个输出消息)之后它们均服务它们的第n个输入消息(发出它们的第n个输出信息)。在网络中不同端口的集合的周期同步强制执行以预定顺序在这些端口发生动作。由此,端口的周期同步调整在这些端口的动作。
[0396] 4.3.1同步和调整的类型
[0397] 周期同步:如前所述,在(4.11)和(4.12)中,功能端口矢量f的父蜂窝可能仅通过在它的相关在端口矢量g的该端口的子集生成业务请求。然而,总是通过f的所有功能端口发送答复消息。由此,当f中的端口是周期同步的,那么在g中的端口不是周期同步的。
[0398] 这是在组对组通知中发生的双重(部分2.2和7),其中在总端口组G中的端口总是周期同步的并且在功能端口组F中的端口不是。这是因为,由G中的端口发送的联合业务请求消息可能仅被传递给F中的功能端口的子集。对其传递给联合业务请求消息的功能端口的特
定子集可以依赖于被发送的并且处于安全规范中的消息(见部分2.2和部分7中的例子)。将消息传递信号广播给功能端口F的代理追踪对其传递了消息的功能端口,并且将仅从这些功能端口期望响应。
[0399] 同步接合和分支:在组对组通信中,引起分支和接合的消息的分派和传递将分别由组对组路径中的代理来调整和同步,如部分1.3.2和8中描述的那样。在蜂窝组中的不同蜂窝将在不同时间对同步传递的消息开始响应,因为开始响应计算的时间不是同步的。然而,由于通信是同步是,我们参考这些作为同步接合和分支。
[0400] 异步接合和分支:由功能端口矢量f中的端口接收的消息构成了接合操作,并且通过总端口矢量g发出的消息构成了分支操作。这些消息可以在不同时间到达(离开)并且来自不同蜂窝或去往不同蜂窝。因为这里的通信是异步的,我们将其参考为异步接合和分支。然而,请注意总是同步开始在异步接合中接收的消息的响应计算。这里,通过端口矢量的消息接收父蜂窝来完成同步。
[0401] 在部分6.6(图17和18)中,介绍了生成的组合、端口组和端口矢量组织,其中由TMTICC 网中的不同蜂窝的不同端口的任何给定集合接收的异步消息可以是周期同步的,以强制执行以给定顺序发生响应计算,或者强制执行在端口的消息接收父蜂窝中同步开始响应计算,而不用必须改变在已经实现的应用中的任何并行线程。我们参考这些作为特别调整和同步。
[0402] 如前所述,TICCTM-Ppde计算不需要监视器或旗语或会合技术[10,12,23,24]来调整和同步并行计算中的动作。我们看到在部分2中不使用监视器和旗语的同步和调整的两个例子,并且将在部分6中看到更多例子。在此描述的所有同步和调整特征是对于TMTICC -Ppde唯一的。
[0403] 4.4非确定保护间隔
[0404] 非确定保护间隔从指定集合中选择一个替代物。TIP具有以下格式,
[0405]
[0406] 这里p代表f|g。在保护间隔中的替代物的从左到右扫描中选择具有传递信号的第一端口。如果替代包括功能端口,这些情况必须是相互排他的。否则,可能不对在功能端口接收的消息进行响应。如前所述,这是不允许的。
[0407] 在TIP(4.14)中,让我们假设C.pi(其为保护间隔中的一个替代端口)从B.qi接收它的输入消息。(4.14)的ALLEOP然后具有以下格式,具有替代的活动因果链:
[0408]
[0409] 也可以具有同步保护间隔,在这种情况下,重复保护间隔的扫描直到发现具有传递消息的端口。这
可能获得成功,因为与蜂窝操作并行地将消息传递给蜂窝的端口。在部分6.1中在Ornamental-Garden解决方案、OG解决方案中使用这种类型的同步保护间隔。其他存在的保护间隔具有以下形式
[0410]
[0411]
[0412] 仅包含总端口。在这种情况下,不同的情况不需要相互排他,因为不需要对传递给总端口的消息做出响应。ALLEOP与(4.15)是类似的。在部分6.3中,这种保护间隔用在生产者/消费者方案、PC方案中。
[0413] 4.5端口依赖性
[0414] 每个蜂窝具有它自己的内部存储器。它使用这个存储器来执行在蜂窝中定义的并行线程并且存储它的本地状态。对于每个端口,蜂窝C的C.f,当C执行TIP主体c.f:tip()时,它执行的并行线程可以计算函数,
[0415] ξf(mn,SC[f,n-1])=(mn’,SC[f,n]) (4.17)
[0416] 其中,mn是由端口C.f接收的第n个消息,驻留在C.f的虚拟存储器中;SC[f,n-1]是在C.f执行第n-1个消息的结束时与它的端口f相关的C的状态,mn’
是经过端口C.f发送的第n个响应消息,并且SC[f,n]是在执行后C.f的状态。我
们将使用Pp来表示关于端口p定义的判定,使用PC来表示关于蜂窝C定义的判定:
将 包 含 在
(Pf∪PC)中真的判定。在蜂窝和端口的本地存储器中保持与这些判定相关联的值。在(4.17)中,C.p:tip()可以仅改变在(Pf∪PC)中判定的值。
[0417] 计算格式(4.17)的函数的每个端口是蜂窝C的独立端口,如果具有附带条件ξfTM的 不能改变在PC中的判定。在TICC -Ppde中的蜂窝可以具有多于一个这样
的独立端口。如果C.f是C的一个独立端口,则可以与连接至C.f的路径一起将C.f移动到新的相同的蜂窝C’,其中C’.f接收与C.f接收的消息相同的消息,并且C’.f具有与C.f相同的功能。在这种情况下,依赖于C.f的所有端口(见下面的(4.18))应该被移动到C’。
可以将多个独立的端口分配到蜂窝C以保持被分配给C的CPU不是空闲的。中断端口总是独立的端口,但是它们不能被移动到另一个蜂窝,因为基于通过中断端口接收的消息,在蜂窝中的计算被开始/停止、暂停/重新开始,或者在蜂窝中的端口的顺序改变。
[0418] 对于端口C.f1,由C.f1:tip()计算的函数可以具有格式,
[0419] ξf1(mn,SC[f1,n-1],SC[f2,n-1])=(mn’,SC[f1,n]) (4.18)[0420] 其中,SC[f2,n-1]是在相同的蜂窝的另一个端口C.f2的状态。在这种情况下,端口f1被称为依赖于端口f2。ξf1可以使用Pf2中的判定但是不能对其进行任何改变。这种端口依赖性由处于C.f2的TIP强制执行,具有下面的嵌套格式:
[0421] C.f2:mR?(){C.f2:r().s();C.f1:mR?()*{C.f1:r(C.f2).s()}} (4.19)[0422] 这里,在响应于f2的消息之后,蜂窝在f1等待以接收那里的消息并对其做出响应。在TIP中可以具有任意数目的这样的嵌套。f1和f2彼此独立是可能的。在这种情况下,TIP具有格式,
[0423] C.f2:mR?(){C.f2:r(C.f1)s();C.f1:mR?()*{C.f1:r(C.f2).s()}} (4.20)[0424] 这里,f2使用f1和f2的初始状态首先对它的消息做出响应,并且然后f1跟着这样做。下一次f2使用f1和f2的更新的状态对它的消息做出响应,并且这个交互周期继续。清楚地,在(4.19)和(4.20)中的f1和f2是周期同步的。这种情况下,仅在C.f2:tip()中执行C.f1:tip()。
[0425]
[0426] 图8:移动依赖的端口
[0427] 在图8中,在标记“原始”的蜂窝中,如在(4.18)中,C.f1依赖于C.f2。在“修改”的版本中,在C.f1的路径已经被移动到另一个蜂窝C’的端口C’.f1,其包含端口矢量f=[C’.f1,C’.f2]。原始端口C.f1被转换为总端口C.f,并且在C.g和C’.f2之间建立路径。在C.f2的下面的TIP和矢量[C’f1,C’.f2]可以被用于说明C.f1和C.f2之间的依赖性:
[0428] (C.f2:mR?()&C.g:pR?()){C.f2:r(C.g).s();C.g:s();} (4.21)[0429] (C,.f1:mR?()&C’.f2:mR?()){C’.f1:r(C’.f2).s();C’.f2:s();} (4.22)[0430] 这里,C.f2在C.g.M中写入消息并且将其发送出去到C’.f2。清楚地,C.f2和[C’.f1,C’.f2]是周期同步的。它不分离相互依赖的端口。
[0431] 在这种方式将独立和依赖的端口移动到新的蜂窝的可能性引起了规范的网络的概念,其中每个蜂窝仅包含一个独立的功能端口或功能端口矢量,并且所有其他功能端口依赖于它。
[0432] 由C.f:tip()计算的函数可以具有格式
[0433] ξf(mn,SC[n-1],Sf[n-1]))=(mn’,(SC’[n],Sf[n])) (4.23)[0434] 其中SC是蜂窝C的状态并且Sf是端口C.f的状态。这里,共享共同父蜂窝的状态的C的所有端口应该彼此依赖,但是它们将不是周期同步的。如前所述,C.f:tip()可能仅改变(PC∪Pf)中的判定。在部分6中的哲学家就餐解决方案中,管家的所有功能端口依赖于管家的状态。在这种情况下,由蜂窝产生的消息的输出依赖于处理输入消息的顺序。因为在蜂窝的任何一个轮询周期中,并不是所有它的端口具有传递给端口的消息,并且TM消息感应不是与消息传递同步的,这是在TICC -Ppde中非确定性的源。如前所述,这对于TM
TICC -Ppde中的并行计算是固有的。
[0435] 蜂窝的功能端口f和总端口g可以彼此相互依赖,如在生成TIP(4.2)和(4.3)中。这里,端口f导致依赖性,因为g可以具有进在在生成了计算之后被传递给它的消息,它可以仅在f:tip()中这么做。蜂窝可以使用专门用于它的功能端口之一的总端口来从数据库或从因特网获得数据。蜂窝还可以使用不是专门用于任何功能端口的它的总端口来收集数据以备后用,如在部分6.3中的生产/消费者例子中。
[0436] 在部分1和4中介绍的TIP格式仅是在TICCTM-Ppde中使用的TIP格式。TIP可以具有在它的主体中嵌入的其他TIP,并且每个TIP发送出零或更多消息。让我们参考,在蜂窝的端口处的由蜂窝在轮询周期中轮询的TIP是外部TIP。在任何给定时间,在所有情况下,每个蜂窝与所有它嵌入的TIP(内部TIP)一起仅执行一个外部TIP。蜂窝仅在完成当前外部TIP之后,或者在执行当前外部TIP的编程暂停之后,执行它的下一个外部TIP。外部TIP执行是相互排他的,每个端口矢量C.p具有一个共同的对于矢量中所有端口定义的TIPC:tip(p),以及对于所有端口定义的共同状态SC[p,n]。C:tip(p)可以根据它的功能性改变Pp或Pp∪PC中的任何判定。
[0437] 在所有情况下,正在网络中由蜂窝并行同步执行的TIP的数目以及并行同时交换的消息的数目可以仅与在网络中激活的蜂窝的数目一样多。
[0438] 4.6系统构造
[0439]
[0440] 图9:传统和TICCTM系统构造
[0441] 对比在TICCTM-Ppde中的系统组织和传统系统组织是有益的。图9A示出在粗粒度的并行编程中用于并发/并行线程/处理执行的传统构造。由MPI[25,26],PVM[27]提供的库和由Ethernet[22]或Myrinet[28]提供的网络可以用于通信。施动者系统假设这个构造。对于这些系统中的调度、通信、同步、调整和处理以及线性管理存在显著开销,存在效率的损失。TICCTM-Ppde不在调度、调整、同步和并行线程管理上浪费时间。
[0442] 实时性能:仅存在TICCTM-Ppde中任何蜂窝执行的三种操作:(i)轮询和排序端口(ii)并行线程执行,以及(iii)协议执行。使用2千兆赫兹的计算机仅,花费大约15-30TM纳秒来轮询和排序TICC -Ppde中的端口。消息交换是自我调度、自我调整和自我同步的。
并行线程和蜂窝激活是自我调度的,当感应了传递的消息或者当以按排序的端口列表(见(2.1))中指定的顺序执行p:tip()时,它们是自动激活的。如图9B所示,不需要操作系统来执行这些操作。只要消息准备好被发送就发送所有的消息。每个蜂窝可以在它准备好的任何时候与每个其他蜂窝并行发送消息。
[0443] 我们调用这个实时性能,因为所有可用的实时被用于执行与应用相关的计算,并且时间没有浪费在调度、调整和同步会话或任何其他种类的开销上。没有使用过序列缓存。虚拟存储器组织最小化在共享存储器操作中的存储器干扰。这允许在TICCTM-Ppde中的并行程序的有效执行。图9A示出的传统组织不提供这种实时性能。
[0444] 预测性:例如多指令流执行[29],预测未来调度[30],流水线处理[31]和缓冲的执行[32]的建立的增速技术不能预测线程激活和执行时间,以及消息分派和传递时间[Lee et al,33-36]。在TICCTM-Ppde中不需要这些技术,从而获得高的吞吐量。在TICCTM-Ppde中,我们具有可预测的消息交换反应时间以及并行线程执行时间。并行线程激活时间在有界限的时间限制内是可预测的。在计算的基于事件的TICCTM-Ppde模型中建立定时。
[0445] 同步和调整:TICCTM-Ppde提供用于在应用中的事件的调整和时间同步的新的方法,而不使用监视器、旗语或会合技术[Hoare,10,12][Dijkshtra,23,24]。这些在部分2和6的例子中示出并且在部分6.6中讨论。
[0446] 基于事件的模型:我们将在部分6、7中看到,TICCTM-Ppde最重要的特征是它从实施规范中自动地生成基于事件的计算的模型,并且这些模型用于通过符号的评估的静态验证系统,并且还用于动态自我监控系统(SMS)。这些特征对于TICCTM-Ppde是唯一的。基于事件的语义使得通过精确的定时操作,TICCTM-Ppde很好地适于建立实时计算机物理系统以及使用多核芯片的
嵌入式系统,如果不需要高速缓冲存储器。高速缓冲存储器的消除和使用加速技术的需要的消除简化了多核芯片中CPU的设计。
[0447] 在我们处理示出了用于构造ALLEOP证明的方法的例子之前,有必要定义在TICCTM中计算和通信的本质、事件和因果关系、OO组织和符号。这将是我们下一个部分要做的。
[0448] 5.名称、世界(world)状态、评估器和事件
[0449] 5.1 OO结构
[0450] 我们以名称的有限集合开始。名称可以是在有限字母表中符号的串联。让指的是这个名称的集合。在中每个名称表示唯一的事情。由名称表示的项目被称为容器和对象。这里存在三个集合:,和。我们使用元符号x,y来指代在中的名称。我们使用元符号Δx,Δy等来指代由x,y等表示的容器。在这种情况下,我们写入x.denotes=Δx和Δx.denotedBy=x,并且x∈。我们使用元符号b,c等来特别指代,δb,δc等来指代由b,c等表示的对象。我们写入b.denotes=δb=b.value,和δb.denotedBy={b}=δb.valueOf;这里使用‘{b}’,因为总的来说应该存在多于一个名称来表示相同的对象。∩=φ和∩=φ,(∪)=。由多对一映射来定义表示:→∪。δx≡x是可能的,对象名称的值可以与名称本身一致。由此,(∪∩)={b|b.value=b}。
[0451] 当若干个容器名称表示相同的容器Δx时,我们将设置这些名称中的一个(即,名称z)作为那个容器的区别的容器名称,并且设置Δx.denotedBy=z。当若干个对象名称表示相同的对象,δb,那么设置δb.denoteBy=δb.valueOf={c|c.value=δb}。我们定义下面的用于名称的判定,其与x∈相同。
其与x∈相同。我们使用三个
区别的对象,分别称为具有真、假和φ的属性,δtrue=true,δfalse=false和δφ=φ;φ是空对象。这些被称为常数,因为这些对象名称的值从不改变。对于任何名称x, 和
[0452] 当且仅当两个名称彼此相同时我们断言(x≡y),如果(Δx≡Δy)或(δx≡δy)我们断言 即,x.denotes≡y.denotes。可以读取 作为‘x全等于
y’。当且仅当 两个名称x和y是不同的。对于两个名称的集合,S1和S2,
S1∩S2和S1∪S2被类似
地定义。注意这里合适的关系的使用。
[0453] 每个容器具有它可以包含对象或另一个容器的属性。我们写入Δx.contains=δb或Δx.contains=Δy, 对象不能包含任何事情:我们说如果Δy.contains=δx那么对象δx驻留在Δy,并且写入δx.residesIn=Δy。每个对象必须驻留在某个容器;不存在自由漂浮的对象。彼此相同但是驻留在不同容器内的两个对象被称为彼此的副本。
[0454] 对 于 z ∈ ( ∪ ∪ ),我 们 定 义 方 法z:eval():z:eval() = [(z ∈ ) ? (){z}|z ∈ ? (){z.contains:eval()}|
[0455] z:object?(){δz}|z:container?(){Δz:eval()}] (5.1)
[0456] 相等性:名称、对象和容器的相等性定义如下:
[0457] 和
[0458]
[0459] 相等性的这个定义可以扩展到定义对于集合X的的(x∈X),,并且对于集合X和Y的X=Y, 以及 注意,((x=y)&(x:eval()=φ))是可能的。然而,具有空值的名称不能彼此相等,除非它们彼此完全一致。 但
是相反不是真的,因为不同的名称可以评估相同δb的副本。
[0460] 可以将Δx考虑为存储器蜂窝并且将容器名称x考虑为这些存储器蜂窝的指针(地址)。可以将每个δb考虑为表示对象b的编码(比特串),并且驻留在存储器蜂窝中。仅当对象驻留在存储器蜂窝的编码由该指针指出时,该指针指出对象。在容器(存储器蜂窝)中的对象可以不被修改而不必须改变存在于其他存储器蜂窝中的这些对象的副本。我们将术语“denotes”,“valueOf”和“contains”指代为属性,术语“object?()”,“constant?()”和“container?()”指代为判定,以及“eval()”指代为方法。当我们遇到时,在我们下面的讨论中,我们将引入为名称定义的更多的属性、判定和方法。
[0461] 排序:对于具有排序关系的 <定义在它们的要素上,并且名称x和y,
[0462]
[0463] φ∈S是可能的。通常的定义应用于(x≤y),(x>y)和(x≥y)。
[0464] 结构:如果b具有索引的结构并且对于名称x,x:eval()=δb那么对于在b的索引范围内的i,x[i]=δb[i]=b[i],否则x[i]=φ。然而,x[i]=φ并不暗示i处于b的索引范围之外,因为b[i]的值是φ是可能的。x[i]本身具有索引的结构x[i][j]。如果b是具有对其定义的属性atbt的结构如果没有定义b.atbt,那么x.atbt=b.atbt=δb.atbt,并且x.atbt=φ。b.atbt本身具有属性atbt1是可能的。那么,x.atbt.atbt1=b.atbt.atbt1=δb.atbt.atbt1。
[0465] 名称的分组:每个名称x具有为其定义的方法x:names(),x:names()是与x相关的所有名称的集合。它将包含x,对于x定义的所有属性、判定和方
法x.attributes,x:predicate?()和 x:method(),并 且可 以 另外 还 包括 其 他名称。因为 它绝不会是空的。对于两个不同的名称x和y,
x:names()∩y:names()≠φ;φ:names()={φ}是可能的。对于任何x,x:names()的闭合,被写为[x:names()],是
[0466]
[0467] 名称的分类:名称具有与其相关的类型,例如整数、数值、字符串、集合、结构、分类等。是所有类型名称的集合。方法x:type()被用于指代名称x的类 型:x:type() = Δx:type() = x:eval():type(),以 及 b:type() = δb:type();
φ:type()=φ。每个类型表示在中的名称的子集:
清 楚 地,type:type() = Δtype:type() =
Δtype.contains:type()=set。Type1是type2的子类型,当且仅当
由 此, 成 立。 如 果
(type1∩type2)=φ,Type1和type2是不同的。哪个也不是另一个的子类型的两个类型应该是不同的。我们使用在类型/子类型层级、概要类型等中用于传承的通用约定。与系统S相关联的OO结构如下描述。
[0468] 系统S的OO结构:让WS(t)是在时间t的系统S的世界状态。
[0469]
[0470]
[0471] 我们仅使用离散时间:每个时间点t是正整数。如果(t1<t2),那么WS(t1)是WS(t2)的紧前项,当且仅当不存在其他时间点t’使得WS(t’)存在并且(t1<t’<t2)。我们使用x(t)来断言(x,Δx)∈WS(t)以及 由此,x总是容器名称。x:eval()=φ是可能的。我们说如果评估器(子部分5.3)从世界状态WS(t)访问三元(x,Δx,x:eval()),则访问判定x(t)为真。其他事件判定是(x=y)(t),这断言在WS(t)中(x=y)是真,并且类似地(x<y)(t),(x>y)(t),(x≤y)(t)和(x≥y)(t)。
判定相关的集合被使用:(x ∈Y)(t), 等。当且仅当(t1<t2)时,判定具有排
序:x(t1)<y(t2)。注意,(x<y)(t)与x(t1)<y(t2)不相同;((x<y)(t1)<(y<z)(t2))是可能的。如果它不是重要的,时间参数可以被忽略。
[0472] 让S:cells()表示在系统S中所有蜂窝的集合。对于蜂窝C的端口C.f,C.p.a是与C.p调谐的唯一代理;C.p.pathway是连接至C.p的唯一路径,C.p.pathway.vM=M=C.p.vM是C.p.pathway的唯一虚拟存储器M;M.ag[i]是附接于M的第i个代理;M.prts[i]是调谐于M的第i个端口;C.p.ndFsm是C.p中定义的ndFSM。C.p.a.ndFsm是C.p.a中定义的ndFSM。C.vMs={C.p.vM|(C.p attachedTo C)}。如果C.p连接至dm路径,那么C.p.pathway.vMs是在dm路径中的所有虚拟存储器的矢量;C.q.vM∈C.q.pathway.vMs。最终,a.prt[i]是调谐到代理a的第i个端口,并且a.nxt[i]是调谐至代理a的第i个下一代理。矢量,M.ports=∪[M.a[i].ports|0≤i<M.a:size()]。代理、虚拟存储器和端口是路径部件。下面的名称与C.p.pathway相关联:
[0473] C.p.pathway:names()=
[0474] C.p.vM:names()∪∪{C.p.vM.a[i]:names()|0≤i<C.p.vM.a:size()}∪[0475] ∪{C.p.vM.ports[i].ndFsm:names()|0 ≤ i < C.p.vM.ports:size()} (5.6)
[0476] 这里,C.p.vM:names()将包含在C.p.vM中驻留的消息中定义的所有名称。注意,不是所有的C.p:names()均处于C.p.pathway:names()中,仅包括C.p.ndFsm:names()。如同我们在部分6.2中将看到的,每个虚拟存储器具有四个部件。其中两个被称为读存储器和写存储器,包含消息。在任何给定的时间,这两个部件中的每个可以包含至少一条消息。对于附接于蜂窝C的每个端口c.p,
[0477]
[0478]
[0479] 由此,C:names()和C.p:names()不包含在C.p.pathway:names()中的所有名称,它们仅包含C.p.ndFsm:names()。对于任意两个路径和不同的蜂窝C1,C2以及两个端口p和q,下式成立:
[0480] [C1:names()]∩[C2:names()]=φ, (5.9)[0481]
[0482]
[0483] 其中 断言p和q由路径连接。注意在(5.10)中全等关系 的使用。在(5.11)的情况下,路径是不同的。不同的蜂窝和不同的路径绝不共享容器。在系统S中的S:names()中的名称的不变的(即编译时间)OO结构如下定义:
[0484] S:names()=
[0485] ∪{C:names()|C∈S:cells()}∪
[0486] ∪{C.p.pathway:names()|C∈S:cells()&(C.p attachedTo C)} (5.12)[0487] 世 界 状 态 被 划 分 为 C:names() and C.p.pathway:names(),其 仅 在C.p.ndFsm:names()彼此重叠。这个重叠使得能够在连接至路径和附接于蜂窝的端口之间的通信。这个结构的改进有助于方法的定义。在dm路径的情况下,在路径中由ndFsm:names()表示的容器通过信号线彼此连接,并且在虚拟存储器中的容器通过数据线连接。信号和数据通过这些线在容器之间交换,由协议中的CCP调整。
[0488] 5.2条件和CTL语句
[0489] 我们使用术语“保护间隔”来指代用于测试信号的判定和判定表达式,术语“状态”来指代描述端口和代理的状态的判定和判定表达式,并且使用“条件”来指代所有判定和判定表达式。条件是任何很好定义的第一阶表达式,包含具有逻辑连接和量词的判定,或者它是判定的布尔表达式。所有条件以‘?()’结尾。量词的范围是有限集合。条件总是在[x:names()]中由名称定义的世界中评估,其中x是蜂窝、端口、代理、虚拟存储器或消息。
[0490] CTL语句(因果时间逻辑语句)是具有通常句法的相等、排序、访问和事件实例、具有通常的逻辑连接的定义的判定、时间模式操作符□(总是)和◇(最终)以及使用量词和 的因果连接,→,●→(下面描述)的任何组合。否定可以仅出现在单个的判定和事件实例,并且不出现在作为整体的表达式中。否定的事件实例被解释为“事件实例不应该发生”。如下所述,事件实例具有常数的状态:当且仅当两个事件实例完全一致时,它们彼此相等。在 和 中定量的变量的范围是事件实例、虚拟时间点和在CTL语句中出现的其他对象。通常,量词的范围是先验已知有限集合。我们在这里不描述CTL语句的句法。用于描述在前面部分中的ALLEOP和迹线的语句是CTL语句。在后面的部分中出现更多的例子。证明不涉及对CTL语句进行逻辑演绎,仅涉及在给定ECT网络上的CTL语句的符号评估。我们将看到在部分6中的ECT网络的例子。
[0491] 5.3评估器、事件和因果关系
[0492] 存在结构化的常量称为评估器。系统可以具有任意但是有限数目的评估器E[i],其中0≤i<N。在我们的讨论中我们不会需要明确参考评估器。但是这个概念是重要的。在TICC-Ppde中,存在与每个蜂窝相关联的评估器(CPU),并且所有评估器并行操作,仅通过消息交换彼此交互。假设EC是蜂窝C的评估器。通过创建/破坏名称、容器、目标和编码,修改编码,将对象/容器从一个容器移动到另一个容器,将容器从一个名称移动到另一个名称,并且对容器设置访问权限,并且从世界状态访问对象(它们的编码),评估器执行计算。这些是动作和访问事件。由评估器执行的计算由此使得发生访问和动作事件。当评估器EC从WS访问名称x时,它将三元(x,Δx,x:eval())加入到EC.accessedItems列表。
在评估的结束,它可以使用EC.accessedItems中的部件来执行WS的一致更新,并且然后破坏它的私有EC.accessedItems列表。
[0493] 名称x是由评估器在世界状态WS(t)中创建(破坏)的,如果在紧前项WS(t’)中x(t)是真(假)但是x(t’)是假(真)。通常的约定是如果存在t1≤t2,在WS(t2)中判定是真的,使得在WS(t1)中判定是真的,并且不存在t’,t1<t’≤t2,使得在WS(t’)中判定是假的。由此,在世界状态中存在名称直到它们被破坏,并且判定保持它们的真值直到它们被改变。
[0494] 访问权限、数据保护和通信
[0495] 通信和计算之间的唯一差异在于通信协议可以仅创建/修改对象(数据),该对象处于与路径中的端口、代理和虚拟存储器相关联的已经定义的容器中。它们不能创建/破坏容器。这是因为,它们不包含声明。它们任一个都不能修改消息或者虚拟存储器中的其他数据。由此,通信是简单的计算的限制格式,不同之处在于通信除了向评估器传送信号之外还传送访问权限。对于评估器EC,EC.hasAccessTo(t)指定了EC在时间t可以访问的所有名称的集合,EC.hasAccessTo(t)如下定义:
[0496] EC.hasAccessTo(t)=
[0497] EC:names()∪C:names()∪
[0498] ∪{C.p.pathway:names()(t)|(C.q.state=S)(t)} (5.13)
[0499] 这里,C.p.pathway:names()是时间的函数,因为路径的虚拟存储器可以在不同时间包含不同消息并且路径还可以动态地改变。仅当C.p处于状态S时,在C.p.pathway中的名称的访问权限被转移到EC。如图1和2所示,当感应到消息时或者当端口准备好发出TM消息时,端口总是将它的状态改变为S。由此,在TICC 中,当需要时,在正确时间通信自动地将访问权限转移到评估器。当C.p的状态从状态S改变到其他状态时,自动地调用这些访问权限。
[0500] 评估器具有能够评估动作、事件和名称的属性。动作总是方法、协议或条件,或者简单地是编程语言中的语句:声明、分配、条件(例如if-then-else和selectOne)或while-loop。在方法中出现的声明y:A(),在蜂窝、消息、端口、代理或虚拟存储器y中定义,对于声明的名称将三元(x,Δx,x:eval())引入y.A:world()(t)。我们还使用声明来破坏名称或从y.A:world()(t)移除名称。此外,y.A:world()(t)包含y.A:world()(t)也包含用于y:A()的代码并且包含当正在执行y:A()时动态地创建的名称。协议是动作,不同之处在于它们不包含声明但是包含CCP。方法通常不包含CCP。
[0501] 我们使用→a用于访问评估→e用于动作评估,具有下面的符号:
[0502] 访问完成时间t:[<→ax>(t)] 访问开始时间t:[→ax(t)] (5.14)[0503] 评估完成时间t:[<→ex:A()>(t)] 评估开始时间t:[→ex:A()(t)] (5.15)[0504] 评估完成时间t:(t) 评估开始时间t:x:C?()(t1) (5.16)[0505] 将评估器应用至x,动作x:A()或者条件x:C?()可以使得发生新的事件(下面描述),这将反过来引起其他评估和其他事件的发生。基于这个原因,我们将→a和→e称为因果关系。它们是不反射的,不对称的以及及物的。评估器不仅使得事件发生,而且它还可以如下所述评估通信事件。
[0506] 关于时间实例的注意:两个时间实例t1和t2有可能是不可比较的,因为它们是由彼此不同步的不同评估器的本地时钟测量的。但是每个时间时钟具有对于全局时间的唯一的一对一映射。我们使用x.t1,y.t2来指定与两个不同的对象x和y相关联的本地时间点。如果x和y均属于相同的蜂窝,则在x和y的本地时间中保持不相等(x.t1<y.t2)。否则,(x.t1<y.t2)可能仅相对应时间点x.t1和y.t2与指定的全局时钟当前全局时间的映射而成立。若干本地时钟时间点可以映射到相同的全局时间点,由此在不同蜂窝中可以发生若干事件,每个蜂窝处于不同的本地时间但是所有蜂窝处于相同的全局时间。所有时间点是映射到整数≥0的离散时间点。
[0507] 访问评估:如前所述,符号x(t)被用于表示事件,在该事件中评估器从世界WS(t)保持三元(x,Δx,x:eval())。清楚地,仅当评估器具有对x的访问权限时,即,x∈EC.hasAccessTo(t),评估器可以对其访问。当评估器由此访问x时,那么它应该访问括号中的E所有名称[x:names()]。在下文中,我们定义评估器→a和→e。当必要时,我们写入 →aE
和 →e以明确地指代进行评估的评估器。如下定义访问评估:
[0508]
[0509]
[0510] 总是要花费一些时间τ>0来完成访问。如果访问是成功的,那么使得事件x(t+τ)变成真。这里动作不改变世界状态WS,仅E的本地状态改变。一旦在时间(t+τ)访问x,(x,Δx,x:eval())在时间(t+τ)进入E.accessedItems,并且E获得对括号中所有名称的访问权限<[x:names()]>(t+τ)。如果不满足(5.17)中的前提条件,那么访问尝试将返回φ。因为我们使用约定来判定在世界状态总是维持它们的真值,除非改变,它不是必须在(5.17)中指定指定帧语句WS(t)=WS(t+τ)。我们这里假设评估器的本地状态不同于世界状态,由此,在E.accessedItems中出现的三元将绝不会在世界状态中出现,即使如前所述,三元中的要素形成了世界状态中的关系结构。
[0511] 动作评估:如下定义动作评估:对于名称x,
[0512] [E→ex(t)]=[E→ax(t)]=x(t) 并且对于动作或条件x:A(…), (5.18)[0513]
[0514] 这里,x.A:preC?()是用于x:A()的前提条件的一部分;它的其他部分是它必须已经访问了在x.A:world()中的所有需要的名称。类似地,x.A:pstC?()是用于动作的后置条件的一部分。它指定了由x:A()的执行产生的对世界状态WS的改变。后置条件的其他部分是x.A:output?,其是由x:A()产生的输出。它应该是φ。条件x.A:preC?()和在前提条件中的所有指定访问应该是真的,从而x:A()的评估成功。如果评估成功并且在世界状态WS(t+τ)中后置条件保持真则评估是正确的。因为访问事件和条件检查的发生不改变世界,所以可以在前提条件为真的相同世界中执行评估。对于这个动作的评估的上下文是x.A:world()(t)的子集s。E E
[0515] 此后,我们将省略在 →a and →e中的前缀上标E和下标a和e,并且仅写入评估作为→,假设→a被包含在→中。对于常数C,在所有时间(→ec)=(→ac)=(c,Δc,δc);缺省地,特定常数被暗含地假设为总是处于世界状态中。我们下面将没有机会参考访E问评估 →a。
[0516] 并行线程是方法,动作的子集。使用四种编程语句来定义方法:声明、分配、条件(类似于if-then-else和SelectOne)和While-loops。声明创建/破坏容器和对象可以设置新创建的容器的内容,并且使得三元(x,Δx,x:eval())在编译/执行时间被引入到method:world()或从method:world()移除。在方法定义中的其他语句可以使得对象和容器被修改,从一个容器向另一个容器移动内容,或者指示改变的名称。在它的执行过程中,方法仅改变method:world()中的本地状态。在它的执行的结束,评估器可以使用这个本地状态来执行世界状态Ws(t)的一致更新。因为Ws(t)如(5.11)中定义的那样被划分,蜂窝隔离(部分3.2)确保可以由并行操作的蜂窝完成对Ws(t)的多个并行更新,而不存在相互干扰。在方法定义中出现的程序语句的语义可以被容易地定义。我们这里非正式地使用程序语句,假设读者应该知道期望的含义。在图1和2中表示在协议中使用的CCP的特征。对TM于在并行线程和协议中使用的绝大多数语句,TICC -Ppde可以在给定的上下文中自动地生成相关的前提条件和后置条件,但是用户交互可能需要定义特定前提条件和循环不变量。
[0517] 5.4符号和定义:ALLEOP节点的评估
[0518] 我们在部分2中看到了在ALLEOP和迹线中发生的动作和通信事件的例子。在下文中,我们使用符号X,Y,Z,…用于动作事件分类以及符号X[T(…)],Y[T(…)],Z[T(…)],…用于通信事件分类。这些事件分类参考ALLEOP节点。它们是称为事件的顶级分类的子分类。我们使用符号x(t),y(t),z(t),来表示事件实例;X(t)表示在时间t发生的实例X(见图6B)。如果X(t)是通信事件子分类的实例,X[T(
,#)],那么t∈t(,#)。X(.t#)指代在迹线(见例如(2.18)中的迹线)中在虚拟时间点.t#∈T(,#)X[T(,#)]的事件发生。在一轮应用中,通信事件子分类的多个实例X(T[,#)]可以发生在因果网中。在因果网中发生的这些实例的时间点的集合对于该轮应用组成严格增长的时间点t(,#)=.t#的序列(见图6C)。
[0519] 通信事件:我们下面介绍在部分2中使用的‘发送’命令的‘转发’变化。在下文中,p,q=(f|g |i),p≠q。
[0520] pD[T(q,#)]:在T(q,#)中的时间点由端口q将消息传递给端口p。
[0521] pS[T(p,#)]:在时间点T(p,#)由p发送消息。
[0522] pF[T(p,#)]:在时间点T(p,#)由p转发消息。
[0523] 转发传送接收的消息(可以具有一些修改),并且发送传送新创建的消息。我们将S看到在部分6.2中的精确区别。在下面[→p|F(t0)]指代在时间t0在端口p在消息(发S|F S|F
送/转发)处理中p 实例的发生的开始,[<→p >(t1)]指代在时间t1,(t0<t1)事件发生的结束。下面的特征在协议执行和保护间隔评估过程中对通信事件评估保持真。
[0524]
[0525] 上面的语句描述了在协议执行的开始和结束时发生了什么,以及当感应传递信号时发生了什么。行(1)指定在开始时,端口g的父蜂窝将信号c|f发送给端口g,如果g已经准备好发出消息。如行(6)所示,仅当g的状态是S或者它的输入是s时,g准备好。在发送信号之后,端口g的级立刻改变为R并且g.input变成等于c|f。当在状态R中,g不能发出第二个信号。类似地,行(2)描述在协议执行中在消息传递的时间发生了什么:这里,D‘→f(t0)’是在端口f的传递事件。它在时间t0开始并且在当p.input=s的时间结束。
行(3、4、5、6)描述了当以后感应到在端口f或g已经传递的信号时发生了什么。注意,(行
5和6)g.input被复位为φ。由此,仅在端口g可以感应一次传递的信号。如前所述,对于属于总端口矢量的总端口将不再发生g.input=φ的这个复位。在所有情况下,在感应信号之后,端口移动到状态S,由此对端口的父蜂窝给出访问该端口的虚拟存储器中的数据。
一旦端口准备好发出信号,它继续准备好直到信号被发出,如在行(1)和行(3)中定义。
[0526] 存在对于通信事件评估的另一个解释。SMS(部分7)使用事件评估来安装在应用的增长的因果网中ALLEOP节点的实例,同时运行应用。这是由下面的(5.21)和(5.22)定义。图19示出了事件建立者蜂窝eb。当eb将评估器→应用于通信事件时,它在特定的时间点产生事件的实例并且将其安装到因果网。每个通信事件具有与其相关的两个时间点:一个是当事件本身发生的时间(这是重要的),另一个是当在一个中安装实例的时间(这是不重要的)。下面将描述这两个时间点的使用。
[0527] 在下面的(5.21)和(5.22)中,[eb.f1,eb.f2]是在图19中的事件建立者蜂窝eb的端口矢量,并且Ci.gi和Dj .fj是交换消息的端口,0≤i<n and 0≤j<m。
[0528] 蜂窝Ci评估端口Ci.gi的协议以发送消息并将其传递到端口Dj .fj。这个协议执S D行触发对通信事件Ci.gi(ts)和(td)的评估,其中ts是发送开始的时间消息,而td是完成消息传递的时间。如下方式定义对于上述通信事件的评估:
[0529]
[0530] 在协议执行过程中,信号被发送到端口[eb.f1,eb.f2]以指令eb蜂窝创建通信事S D件Ci.gi(ts)和(td)的实例。在部分7中说明了这是如何发生的。在(5.21)中,eb在时间t1完成了对由端口[eb.f1,eb.f2]接收的信号的感应。这还是eb开始评估(Ci.S D S
gi(ts),td))的时间。这导致在时间t2关于因果网中的事件实例(ci.gi(ts),fj>(td))的安装。这里,ts是当与由Ci.gi 发送的信号对应的调整后的信号被代理在路径D
上转发的时间,而td是在Dj.fj 中设置同步传递信号的时间。
[0531]
[0532] (5.22)描述了用于答复消息发送的因果网中安装的事件。我们之后将仅在发生事件的时间点关联通信事件实例,并不示出在因果网中安装实例的时间点。这是与我们将时间点和动作事件实例相关联的方式是一致的。
[0533] 事件分类和事件实例的等同性:
[0534] 和
[0535] 和
[0536] 因此,事件分类和事件实例具有常数的状态;如果它们是相同的,则也是相等的。然而,事件X的评估不同于常数的评估。
[0537] 同时性和并行性:当使用多个评估器时可发生通信事件的并行评价。对于在(5.20)中描述的通信事件评价,如下成立:
[0538]
[0539]
[0540] 在(5.25)中,t1(…)和t2(…)是其中通信事件发生在两个不同的评估器的两个时间地图。评估分别在两个评估器中在本地时间点c1.t1和c2.t1开始并在c1.t2和c2.t2完成,其中c1.t1<c1.t2并且c2.t1<c2.t2。在评估完成的时间点发生通信事件实例X(c1.t2)和Y(c2.t2)。在发生两个评估的过程中,时间间隔[c1.t1,c1.t2)和[c2.t1,c2.t2)还可在全局时间上重叠。通常,由开始两个评估的本地时间点(c1.t1,c2.t1)和终止评估的时间点(c1.t2,c2.t2)构成的一对时间点将是不可比较的;即它们以任何顺序发生。并行评估因此被写作(<→X>(c1.t2)‖<→Y>(c2.t2))。如果两个事件是同步的或被调整的,则在全局时间下T1(…)≡T2(…)并且c1.t2=c2.t2。并行评估因此被写作[→<(X‖Y)>(c1.t2=c2.t2)]。对于动作事件也可发生相似的并行评估。它们的区别仅在于没有时间地图关联于动作事件,而是虚拟时间点关联于动作事件分类和指定发生评估(实例)的时间点,并且给定的动作事件分类可具有严格递增序列的时间点下的多个实例。
[0541] 因果:下面,X和Y是事件子分类。我们以如下方式使用评估器符号→作为以下情况中的因果符号:事件的发生可导致一个或更多的其他事件的发生;如果条件C(X,Y)为C(X,Y)真,则将‘X→Y’读取为‘X导致Y’,而将X →Y读取为‘X导致Y’:
[0542]
[0543]
[0544] X→φ≡STOP(nothing happens) (5.28)
[0545] 其中,τmax(X,Y)是在发生两个事件实例之间的最大可能延迟。
[0546] 中间因果:
[0547]
[0548]
[0549] 在(5.30)的X●→Y中,在X和Y之间没有发生任何事件。因此,评估●→是不可分割的;它是不能被中断的。
[0550] 5.5.因果链和细化
[0551] 因果链:
[0552]
[0553]
[0554] 中间因果链:
[0555]
[0556] 如同在(5.33)中那样,即使省略了□运算符号,应该假设其存在。在语句(5.31)和(5.33)的任一侧上并行线程或协议执行中事件的因果链(或中间因果链)交替分支,这导致不同的终止事件,如在(4.5)、(4.6)、(4.14)和(7.4)中示出。当在协议执行中发生分支时,因果链将会包含最终接合在单个的公共通信事件的并行支路,如在图6的示意图中描绘的。这对于下面介绍的所有细化都适用。应该假设在所有情形下因果链包含可替代的支路和/或分支。
[0557] →的细化:
[0558]
[0559] (X→Y)的细化是中间因果链,e1●→e2●→…●→en,以使得(X→Y)=(X●→e1●→e2●→…●→en●→Y)。如果我们使用εi特指中间因果链εi=
ei1●→ei2●→…●→eik(i),其中0≤i≤n,则对于n≥0,一般情形将是,
[0560] RefinementOf[(X→(Y0|Y1|…|Yn)]=
[0561] [(Xε0Y0)|(Xε1Y1)|…|(Xεn-1Yn)], (5.34a)[0562] RefinementOf[(X→(Y0‖Y1‖…‖Yn)]=
[0563] [(Xε0Y0)‖(Xε1Y1)‖…‖(Xεn-1Yn)], (5.34b)[0564] 其中,εi是中间因果链,其中0≤i≤n,符号‘|’表示替代而符号‘‖’分割并行的因果链。
[0565] 并行线程和协议:协议的终止事件总是由在协议执行过程中交换的信号唯一地确定的。从端口p到端口q传送的信息的细化具有如下的格式(出于简化,在下面所有的语句中都假设线性细化)。S D S D
[0566] p[t1(…)]→q[t2(…)]=p[t1(…)]●→protocol●→q[t2(…)]=S D
[0567] p[t1(…)]●→ec0●→ec1●→…●→eck●→q[t2(…)] (5.35)
[0568] 这是CCP的不可中断的序列和端口p处的协议中的其他动作事件。在感应到被传递的消息之后及在由蜂窝C发出响应消息之前执行的并行线程的细化都具有如下的格式,[0569] C.p:mR?(C.pD[t1(…)])●→pthread●→C.pS[t2(…)]}=
[0570] C.p:mR?(C.pD[t1(…)])●→ep0●→ep1●→…●→epn●→C.pS[t2(…)]} (5.36)
[0571] 这也是动作事件的不可中断的序列。它发生在并行线程执行的过程中。
[0572] C1.p:mR?(C1.pD[t1(…)])●→pthread●→C1.pS[t2(…)]
[0573] ●→protocol●→C2.qD[t3(…)]} (5.37)[0574] 的细化具有如下的格式,C1.p:mR?(C1.pD[t1(…)])●→ep0●→ep1●→…S D●→epn●→C1.p[t2(…)]●→ec0●→ec1●→…●→eck●→C2.q[t3(…)]},并且在ALLEOP中可被写作,
[0575] C1.p:mR?(C1.pD[t1(…)])●→ep0●→ep1●→…●→epn●→
[0576] C1.pS[t2(…)]→(C2.qD[t3(…)‖…)]}, (5.38)[0577] 这是因为在ALLEOP中没有示出协议的细化。
[0578] 同步化:如下发生同步的并行分支。在(5.39)中同时发生通信事件Z1和Z2的实例:
[0579]
[0580] 同步分支的一般化:
[0581] X→(Z1‖Z2‖…‖Zn)[t(…)] (5.40)[0582] 调整:在如下中发生并行调整,
[0583]
[0584] 这里,在不同的不可比较时间发生事件X和Y。相对于本地时间到全局时间的映射来定义max(t1,t2)。仅在X和Y分别完成它们的任务之后发生Z。
[0585] 调整的一般化:这里,如果所有的事件X1,X2,…,Xn都已经发生,则发生事件Z[t(…)]。
[0586] (X1[t1(…)]‖X2[t2(…)]‖…‖Xn[tn(…)])→Z[t(…)] (5.42)[0587] 调整&同步化的一般化:在事件X1,X2,…,Xn都已经发生之后,同时发生所有的事件Z1,Z2,…,Zn。
[0588] (X1[t1(…)]|||X2[t2(…)]‖…‖Xn[tn(…)]) → (Z1‖Z2‖…‖Zn)[t(…)] (5.43)
[0589] 事件替代:(X|Y),X或者Y发生。
[0590] 一般化的替代:(X1|X2|…|Xn) (5.44)[0591] 其中,每个Xi都是因果链。在事件替代表达中的选项应该总是彼此排斥的成对。
[0592] 保护间隔和轮询:在图1和图2中定义了保护间隔而在(2.7)至(2.10)中表现了轮询的例子。如图1和图2所示,信号感应改变了端口的状态。这对于条件评估不改变世TM界的状态的通用规则是个例外。对于TICC -Ppde操作的如下限制也适用于轮询:
[0593]
[0594] 并且对于其他保护间隔也是类似的。因此,没有蜂窝同时开始或结束轮询它端口中的两个端口。在蜂窝中不存在并行性或时间分割并发性。所有的中断都是不违反事务完成的需求的编程的中断。一旦在蜂窝的轮询周期中开始端口的轮询,则在每个端口应该发生如下七个可能的结果中的一个结果:(i)因为不存在消息所以跳过端口;或(ii)蜂窝等待消息并随后在项目(v)和(vi)或(vii)中将它处理;或(iii)在端口矢量的情况下,如果端口矢量中的所有端口处存在消息,则蜂窝执行(v)和(vi)或(vii),否则跳过端口矢量;(iv)在端口替代的情况下,如果在任意的替代端口处存在消息,则蜂窝执行(v)和(vi)或(vii),否则跳过端口替代;(v)如果在端口(或端口矢量)处存在消息,则蜂窝通过将它键入蜂窝的排序端口列表中来调度服务的端口(或端口矢量);或(vi)在感应到消息之后蜂窝立即向端口提供服务;或(vii)在确保的轮询周期中发生服务的编程暂停并继续服务。
[0595] 世界状态的一致性:每个世界状态W(t)都代表时间t的运算的状态。在任何的时间点t,世界状态W(t)都是一致的。证明系统在ECT评估过程中的假定时间点维持及更新世界状态。如果检测到ECT评估(如部分6所描述)过程中在CTL断言和ECT之间存在矛盾,则该断言不是有效的。这样的矛盾表示设计或实施错误。由SMS生成因果网过程中遇到的与ALLEOP的矛盾表示系统操作中的错误。
[0596] 在●→上的条件迁移:我们将格式‘→C?(){X}’称为ALLEOP格式,其中X是通信或动作事件,并将如下格式称为迹线格式。
[0598] {(t1)}’,t1≤t0+τmax
[0599] 后者描述了C?(){X}的语义。在半闭合间隔[t0,t1)中的时间点之间发生执行,而τmax是最大可能延迟。下面假设条件评估不会改变世界,而在与前提条件变为真的时间t0相同的世界中评估动作,而保护间隔不受这个规则的限制。在下面的(5.46)中的上下文x和y是蜂窝C或端口C.p。所有的条件检查和动作评估都发生在单个蜂窝C的上下文中。成立。这个上下文将在其中包括在方法评估过程中由评
估器维持的变量的代码执行堆栈。
[0600]
[0601] 如上所述,如果x:pre-C1?()为假,则不定义动作评估,并且如果C?()为假,则跳过动作评估。当执行由●→链接的两个连续的动作x:A1()和y:A2()时,在终止x:A1()的执行的相同时间开始y:A2()的执行,此外,x:A1()的后置条件逻辑上暗示y:A2()的前提条件。在终止A1的时间和开始A2的时间之间通常存在小的延迟。但是在这个延迟期间,蜂窝C的世界不会改变,这是因为在两个这样的动作之间在蜂窝C中不会发生其他的动作,并且在其他蜂窝中发生的动作不会影响到蜂窝C的状态,这是因为蜂窝隔离(部分3.2)。因此,可忽略这个延迟。
[0602] 在轮询周期中,我们使用如下格式的规范,即(C.f[i]:mR?()→C.f[j]:mR?())其中i≠j。这可以如下方式被解释为(C.f[i]:mR?()●→…●→C.f[j]:mR?()):
[0603]
[0604] 换句话说,在半闭合间隔[t1,t2)和[t3,t4)中发生C.f[i]和C.f[j]的服务,以使得([t1,t2)∩[t3,t4))=φ,具有C.f[j]:mR?()(t2)的限制,即在结束[<●→C.f[i]:tip()>]的时间点t2开始C.f[j]:mR?()的评估。这里,仅当C.f[i]:mR?()(t0)评估为真时发生C.f[i]的服务,否则跳过该端口并且轮询直接地前进至C.f[j]。因此,轮询周期仅指定了轮询的顺序,而没有指定轮询的端口接受服务的顺序。由于在部分2的例子中描述的通信,在不同的蜂窝中彼此跟进地发生TIP的并行触发;这里,唯一的需求在于作为消息被发送时的特征的条件保持不变,直到消息被传递并且被传递的消息被感应及使用。
[0605] 让我们进而考虑描述了简单的ALLEOP证明的例子。在所有的证明中,我们假设所有的并行线程和条件的实施都已经被单独地验证。由于并行线程相互独立,因此这是可能的,依赖的并行线程被联合地验证,并且条件对于蜂窝而言总是本地的。我们从在[Magee & Kramer,13]中介绍的“装饰花园问题”的通用版本开始。对于“相互排斥”和“条件同步化”([Magee & Kramer,13]中使用的术语),对于这个例子展示了正式的ALLEOP证明。该解决方案还适用于[Magee & Kramer,13]中的“停车”问题。
[0606] 6.关于ALLEOP证明的例子
[0607] 6.1装饰花园:相互排斥和条件同步化
[0608] 这里,我们的目标在于显示ECT网络的结构并示出系统如何使用它们来生成证明。见,Maggie & Kramer,[13]中的关于装饰花园的FSP规范。该问题如下:装饰花园公园具有数个门,每个门都具有十字转门。如在Maggie和Kramer中,我们假设在公园的两端具有两个入口门,但是与Maggie和Kramer不同的是,我们还假设两个出口门。当公园开放时门是打开的,而在进入公园的所有人员已经离开之后在公园关闭时门也是关闭的。在公园开放的任何时候,都允许人员通过任意的入口门进入,并通过任意的出口门退出。必须保持关于在任何时间处在花园内的人数的准确计数,并绝不允许该数目超出预设的max。
[0609] 在图10中示出了TICCTM网络。它具有两个入口十字转门,Et[0]和Et[1]和两个出口十字转门,Xt[0]和Xt[1]。存在基于外部中断打开及关闭公园的门的一个环境E。存在一个计数器。当人到达入口或出口十字转门时,我们假设传感器Se[j]和Sx[j]检测在每个十字转门处的人Et[j]和Xt[j],其中j=0,1。每个十字转门和它的传感器一起构成封装的蜂窝。当检测到人时,传感器通过它们各自的总端口Se[j].g或Sx[j].g向端口Et[j].ft或Xt[j].ft发送信号,其中j=0,1。路径 和 对于封装都是内部的。传感器通过这些隐藏的路径向功能端口ft(t代表十字转门)发送信号。
出于方便,我们在图10中示出了十字转门外部的传感器。
[0610]
[0611] 图10:OG解决方案的网络:相互排斥&条件同步
[0612] 当端口Et[j].ft或Xt[j].ft分别检测到由传感器发出的信号时,判定Et[j]:personEntering?()和Xt[j]:personLeaving?()变为真。关于这些判定的定义请见附录I。当传感器检测到人时,对于封装内部地执行如下的TIP:
[0613] Se.g:TIP()=Se[j]:personAtGate?(){Se.g:pR?()*{Se.g:s();}}
[0614] Sx.g:TIP() = Sx[j]:personAtGate ? (){Sx.g:pR ? ()*{Sx.g:s();}} (6.1)
[0615] 计数器具有五个功能端口C.f[j],0≤j<5。如下方式使用它们:对于j=0,1:当在端口Et[j].ft处检测到信号时,十字转门通过路径 向计数器发送信号
(见图10)。当计数器C在C.f[j]感应到信号时,其中0≤j<1,它如下动作:(i)如果counter.count<max并且经由 返回的信号通知Et[j]门处的人可进入,
则C使得计数器增加1;当Et[j].g接收到信号时,十字转门解锁并且在Et[j].ft处的人被允许进入花园;(ii)如果counter.count=max,则C经由 发出通知Et[j]
花园满员的信号;当在Et[j].f处接收到信号时,十字转门显示“公园满员”并且不解锁十字转门。为了作出这两个替代动作中的一个动作,Et[j]执行同步非确定的轮询,由此在这些端口中的一个端口等待来自计数器的响应。
[0616] 对于j=2,3:出口十字转门Xt[i].g经由路径 向在它的端口C.f[i+2]处的计数器发送信号。当在C.f[i+2]处感应到信号时,计数器将计数减1并且经由路径 返回信号,以便解锁十字转门并允许人员离开;通过执行
同步轮询Xt[j].g:mR?()*,Xt[i]在Xt[i].g处等待这个响应。对于j=4,计数器使用端口C.f[4]来接收并响应来自显示单元的请求,以便向该单元发送counter.count的当前值。显示单元基于外部中断发送关于计数的请求(见图10)。
[0617] 多个人可利用多个十字转门并行地同时进入及离开。然而,每个十字转门每次仅允许一个人进入或离开。程序是自我调度、自我调整和自我同步的。TICCTM网络和TIP确定用于确定执行控制结构的信号交换。清楚的是,附录I中的OG解决方案也适用于在[Magee & Kramer,13]中定义的停车例子,具有多个停车入口和出口,不同之处在于在车辆离开之前必须支付停车费。
[0618] 假设一公里长的1Mb/s的信号线和2GHz的CPU,则信号交换和计数所花费的时间应该小于几微秒。因此,这实际上可具有数目不限的入口和出口十字转门。在附录I中展示了基于这个网络的TICCTM-Ppde实施的CIP、ALLEOP和迹线。我们将这称为OG解决方案。
[0619] 为 了完 成 附 录I 中示 出 的 实 施,需 要 定 义如 下 的:personAtGate,personEntering ? (),personLeaving ? (),denyEntry(),letPersonIn(),letPersonLeave(),personInPark()和displayCount()。利用这些,附录I中的ALLEOP和迹线建模出完整的实施。该实施不需要监视器、旗语[Hoare,10,12][Dijkstra,23,24],锁定、调度器或同步控制原语。
[0620] 应该清楚的是,在这个组织中由十字转门调用的两个计数器活动不会彼此干扰,这是因为计数器仅在服务完第一功能端口之后才服务第二功能端口。还清楚的是,公园中的人数不会超过max。我们期望正式证明从实施规范开始的这些,以便示出实施满足需求。我们尤其期望证明如下的:
[0621] Stmt 1)对于进入花园的每个人,向计数器追加刚好一次;
[0622] Stmt 2)对于离开花园的每个人,从计数器减少刚好一次;
[0623] Stmt 3)花园内的总人数不超出max。
[0624] 上面用户对于Stmt 1和Stmt 2定义了如下的解释作为CTL-语句:由条件或动作指定CTL-语句中的事件。可在假定的时间点、在语句中发生的对象和事件之上量化CTL-语句。
[0625]
[0626] 出于方便,这里从附录I中再生出如下的定义:
[0627]
[0628] 在上面的CTL语句中,ctl.t2是计数器的调用终止于(6.2)的时间,而ctl.t5是计数器调用在(6.3)开始的时间。因此,限制(ctl.t2<ctl.t5)断言了(6.3)中的计数器调用必须仅在(6.2)中的计数器调用的终止之后。类似的,(ctl.t6<ctl.t2)断言了其他的可能性,即(6.2)中的调用发生在(6.3)中的调用终止之后。在这两种情况下,其中计数器在两个语句中是有效的的半闭合间隔,即[ctl.t1,ctl.t2)和[ctl.t5,ctl.t6),应该是不重叠的。量化 和 断言了在每个语句中仅存在计数器事件的一个唯一发生。我们已经假设counter++的每个调用都使计数增加1而counter--的每个调用都使计数减少1。因此,(6.2)和(6.3)断言,仅在计数器已经增加
1之后门口处的人才被允许进入公园,刚好一次,而仅在计数器已经减少1之后门口处的人才被允许离开公园,刚好一次。(6.2)和(6.3)中的事件的开始和结束是:
[0629] 开始事件 结束事件
[0630] 在(6.2)中:
(ctl.t0) personInPark?()(ctl.t3)[0631] 在(6.3)中:(ctl.t4)[0632] 注意,开始的事件终止的时间点(ctl.t0,ctl.t4)和结束的事件开始的时间点(ctl.t3,ctl.t7)的时间点对是不可比较的。因此,人可同时进入和退出。对于这个例子,在(7.2)和(7.3)中用◇替换第二椭圆→…→不会改变语句的含义,这是因为在每种情况下仅存在从开始的事件到达结束的事件的一种方式。要证明的问题是,
[0633]
[0634] 其中,traces是实施中所有迹线的集合,而 是逻辑结果关系。在这点上,上面的CTL断言没有声明在花园中存在多少个入口和出口。这是通过分析实施而发现的事情。该语句应该独立于公园中入口和出口的数目。
[0635] 6.1.1 OG解决方案的ECT网络
[0636]
[0637] 表I:入口门的ECT网络
[0638] 在表I和II中示出了ECT网络。在ECT网络中以表格式重新组织并表现关于轮询周期和端口迹线的信息;网络代表与ALLEOP一致的迹线的串行/并行组合。ECT和迹线两者具有相同的信息。我们不期望读者理解表I和II中的所有细节。下面我们给出这些表的结构的概述。
[0639] 表I中的网络示出了Et[j]和C.f[j]之间的交互而表II中的网络示出了Xt[j]和C.f[j+2]之间的交互,其中j=0,1。在网络中的每个ECT方框中,从上到下以时间递增顺序在第一列中显示事件。事件是条件或动作。在第二列中从上到下以递增顺序显示它们关联的虚拟时间点。在ECT方框之间具有箭头的直接支路示出了由选择点导致的替代的序列控制传送或由信号传递导致的并行控制传送(分支)。在选择点具有替代的序列控制传送的支路是以‘|’标记注释的,而示出并行控制传送的支路是以“‖”标记注释的。在这个例子中没有出现分支。用“‖”注释的支路上的椭圆,“→…→”表示在信号传递的相同时间不会发生在支路的箭头端处的方框的激活;这可以在某一随后的时刻发生。
[0640] 表I顶部的方框,Et[j].ft:ECT(e[j].t0),分支成两个替代方框。这三个方框一起描述了当Et[j]感应到人进入时将会发生什么。仅当如上(I.4)所示在Et[j].ft处接收到信号时,判定Et[j]:personEntering?()将为真。当在Et[j].ft处感应到信号时,Et[j]经由Et[j].g向C.f[j]发出信号以检查人员是否可以进入,并且如果他/她能够进入则对该人计数。如果公园中的人数已经达到允许的max,则人员不可进入。由从方框1中的事D件[●→C.f[j]]到方框4中的事件的,由指定并行激活的支路在表I中表示这种信号。
[0641]
[0642] 表II:出口门的ECT网络
[0643] 在发出这个信号之后,在附录I的TIP(I.3)中示出的同步非确定保护间隔(Et[j].g:mR?()|Et[j].f:mR?())*,Et[j]等待响应。在该表的方框1的底部示出当接收到响应信号时发生的两个可能的选项。它基于在Et[j].g或Et[j].f处是否接收到响应信号而分支出两个替代因果链。这里两个支路因果链都终止于端口Et[j].ft处的下一个周期的操作的序列激活。在Et[j].ft向传感器端口Se[j].g发出响应信号之后开始下一个周期。因此,仅在当前人员已经被完全服务之后才识别下一个人。在下一个人来到门时重复处理。在表I中的虚拟时间点代表事件开始的时间实例的序列。如表I所示,在方框5向方框2发出信号之后或是在方框6向方框3发出信号之后,终止在方框1开始的每个完整周期的处理。表I的方框4、5和6描述了计数器中发生什么。如下所述,系统从网络提取证明所需的信息。
[0644] 表I中的方框4具有指向它的两个激活箭头:一个是从左侧进入的来自的序列激活,而另一个是来自右侧的Et[j].g的并行激活。序列激活表示仅在另一个端口C.f[i]完成服务之后才服务另一个端口C.f[j]。当然可以使得i=j,即下一个被服务的人进入相同的门。这个序列激活到达的时间是C轮询f[j]执行C.f[j]:mR?()的时间,以便测试是否向它已经传递了信号。即使序列和并行激活同时发生,C仍可感应出已传递的信号。
[0645] 如果在来自Et[j].g的并行激活到达之前来自C.f[j]的序列激活首先到达,则在C.f[j]处的感应信号将会失败并且C将会跳过端口C.f[j]并开始轮询它的下一个端口(假设在表I中没有示出跳过端口的情况)。当C在一个轮询周期中跳过端口时,则在接下来发生的轮询周期内它将会接住信号(如果存在信号的话)。如果来自Et[j].g的并行激活首先到达,当它轮询C.f[j]时,则C将会感应该信号。在任何一种情况下,C不会立即响应激活信号。这是由表I中的并行激活支路上的椭圆所表示的。
[0646] 关于传递信号感应的序列和并行控制传送的同时发生的需求对于所有的在它们轮询周期内被它们的父蜂窝轮询的端口都适用。当作为另一TIP执行的一部分的嵌入的TIP处发生信号感应时,序列控制传送是暗含的;在嵌入的TIP处的感应将仅使用同步保护间隔。
[0647] 在C.f[j]处感应到信号之后,C到达表I中的方框4的端部的选择点。这里,通过(counter.count<max)的真值来确定该选择。在该选择之后紧跟的事件的因果链基于(counter.count<max)是真还是假来引起Et[j].g或Et[j].f的并行激活。Et[j].f立即响应这些并行激活中的一个,这是因为如附录I的TIP(I.3)中所示,它在端口Et[j].g和Et[j].f等待这些信号在非确定保护间隔(Et[j].g:mR?()|Et[j].f:mR?())*的接收。
[0648] 在C.f[j]处完成了它的任务之后,C引起在表I的底部示出的 的序列激活。这在附录I中定义的轮询周期之后。类似的,表II示出了与出口十字转门Xt[j]和C.f[j+2]之间的交互相关联的ECT方框。当我们讨论部分6.1.2中的证明构造时,读者可参考这些表中事件的流向,其中我们仅选取证明所需的信息。此时,建议读取重新阅读附录I。
[0649] 总结:表I和II中的ECT方框之间的序列激活代表了网络中的事件的执行顺序。这些是由轮询周期和执行蜂窝中的TIP的顺序所确定的。在每个方框中从上向下的ECT中事件流向代表了事件的因果顺序。因果顺序是由在TIP执行过程中事件的流向确定的。网络示出了与端口ALLEOP和附录I中的轮询周期定义相一致的端口ECT的串行/并行合成。
[0650] 6.1.2 ALLEOP证明的结构
[0651] 证明系统搜索ECT网络以便(i)以识别在CTL断言中假定的时间点和ECT中的虚拟时间点之间的匹
配对应关系;(ii)以从CTL断言中开始事件至结束事件中找到ECT网络的因果链;以及(iii)分析因果链以验证满足主张。在这个例子中,搜索是简单的。它们没有示出由于选择点和多个并行激活(分支)所导致的复杂性。在部分6.4的DP解决方案中出现了在上述这样的搜索中出现的一些复杂性。
[0652] 对于CTL语句中出现的事件,证明系统显示出如下的在CTL语句中指定的时间点和在表I和II中ECT中的虚拟时间点之间的匹配时间点:
[0653] 语句(6.2)的匹配时间点,其中j=0,1
[0654] ctl.t0=et[j].t0:Et[j]:personEntering?();(开始事件)
[0655] ctl.t1=cf[j].t2:[●→counter++]begins;
[0656] ctl.t2=cf[j].t3:[●→counter++]ends;
[0657] ctl.t3=et[j].t1:Et[j]:personInPark?();(结束事件)(6.5)
[0658] 语句(6.3)的匹配时间点,其中j=0,1
[0659] ctl.t4=xt[j].t0:Xt[j]:personLeaving?();(开始事件)
[0660] ctl.t5=cf[j+2].t2:[●→counter--]begins;
[0661] ctl.t6=cf[j+2].t3:[●→counter--]ends;
[0662] (结束事件)(6.6)
[0663] 存在两个可能的开始/结束事件,一个是j=0而另一个是j=1,如分别在(6.5)和(6.6)中与(6.2)和(6.3)中的事件匹配地所示。系统还显示出在对应于(6.5)和(6.6)的ECT中的开始和结束事件之间的如下因果链,其中j=0,1。因果链以迹线格式表达。
[0664]
[0665] 这里,我们忽略入口被否定的情况,这是因为CTL语句不会调用它。
[0666]
[0667]
[0668] 当系统构成迹线时,它在迹线中发生的ECT网络中标记事件,并
跟踪事件的迹线和它们的定时。我们将这个处理称为CTL语句在ECT网络上的符号评估。读者可根据表I和II来验证迹线(6.7)和(6.8)。在迹线构成过程中,条件都包含在链括号中,该链括号将与在相同的虚拟时间点发生的所有条件收集在联合中,对信号感应操作给出变量,这些变量指定它们感应的传递信号,在感应事件之前在ECT方框中发生传递信号。在方括号中包含动作事件。系统跟踪迹线虚拟时间点是否指定了事件的开始或结束时间。从网络中的第二列ECT方框中选取定时。
[0669] 此时,用户注意到存在需求的不完整规范。在(6.7)中计数器在半闭合区间[cf[j].t2,cf[j].t3)内是有效的,其中j=0,1。在(6.8)中它在区间[cf[j+2].t2,cf[j+2].t3)内是有效的。它没有指定在计数器是有效的时间周期的非交叉也应该适用于间隔[cf[j].t2,cf[j].t3)和[cf[j+2].t2,cf[j+2].t3),其中j=0,1。这里通过指定它应该适用于所有的j,用户指明在入口和出口十字转门处的状态。
[0670] 现在,当被用户当前更新时,系统必须分析在(6.7)和(6.8)中的迹线以验证CTL断言(6.2)和(6.3)是否满足。存在有应该被ECT网络满足的三个通用需求,以便确保进程:
[0671] 由所有ECT网络满足的通用需求:
[0672] 通用需求1.在CTL语句中假定的时间点应该匹配迹线中的时间点。
[0673] 通用需求2.在它的轮询周期中被蜂窝轮询的每个端口应该具有两个活动:一个是序列激活而另一个是并行激活;并行激活传递感应到的信号。
[0674] 通用需求3.具有同步轮询每个端口(不论在轮询周期中轮询还是在嵌入的TIP中轮询)应该具有最终通过并行激活发送到它的信号。
[0675] 在表I和II中网络满足所有上述三个需求。在这个例子中,存在两个额外的需求:(a)在每个因果链中仅发生一次计数事件;和(b)两个计数调用不应该重叠(即使在每个因果链中仅出现一次计数器时,两个计数器调用可以重叠,这是因为因果链的并行执行的缘故)。在(6.7)和(6.8)中的事件的直接因果链指示对于端口C.f[j],0≤j<4,在每个因果链中仅发生一次counter++或counter--(在每个因果链(6.7)和(6.8)中因果关系→发生两次。这代表协议执行并且计数器不在协议执行中出现。通常在迹线中不示出协议执行的细化。)。这满足需求(a)。系统注意到也满足需求(b)。这从表I和II中的的序列激活得到。对于i=4,蜂窝C响应来自counter.count的显示单元的请求,并且这不调用由计数器执行的计数。因此,对于C.f[j],0≤j<4,仅在第一调用已经被完全服务之后才发生关于计数器的计数的第二调用。因此,在C中计数器计数的过程中的间隔不会重叠。当被用户更新时,这完成了Stmt 1和Stmt 2的证明。
[0676] 我们通过证明公园中的总人数总是小于或等于max来验证Stmt 3。这对应于在Maggie & Kramer,[13]中的条件同步化。这是NFSP证明并需要如下的推导:
[0677]
[0678] 用户通过提供如下的CTL断言引导系统来证明推导步骤:
[0679]
[0680]
[0681] 利用在附录I中给出的personEntering?()和personLeaving?()的定义并且在表I和II的ECT上对于所有可能顺序的十字转门的成对来评估(6.10)和(6.11),系统使这些有效,这是因为在每个成对中的开始和结束时间点,(e[j].t0<e[j].t1)and(x[i].t0<x[i].t1)都是不可比较的,其中0≤j≤1。例如,在门Et[0].ft处的人被允许进入之后,在该人进入花园之前,可允许门Et[1].ft处的另一个人也进入,并且这个第二个人实际上可以在第一个人之前进入花园,这是因为人员进入和离开花园的时间是不可比较的。同时其他人员可离开花园。在人员进入或离开花园的任何顺序中,在门Et[j].ft and Xt[j].ft处的人进入或离开花园之后,counter.count≤max保持为真。这可通过因果链(6.7)和(6.8)确认。可安装期望多数目的入口和出口门;推导仍适用。通过推导的证明需要用户引导。
[0682] 应该清楚的是,系统以迹线和轮询周期来组织信息,成为以方便找到与给定的CTL语句的时间点匹配的时间点的格式的ECT方框的网络,并构建匹配CTL语句中的开始和结束事件的迹线。可将ECT网络中识别的因果链方便地变换为迹线格式。
[0683] 6.1.3评述
[0684] 这里证明的主张是实施的属性,这是因为ALLEOP和迹线自动地从实施中生成。注意当控制从一个蜂窝传送到另一个蜂窝时,并行地作出在ECT上的CTL语句的符号评估,这是因为我们将CPU分配给每个蜂窝。在这个例子中,ECT是简单的并且不需要并行评估。这里仅发生序列合成,这是因为对于每个入口和出口,十字转门等待直到计数器已经完成了它的任务并且由计数器顺序地完成了通过任何一个门的每个入口和出口的服务。对于在如上给出的(I.4)和(I.11)中定义的合并仅需要逻辑推断。由于大多数并行线程都是成对独立的并且被独立地证明是正确的而从属的并行线程联合地证明是分别正确的,证明的CTL语句将仅涉及追寻实施的ECT网络中的因果序列,并且因果链的分析可验证是否满足给定的CTL断言中的条件。
[0685] 满足CTL语句的因果链使这些语句有效。如果CTL语句无效,则这个证明方法可提供计数器例子。如果结束事件不可到达并且ALLEOP是有限的ALLEOP,则计数器例子将会终止证明。对于非有限ALLEOP,可不终止证明;用户干预是必须的。在找到所需的因果链之后,系统分析序列和并行激活以确定事件的相互排斥属性和部分顺序。证明方法是交互的。在证明的每个阶段系统都向用户展现它的发现并向用户给出基于发现修改给定的CTL语句或提供可引导证明搜索的新的断言的机会。在这个例子中,匹配时间点和因果链的识别是简单的。在部分6.4的DP解决方案中发生涉及蜂窝的状态的迹线的更加复杂的证明。在所有的情况下,如在部分6.5中讨论的,用户具有选择其有效性验证实施的准确性的那组CTL语句的责任。对于复杂的实施,这将会是重要的问题。
[0686] 这个例子仅使用点到点信号交换而不使用虚拟存储器。其他例子在它们的路径上使用了虚拟存储器。因此我们首先介绍虚拟存储器的结构和与它相关联的操作。
[0687] 6.2虚拟存储器的结构
[0688] 图11示出了虚拟存储器的示意图。它具有四个部件:SP用于便签式存储器,E用于执行存储器,W用于写入存储器,而R用于读取存储器。执行存储器保持并行线程并为它们提供执行环境。我们假设在执行存储器中的数据的每个项目都标记具有表明在主存储器或数据库中的身份的旗标,如果存在的话。如果蜂窝的分组使用相同的虚拟存储器M,则分组中的每个蜂窝应该具有归属端口分组的端口,并且端口分组中的所有端口应该被调谐与M附接的相同的代理。这样蜂窝分组中的蜂窝可在由M的执行存储器提供的环境下在并行线程执行过程中使用M的便签式存储器SP来交换数据。来自数据库或主存储器的数据可仅在它们被复制到虚拟存储器当中之后才被蜂窝分组所共享。
[0689] 写入存储器保持所发出的消息而读取存储器保持所传递的消息。读取和写入存储器可在由传递消息的代理传递消息之前被切换。因此,每个接受方从读取存储器读取它的输入消息。端口p可利用转发命令p:f()而非发送命令p:s(),向通过路径连接的端口q转发在它的读取存储器中的消息。如果使用了转发命令,则读取和写入存储器不被切换。在部分6.4中存在的DP解决方案(哲学家就餐)中使用转发命令。在部分7中描述区分发送/转发命令的协议。
[0690]
[0691] 图11:虚拟存储器
[0692] 如上所述,每个端口p都通过经由支路连接到与M附接的代理来调谐到虚拟存储器M。“p的虚拟存储器”是指已经调谐到p的虚拟存储器。我们参考p的虚拟存储器的读取、写入、便签式存储器和执行存储器来分别写入p.rd,p.wr,p.sp和p.ex。我们写入p.wr:wR(msg)来表示p将空白实例、msg、(msg的容器)写入M的写入存储器,可具有一些默认数据值。我们使用p.rd:wR(msg)来将Msg的容器写入虚拟存储器的读取存储器;这与M的其他部件相类似。我们参考M的写入存储器的实例中的消息来分别写入p.rd:msg()=p:msg(),和p.wr:msg()。如果在虚拟存储器中不存在容器,则我们使用p:make(msg,[])将具有指定数据的Msg的实例写入p的写入存储器。如果在虚拟存储器中存在容器,则使得制作(make)命令利用指定数据充满它。p.rd:make(msg,[])对于读取存储器进行相同的操作。假设在虚拟存储器的读取/写入/便签式存储器/执行存储器部件中定义了这些制作和写入方法。
[0693] 在大多数应用中,在初始化时将所需消息子类的容器安装到虚拟存储器中。因此,通常仅使用制作命令。在虚拟存储器的执行存储器中保持消息子类的编译代码和在它们中定义的方法。因此,当这些端口处在状态S下,那些调谐到虚拟存储器的端口可利用在虚拟存储器中消息子类中安装的所有方法和数据。多于一个的虚拟存储器可包含相同消息子类的代码。
[0694] 我们使用p:msg():empty?()来检查端口p的读取存储器中的消息是否为空,即不包含任何数据,而使用p.wr:msg():empty?()来对于端口p的写入存储器中的消息进行相同的检查。类似的,使用p:msg().attribute:empty?()和p.wr:msg().attribute:empty?()来检查消息的指定属性在p的虚拟存储器的读取和写入存储器中为空。我们使用p.rd:empty?()和p.wr:empty?()来检查所指示的存储器是否为空;即不存在容器。我们使用p:clear()来清除调谐到p的虚拟存储器的读取和写入存储器的内容。类似的,使用p.rd:clear()和p.wr:clear()来仅清除读取和写入存储器。类似的,对于便签式存储器和执行存储器定义断言。
[0695] 图19描述了用于连接总端口分组G中的端口到功能端口分组F中的端口的分组到分组的路径的结构。在这个附图的端口分组中的端口的所有父蜂窝使用相同的虚拟存储器M,如该图所示。仅当蜂窝访问存储器时,使用虚拟存储器M的这样的蜂窝分组中的每个蜂窝可读取存储器中的数据。访问受到端口分组中的端口控制。在任何给定的时间,分组G中的端口的父蜂窝或是分组F中的端口的父蜂窝访问M;它们都不能同时访问M。归属于调谐到虚拟存储器M的任何端口分组的端口的父蜂窝可同时执行在M的执行存储器中的并行线程,访问及利用共同共享的数据和并行线程。
[0696] 利用相同的虚拟存储器M由端口分组中的端口的父蜂窝调整这样的同时并行执行由如下提供方便:(i)对于在虚拟存储器中的共享数据的同时读取访问的便利;(ii)在需要时使用并行线程锁调整数据更新的便利;以及(iii)在并行执行过程中通过共享便签式存储器存储器通信以便调整运算的便利。当并行线程锁被使用时,它们将仅应用于在执行同时并行执行的蜂窝分组中的蜂窝。通过限制蜂窝分组中的蜂窝数目来限制存储器争用的可能性。我们估计在蜂窝分组中实际所使用的蜂窝的数目不太可能超出10或20。为了防止数据复写并保护数据,可约束蜂窝分组中的蜂窝写入到虚拟存储器中的区域。调谐到相同的虚拟存储器的端口分组中的端口可保持这些端口的父蜂窝可写入数据的非重叠存储器区域的地址。上述方便可被用来有效地减少存储器争用。
[0697] 在这点上,我们引入了在通信事件上条件迁移的规则:在利用p:s()的信息发送的情况下,在读取/写入存储器之间切换如下消息特征化的条件。在利用p:f()转发消息的情况下,不切换条件:
[0698] □[{(p.rd:?()&p.wr:?())(t1)}[pS(t1)}→(t2)]
[0699] {(q.rd:?()&q.wr:?())(t2)}] (6.12)
[0700] □[{(p.rd:?()&p.wr:?())(t1)}[pF(t1)}→(t2)]
[0701] {(q.rd:?()&q.wr:?())(t2)}] (6.13)
[0702] 在(6.13)中的PF(t1)中的上标F表示消息被转发。
[0703] 接下来给出两个子部分,PC解决方案(生产/消费者)和DP解决方案以及和它们相关联的ALLEOP证明。不必须使用旗语[Dijkstra,23,24]、监视[Hoare,12]或序列缓冲器(我们已经讨论过几次;但是我们仍认为值得重复,这是因为旗语和监视都是在编程技术中牢固确定的机制并且被认为是不可缺少的。至今它们已经被使用了多于四十年)即可实施解决方案。
[0704] 6.3生产者/消费者解决方案:PC解决方案
[0705] 我们这里的目标在于说明并行缓冲器的使用。在图12中示出了PC解决方案的网络而在附录II中展示了该解决方案。它具有n个生产者,P[i],0≤i<n和与分发者D相连接的m个消费者C[i],0≤j<m。环境蜂窝E用来基于外部中断信号开始/停止应用。调谐到生产者的虚拟存储器提供了它们发送到D的产品的并行缓冲。调谐到消费者端口C[j].g的虚拟存储器被用来发送产品到消费者。对于实施的CIP、TIP、轮询周期和ALLEOP请见附录II。我们期望证明如下的:
[0706] (Stmt 1)向分发者传递每个被制造的产品。
[0707] (Stmt 2)请求产品的每个消费者获得该产品。
[0708] (Stmt 1)和(Stmt 2)的CTL语句:
[0709]
[0710]
[0711] 在(6.14)中,生产者P[j]生产产品并且分发者最终在它的端口D.gj接收它。在S(6.15)中,消费者C[j]通过执行C[j].g 发出对产品的请求并最终获得该产品。
[0712]
[0713] 图12:PC解决方案的网络
[0714] 利用部分5中的规则(5.32)和表III中的ECT网络,通过 对于j和 对于产品的通用安装和假定的时间点,由系统执行的第一任务是通过消除模型运算符□和◇来转换(6.14)和(6.15)。在(6.16)和(6.17)中示出了所得到的CTL语句。在这个例子中简化了这个任务,这是因为对于每个j仅存在一个唯一的因果链。
[0715] 变换后的CTL语句:
[0716]
[0717]
[0718] 在表III中示出了PC解决方案的ECT网络。在这个网络中嵌入了太多的信息以方便读者理解。当我们继续讨论证明时,我们选取我们所需的信息。在表III中的ECT网络满足在部分6.1中提及的通用需求GR-1和GR-2。然而,GR-3的满足不立即得到。我们必须证明在方框3的第三行中的 执行的搜索被传递的产品每次都成功。
[0719] 在表III中的ECT上语句(6.16)和(6.17)的评估产生如下的匹配时间点(下面给出对于对应于表III中的方框中的时间点的事件的参考;在每个方框中行号都是从上到下):
[0720] 对于(6.16):ctl.t0=p[i]f.t2:P[i];P[j]生产产品:行3,方框5
[0721] ctl.t1=p[i]f.t3;将它放入写入存储器:行4,方框5
[0722] ctl.t2=p[i]f.t5;将它传递到D.g[i]:最后一行,方框5 (6.18)[0723] 对于(6.17):ctl.t3=(c[j]I.t2|c[j]g.t3);c[j]发送产品的请求,行3,方框1和最后一行,方框2
[0724] ctl.t4=dg[k]t.t0;D开始搜索:行3,方框3
[0725] ctl.t5=c[j]g.t2;消费者获得它:行5,方框2 (6.19)[0726]
[0727] 表III:PC解决方案ECT网络
[0728] 系统识别在对应于CTL语句中的事件流向的表III中的ECT网络中的事件的流向并将它们放入迹线格式。在下面示出了这些:迹线(6.20)示出了从P[j]感应到新的产品的顺序的时间到产品被传递到分发者端口D.g[j]的时间的事件的流向。
[0729]
[0730]
[0731] 迹线(6.20)指定了如下的:当在它的端口P[j].f感应到接收消息时,则P[j]生产产品,将它放入P[j].f的写入存储器并将它发出到D.g[j],而D.g[j]在它的读取存储器中随后某时接收它。这使得(6.16)有效。注意,在(6.20)中的最后一行中的两个时间点(dg[k]t.t0,p[j]f.t5)是不可比较的。因此,产品传递和搜索产品不是同步的。
[0732] 下面迹线(6.21)显示出从消费者C[j]放入对产品的请求到C[j]具有产品的时间内事件的因果链。
[0733]
[0734]
[0735] 仅在搜索 每次成功时确保(6.21)中事件的流向。D.g[k]从P[k].f接收它的传递。当产品被移动到D.f[j](见表I的行5,方框3)时,在(6.21)的搜索 开始于时间dg[k]
t.t0而结束于时间dg[k]t.t1。当且仅当在dg[k]t.t1之前存在将产品传递到D.g[k](0≤k<n)并且在dg[k]t.t1之前这个产品没有被用完,这个搜索才每次成功。
[0736] 推导证明遵循如下:由于在它的初始化过程中由分发者D规定顺序,因此搜索对于第一个消费者是成功的。见表III中的方框4和5中的最后一行。假设在第N次尝试中成功。它将会在第(N+1)次尝试中成功,因为在第N次尝试中用完了产品,假设在端口D.g[k]处,对于生产者P[i]规定了新的顺序。见方框2中的行8和在(6.21)的D.g[k]S(dg[k]t.t2)后面的评述。由于搜索继续直到发现产品,因此当P[i]响应这个顺序或搜索发现在一些其他端口D.g[j]处尚未被使用的产品时,这一定是成功的。系统通过使得由用户提供的断言有效而交互地证明这点。我们在这里不展示细节。因此,对于(6.21),每个消费者接收到所请求的产品。
[0737] 这满足了部分6.1中的需求GR-3。然而,为了确保进程,必须假设如下的:
[0738] 公 理 :
[0739] 即,始终存在请求产品的消费者,这是与假设相同的,即每个产品最终被用完。否则,商业停止并且分发者在执行它的轮询周期的空端口周围环绕(spin)。此外,如果存在对于产品不充分的需求,则一些生产者就维持环绕。如果它继续环绕多于指定的时间长度,则可重新定义生产者CIP以暂停生产者。如果选取了需求并且随后将顺序传递给它,它将会自动地恢复操作。
[0740] 评述:我们在证明构成中遇到的其中一个问题是,我们必须在某些情况下采用推导证明,其中在FSP描述的常规表达中的简单“星形操作”可使需求有效。不仅因为我们不具有“状态”而且因为并行操作中的实质异步性而发生这种情况。在大多数情况下,推导证明是十分无关紧要的,期望它能够设计出系统自动地构造证明的策略。
[0741] 6.4哲学家就餐解决方案:DP解决方案
[0742] 在图13中示出了DP解决方案网络。存在开始和停止游戏的在图中没有示出的环境蜂窝。存在分配关于请求的餐叉并保持食物供应的管家,btlr(在图13中标记有B)。仅在哲学家从btlr得到两把餐叉之后他/她才开始吃饭。在餐桌上有五把餐叉,btlr.frk[j]和五位哲学家,P[j],其中0≤j<5,如图所示。每位哲学家P[j]与他/她的左侧邻居P[j⊕54]分享btlr.frk[j],并且和他/她的右侧邻居P[j⊕51]分享btlr.frk[j⊕51]。因此,在相同的时间不会有两位邻近的哲学家吃饭。
[0743]
[0744] 图13:DP解决方案网络
[0745] 哲学家P[j]通过向功能端口btlr.f[j]发送发送空消息来发送关于餐叉的请求。如果两个餐叉,btlr.frk[j]和btlr.frk[j⊕51]都可以利用,则btlr将餐叉
包装在btlr.f[j]的写入存储器中的容器中并将它们发出。一旦完成,则餐叉对于P[j⊕51]和P[j⊕54]不可利用,直到P[j]吃完饭并归还餐叉。如果在P[j]请求餐叉时P[j⊕51]正在吃饭,或P[j⊕51]正在正在吃饭,或者P[j⊕51]正在等待将他/她的左侧餐叉btlr.frk[j⊕51]预定时,则餐叉对于P[j]不可利用。在这种情况下,btlr使得P[j]的左侧餐叉,btlr.frk[j],处于预定并且哲学家P[j]等待直到两侧餐叉都变为可以利用。一旦btlr.frk[j]处于预定,则P[j⊕54]在P[j]吃完之前不能(再次)开始吃饭。仅在P[j]在他/她吃完饭返还餐叉时将Btlr.frk[j]从预定释放。
[0746] 每位哲学家P[j]总是在他/她完成吃饭之后返还餐叉并回到他/她的思考状态T[j]。在思考一段时间之后,他/她再次变得饥饿并发出获取餐叉的订单。Btlr按照周期顺序来服务哲学家,P[0]→P[1]→P[2]→P[3]→P[4]→P[0]→…→,直到游戏结束。在游戏的任何点P[j]可处在三种可能状态中的一种状态:E[j](吃饭),T[j](思考)或W[j](等待餐叉)。游戏开始于所有的哲学家都处在状态T[j],餐桌上的所有餐叉对于任何哲学家都可以利用,并且食物已准备好。已经发出获得餐叉的请求并且其请求被首先感应到的哲学家P[j]由btlr首先服务,并且即使所有的哲学家在相同的时间都已经发出获得餐叉的请求,哲学家P[j]仍可首先得到餐叉。在P[j]得到餐叉之后,P[j⊕52]可下一个得到餐叉,如果他/她已经请求获得餐叉。随后两者开始吃饭并分别进入状态E[j]和E[j⊕52]。其他人,即k≠j且k≠j⊕52将等待餐叉,如果他们已经对餐叉下了订单,并由此进入状态W[k],或是如果他们没有对餐叉下订单,则只维持思考。
[0747] 在附录III中给出了CIP、TIP、ALLEOP。由表IV和V中的网络代表迹线。游戏满足确保进程的如下两个公理:
[0748]
[0749] (6.23)表示每个吃饭的哲学家总是最终返还餐叉并进入思考状态。(6.24)表示每个思考的哲学家最终变得饥饿。
[0750] 如下定义状态,E[j],T[j]和W[j]:
[0751]
[0752]
[0753] 注意在上述语句中动作的开始和结束定时。W[j]是P[j]和btlr.f[j]的合成状态。
[0754]
[0755] 表V:btlr.f[j]ECTs.
[0756] 游戏的初始状态是,
[0757]
[0758] 是这里仅有的死锁状态,这是因为对于任何的j,P[j⊕54]仅在P[j]完成了吃饭之后才开始吃饭,其中0≤j<5。因此,没有哲学家能够开始吃饭。下面我们给出两个主张的证明:(i)如果游戏开始于(6.28)中的初始状态,则游戏将永远不会进入死锁状态;和(ii)关于每次每位哲学家变得饥饿时他/她获得吃饭的机会这个方面是公平的。
[0759] 为了简化系统的可能状态的描述,让我们遵循如下的约定:
[0760]
[0761] 可认为如下的状态在btlr的轮询周期的结束或开始时为真。我们将这样的状态称为配置。因此, 和 是配置。用户可以利用了(6.29)中的理论的T[j],W[j]和E[j]状态对如下的CTL语句方程化:
[0762]
[0763] 断言(6.30)特征化死锁配置。在(6.31)中最终一位或两位哲学家正在吃饭或所有的哲学家正在思考。(6.32)断言每位等待的哲学家最终吃饭。如我们将会看到的一样,这里的搜索不会涉及发现匹配时间点,但是涉及追踪哲学家的状态。
[0764] 在表IV和V中示出了用来证明这些断言的ECT网络。它们是从附录III中的ALLEOP当中得到的迹线所获得的。这里,每个ECT网络都具有定义了网络的初始状态的方框。这指定了当网络开始时判定的真值;即,符号评估开始。如果在初始状态没有指定选择点处的判定,或选择点处的判定没有处在在ECT评估中早先评估的判定当中或不能从定义中推导出来,则从那个选择点引出的所有因果链都被包括为ECT评估迹线中的可能替代。在开始对应于任何轮询的TIP的ECT评估之前,利用构成那点的评估的结果,利用在附录III(III.35)中给出的区分判定的定义和在附录中由用户提供的其他定义,系统更新初始状态。ECT评估中的约定是,判定维持它们的真值直到它们被改变。
[0765] 管家ECT具有几个选择点和并行激活,但是不具有分支。由于所有的哲学家和管家都是并行地运行,因此当需要时可并行地执行它们的ECT的符号评估。让我们从断言(6.30)开始,断言(6.30)是最容易证明的一个。替代在表V中示出的那个初始状态,这里的初始状态是下述(6.33),而不是表V所示出的。
[0766]
[0767] 这些初始条件出现在表V中的ECT方框(13)的结束处。这是发生W[j]的唯一ECT方框(如果存在多于一个ECT方框W[j],则系统应该验证从每个这样的W[j]开始的给定断言)。对于表V的ECT表中的(6.33)评估中的断言设定初始状态再次导致W[j],沿着包含标注有(1)→(2)→(4)→(6)→(8)→(13)→(17)的方框的评估路径;而(13)直接地前进至(17)而没有任何的消息交换。当评估继续时,获得关于轮询周期的ECT评估的如下序列:
[0768] btlr.f[j]:ECT(…)→btlr.f[j⊕51]:ECT(…)→btlr.f[j⊕52]:ECT(…)[0769] →btlr.f[j⊕53]:ECT(…)→btlr.f[j⊕54]:ECT(…)
[0770] →…→ (6.34)
[0771] 这里,由于W[j]对于所有的j都为真,因此对于所有的j迹线不可避免地导致表V中的ECT方框(13)。因此,配置从未改变。系统在经历了对应于开始于btlr.f[j]并结束于btlr.f[j⊕54]的一个完整的轮询周期的评估之后识别出这个。注意,在状态W[j]下,btlr在ECT方框(13)中不向P[j]发回任何的响应消息。关于在图1和2中给出的保护间隔的定义,btlr.f[j]:mR?()在每个轮询周期中评估为真,直到响应消息被发送回,这当然在死锁配置下从未发生。这证明了(6.30)。
[0772] 让我们现在考虑(6.31)中的证明。下面,我们使Z来指代在轮询周期的结束时的配置。通过规则(5.32),CTL断言(6.31)被转换为,
[0773]
[0774] 其中,EZ是结束配置,
[0775]
[0776] 首要任务是发现在管家的一个轮询周期之后(始于初始状态并在它的评估之前更新btlr.f[j]:ECT()的初始状态并沿着表V中的每个选择点的所有替代因果链)会是什么配置Z的,其中判定值不可利用。系统很快发现Z=EZ,如下:在表IV中,其中0≤jS<5,哲学家P[j]变得饥饿并通过执行P[j].g(p[j]g.t0)向管家发出请求,并在时间点p[j]g.t1=bf[j].t0将它传递到btlr.f[j],其中0≤j<5。由于哲学家是并行地运行的,因此这些消息传递时间是不可比较的。管家轮询btlr.f[j]以感应消息传递的轮询时间是bf[j].t1,0≤j<5,其中bf[j].t1<bf[j⊕51].t1如同附录III中的轮询周期定义。唯一的需求是在消息感应之前发生消息传递。如果在btlr轮询它的端口btlr.f[j]之前哲学家P[j]已经发送了请求,则btlr将会感应到端口处的消息接收,否则将不能。
[0777] 因此,如下情况是可能的:所有的哲学家同时发送请求,他们当中没有人在管家的轮询周期内发送请求,或是一些人发送而一些人不发送。由于管家和哲学家的操作不是同步的,因此当btlr轮询它的功能端口时它可感应到某时在它的一些端口处的消息接收,或是在轮询周期内没有感应任何的消息,或是在轮询周期内感应到所有端口处的消息。因此,可以理解的是在btlr.f[j]:ECT()中包括从每个选择点发出的所有可能的替代因果链。在表V的ECT方框(6)和(7)中出现判定btlr.f[j]:msg():empty?()的情况下,用户提供如下的定义,
[0778]
[0779] 系统利用表IV和V中的ECT验证这个定义并使用这个定义来确定在表V的标注有(6)和(7)的ECT方框中具有条件btlr.f[j]:msg():empty?()的选择点考虑的支路。当需要时,系统还使用定义来更新初始状态。典型地,仅当评估判定或当更新初始状态时,作出逻辑推断的需求出现在ECT评估。
[0780] 断言(6.35)和(6.36)没有给出选择表V中的选择点的因果链的任何标准。因此,系统分析与初始状态下的判定和给定定义相一致的所有可能因果链,并发现(6.35)中的Z等于(6.36)中的EZ。这是由图14中的树总结的,其中由树的任何一个支路中的状态指定管家的轮询周期之后的可能配置。读者会注意到图14中的每个支路都满足Z中的模式:所有的哲学家都在思考,或者他们中的一个或两个在吃饭。因此,从初始状态开始后的第一个轮询周期(捕捉了我们迄今发现(6.38)在从初始状态开始后的第一个轮询周期之后立即保持为真的事实的语句将会相当长。这样的语句将必须捕捉图14中的每个可能的支路。)之后的配置满足:
[0781]
[0782] 因此,为了证明(7.35),系统尝试发现如下的配置,
[0783] □[EZ→…→Z1] (6.39)
[0784] 从而通过执行如下操作而使(6.39)成立:通过设定i=j,它首先生成(6.36)中的变量i的存在的实例化,并如下前进:可能的初始配置是,
[0785]4 3
[0786] 根据(6.29)中给出的定义替代(6.40)中的否定状态,这导致(2+2)个可能的初始配置。对于每个初始配置,系统发现对于来自ECT的配置应该为真的初始条件和由用户给出的区分判定的定义,并适当地将它们包括在初始条件中。在如此作之后,对于每个初始状态,它评估跟随与给定的初始条件相一致的所有可能因果链的ECT,并发现Z1=EZ(对于(6.39)中的Z1和(6.36)中的EZ)对于所有可能的初始条件和 保持为真。这证明了(6.35),(6.36)和(6.31)。
[0787]
[0788] 图14:第一个轮询周期的结束时的可能配置的支路树
[0789] 注意,通过如此作,系统有效地建立了用于从实施开始的哲学家就餐的解决方案的状态图。这里,我们不必须搜索匹配的时间点,而是仅搜索在轮询周期中达到的配置。让我们声明根据由系统计算得到的状态图的引理。这个引理对于证明(6.32)是有帮助的。
[0790] 引理1:
[0791] 这指定了如果P[j]处于状态W[j]则P[j]的左侧和右侧的哲学家处于什么状态。当状态被替代以扩展(6.41)中的理论时,我们得到8个可能的不同三元组。这些三元组是:
[0792] T[j⊕54]W[j]E[j⊕51],T[j⊕54]W[j]W[j⊕51],W[j⊕54]W[j]E[j⊕51],[0793] W[j⊕54]W[j]W[j⊕51],E[j⊕54]W[j]E[j⊕51],E[j⊕54]W[j]W[j⊕51],[0794] E[j⊕54]W[j]T[j⊕51],T[j⊕54]W[j]T[j⊕51] (6.42)[0795] 系统容易验证所指定的三元组是否与它已经构造的状态图相一致。如果状态图尚未被构造,则系统可通过对于W[j]设定合适的初始状态并评估表IV和V中的ECT来验证每个三元组,其中可任意选择j。对于(6.42)中的每个三元组,在(6.42)中没有指定的状态可以是与被指定的三元组相一致的任何状态。
[0796] (6.32)的证明遵循如下的事实,即每个吃饭的哲学家返还餐叉(从(6.24)的公理Ax1),并且每个思考的哲学家最终变得饥饿(从(6.25)的公理Ax2),当P[j]正在等待时,P[j⊕54]不能开始吃饭,这是因为btlr.frk[j]已经被P[j]预定。如果当P[j]正在等待时P[j⊕54]正在吃饭,则在P[j⊕54]完成吃饭之后,在直接跟随P[j⊕51]返还餐叉的周期的第一个轮询周期中,P[j]将会得到他/她的吃饭机会。如果因为P[j⊕54]吃饭时间过长而导致P[j]不得不等待管家的几个轮询周期,则根据Ax 1(6.24)P[j⊕51]可在返还餐叉之后再次开始吃饭。这可在P[j]得到他/她的餐叉之前发生几次。但是,P[j]最终将会得到他/她的餐叉,这是因为P[j⊕54]不能再次开始吃饭直到P[j]完成吃饭。这在图15中被描述。这里,论证类似于利用常规表达的FSP论证。
[0797] 让我们考虑(6.42)中的T[j⊕54]W[j]T[j⊕51]和W[j⊕54]W[j]W[j⊕51]的情况。轮询开始于btlr.f[j]。在T[j⊕54]W[j]T[j⊕51]的情况下,唯一的可能性是它变为 这里,P[j]已经开始吃饭,因此证明结束。在W[j⊕54]W[j]W[j⊕51]的情况下,符合如下的:它遵循(6.35)和(6.36),即总是存在至少一个正在吃饭的哲学家。用户提供如下的断言,
[0798]
[0799] 利用(6.36)、(6.39)和图14中的配置通过评估容易使得这个断言有效。在W[j]W[j⊕51]E[j⊕52]的情况下,根据(6.25)中的Ax 2,必然会导致如下序列的过渡:W[j]W[j⊕51]E[j⊕52]→W[j]W[j⊕51]T[j⊕52]→W[j]E[j⊕51]T[j⊕52]→E[j]
T[j⊕51]??[j⊕52]。因此,P[j]最终吃饭。上述过渡可被系统完全验证。对于这种情况还会发生类似的过渡,
[0800] 对于每种情况,系统评估经过连续的轮询周期的ECT,开始于合适的初始状态直到在轮询周期中获取状态E[j]作为P[j]的必要(唯一可能)状态。在每个轮询周期内,在每个j的btlr.f[j]:ECT()评估之前更新初始状态。这类似于FSP中的状态搜索。在这个特定的问题中,当之前到达的配置再次发生时系统可停止重复它的轮询周期。这里是可能的,因为解决方案具有有限的ALLEOP。这种搜索在每种情况下都成功。但是在这种搜索中存在困难。
[0801] 如果E[j]不能到达,则对于非有限的ALLEOP,系统可从未终止,除非用户指定适当的终止条件,或是系统遇到矛盾,或是用户停止系统并检查迹线。
[0802] 评述:通过从实施得到ALLEOP和ECT网络并且在ECT网络上评估给定的CTL断言并分析所得到的因果链来构造ALLEOP证明。系统展示了它在以迹线格式存在的ECT网络中发现的因果链。证明构造是交互的。在所有的情况下,用户提供要被有效的CTL断言和引导因果链(迹线)分析的断言。系统适当地使由用户提供的每个断言有效并使用已经有效断言来发现新的迹线。我们在上面对于一些简单例子已经描述了这个证明过程。为了简化展示,我们不展示在它的搜索过程中由系统发现的迹线。
[0803] 在ECT评估中存在五种相互间关联的活动:(i)设定与给定的CTL断言相一致的开始和结束配置;(ii)当需要时,发现CTL断言和ECT之间的匹配时间点;(iii)发现ECT网络中的选择点处的条件的真值;(iv)发现从开始配置到结束配置的所有迹线;以及(v)分析迹线以使CTL断言中的主张有效。在有限ALLEOP的情况下,用户干预仅在上面的项目(v)中是必须的。在非有限ALLEOP的情况下,对于(iv)和(v)都是必须的。
[0804] 在系统不能独立地证明所有的可证明CTL断言的情况下,这些证明的证明理论都不是完整的证明理论。这是因为在上面的项目(iv)和(v)中用户交互的从属性。随着我们经验的积累,如果可能的话可通过识别典型的ALLEOP样式或通过建立FSP结构和有限ALLEOP结构之间的对应关系,在逐渐更大的范围内自动化证明构造。我们不能声明与TMTICC -Ppde如何被组织、它如何操作、以及什么被证明的运算重要性相独立的证明理论。在TM
定义证明理论之前,我们定义TICC -Ppde编程系统的指示固定点语义。这定义了什么被证明的运算重要性。
[0805] 下一个子部分将会介绍引导用户生成对于给定的应用Ap要被验证的CTL断言的标准。
[0806]
[0807] 图15:在连续轮询周期中管家的状态
[0808] 6.5实施的校正
[0809] 使 得 Ap:Requirements(),Ap:Pthreads(),Ap:ALLEOPs(),Ap:ECTs() 和Ap:CausalNet()分别表示在Ap的实施中应用Ap的并行线程、ALLEOP、ECT和因果网。在部分7中描述了由SMS自动生成的因果网。由用户定义在Ap:Pthreads()中的线程。它们是相互独立的成对。此外,每个并行线程是仅包含基本编程语句的短序列程序。这些使得可独立于其他并行线程来证明每个并行线程的校正。设计者和实施者有提供并行线程特征化的责任。ALLEOP和ECT是从实施规范由系统自动地生成的。
[0810] 如果对于Ap生成的因果网在它运行过程中没有违反事件样式和Ap:ALLEOPs()中的部分顺序,并且Ap:CausalNet()中的所有事件都是在指定的时间期限内发生的,则我们编写(Ap:CausalNet()satisfies Ap:ALLEOPs())。在部分7中描述的SMS不断地执行这个监视以检查(Ap:CausalNet()satisfiesAp:ALLEOPs())是否保持为真。
[0811] 在紧跟图2的段落中定义了通过匹配良好的路径连接的两个端口的事务校正和概念。当且仅当在应用Ap中由路径连接的Ap中的所有对的端口是良好匹配的,我们定义Ap:Correct()是有效的。让Ap:Requirements()成为在开始设计之前开发的并且之后更新的应用Ap的设计需求。Ap中事务的校正的定义、Ap:Requirements()的定义、以及事务完TM成的时间期限的规范都是由设计者和实施者通过与TICC -Ppde交互来开发的。当然可能的是,(Ap:CausalNet()对于给定的运行中的实施成立,但是实施是不正确的。为了避免这种可能性,我们期望如下的有效标准对于实施保持为真:
[0812]
[0813] 很明显,(6.44)的真实性依赖于对于Ap有效的那组CTL断言。因此,(6.44)和如上定义的校正的概念,Ap:Correct()的概念在如下方面定义了有效标准,即它被用来选择对于给定的实施应该被有效的那组CTL断言。对于我们展示的简单例子验证的CTL断言对于这些实施满足(6.44)。由(6.44)和Ap:Correct()的定义来引导对于其有效性建立实施Ap的校正的那组CTL断言的识别。我们假设设计者将会做这些。
[0814] 很明显,如果系统的实施的验证导致它满足(6.44),则使用SMS通过动态监视验证这个系统的性能的校正是很有意义的。在这种情况下,可使用使有效的断言作为引导以指定诊断运行时发生的错误的策略,并还可使用使有效的断言来指定自我校正的策略。这些对于未来的研究都是重要的课题。TICC-Ppde的唯一特征在于,它提供了在它的整个存在时间内动态地监视系统性能所需的SMS,并提供了通过CTL断言使系统实施有效的方法。由于所有的有效和校正检查都最终依赖于ALLEOP,因此我们将这里展示的证明称为ALLEOP证明。
[0815] 在有效处理的过程中,当发现匹配时间点,系统可识别关于ALLEOP不可比较的事件,但是应该是对于CTL断言同步的(在相同时间发生的)或调整的(一个事件总是发生在另一事件之前)。即使同步和调整不对其中发生事件的任何验证后的CTL断言取反,一对事件应该是这样的同步或调整的候选。我们在下一个子部分中介绍自组织(ad hoc)同步TM和调整方法,当需要时,在TICC -Ppde中使用ad hoc同步和调整方法以将所需的同步和调整引入到已经完成的实施当中,而无需重新编程并行线程。
[0816] 在TICCTM-Ppde中系统实施的主要任务不是编程,编程的并行线程和条件相对而TM言是繁琐的机械任务。困难的主要任务在于,(i)设定TICC 网络;(ii)定义TIP;(iii)TM
特征化所需的并行线程;和(iv)识别要被有效的CTL断言。TICC 网络的结构提供了其中TM
替代的组织可以被测试和被利用的媒介。TICC 范例将系统设计和实施的艺术从编程艺术转移到识别所需的子系统、指定子系统之间的交互和证明校正的艺术。
[0817] 6.6限制测试和Ad hoc调整及同步
[0818] 限制测试:ECT的支路树和时间点的部分顺序可用来验证各种类型的有用系统属性。用于证明实时系统的一个有用属性在于,无论TIP执行时间如何变化所需的时间点的部分顺序总是被预留。这是通过限制测试来完成的。
[0819] 对于在端口C.p的TIP,定义了时间范围,(τpmin,τpmax):τpmin是从时间消息被p传递到p开始在p完成TIP的执行所需的最小时间间隔,而τmax是所需的最大时间间隔:
p p C C
τmax<(τmin+2Δmax),其中,Δmax是端口C.p的父蜂窝C完成一个轮询周期并利用即将达到的消息服务所有的端口并返回到服务端口C.p所需的最大时间。如果C在一个轮询周C
期中错过C.p处的消息并在下一个轮询中捕获它,则这将会发生。2Δmax在这里被使用,这是因为C.p可能是在下一个轮询周期中服务的最后一个端口。
[0820] 假设存在两个迹线,一个指向端口C.p而另一个指向端口D.q,而蜂窝C和D没有p p q q通过任何的因果链相连接。要求分别在端口C.p和D.q处一对事件X(t)和X(t)的发生p q p
总是使得(t <t)。使得(p[0],…,p[r-1]=C.p)成为指向X 的因果链中的端口,而q
(q[0],…,q[m-1]=D.q)成为指向X 的因果链中的端口。使得tn(p[0])和tn(q[0])成p[j]
为将第n个消息分别传递到端口p[0]和q[0]的时间;τ max是完成q[j]:tip()的执行p q p q
所需的最大时间;而t 和t 是事件X 和X 发生的时间。随后对于该对端口序列如下的应该保持为真:
[0821] tp ≤ (tn(p[0])+ ∑ {τp[j]max|0 ≤ j < r}) < (tn(q[0])+ ∑ {τq[i]min|0 ≤ iq<m})≤t (6.45)
[0822] 因此,我们需要Xp和Xq应该是周期同步的。
[0823] Ad hoc调整:让我们假设条件(6.45)不满足。如何无需作大量的重新编程即可实现它?具体的,让我们假定具有通过实施的ALLEOP中的因果链没有彼此连接的端口C1.f1和C2.f1的两个蜂窝C1和C2。假设系统的正确操作需要仅在执行了C1.f1处的TIP之后应该执行C2.f1处的TIP。让我们将这个需求编写为TM
这个问题可利用大量生成和端口矢量在TICC -Ppde中方便地解决,这如图16
所示。
[0824]
[0825] 图16:说明ad hoc调整
[0826] 假定两个其它的端口C1.g和C2.f2,定义了[C2.f1,C2.f2作为端口矢量并安装将C1.g连接到C2.f2的支路,这如图16所示。现在,仅在C2.f2从C1.g接收到信号之后C2才服务C2.f1处的消息。在执行了C1.f1:tip()之后,C1.g发送这个信号。C1.f1和C2.f1处的TIP具有如下的格式,
[0827] (C1.f1:mR?()&C1.g:pR?()*){C1.f1:r().s();C1.g:s()}
[0828] (C2.f1:mR?()&C2:f2:mR?()*){C2.f1:r().s();C2.f2:s()} (6.46)[0829] 利用这个,C1:f1和C2:f1将会是周期同步的而需求总是可以被满足的。实际上,这个安排可以用来不仅调整成对的端口,还可以用来调整周期同步化分组至分组的交互。在部分7中描述了利用分组至分组的信号交互,如下
[0830]
[0831]
[0832] 图17:Ad hoc同步
[0833] 这里,为了包含所需的周期同步在实施中仅需要作的修改是,(i)设定所需的分组至分组路径;和(ii)改变TIP定义。剩余的实施可维持不变。这里的安排非常类似于在异步硬件系统中使用时间信号来调整子系统活动的方式。
[0834] Ad hoc同步:在TICCTM-Ppde中,不同蜂窝的轮询周期彼此之间不是同步的。然而,有时必须同步化没有通过路径链彼此连接的且没有在蜂窝分组中的端口的服务。我们将它们称为孤立的蜂窝。因此,对于孤立的蜂窝Cj,其中0≤j<n,期望实现同步,
[0835] [●→(C0.f:tip(),…,Cn-1.f:tip())(t)] (6.48)[0836] 这是通过安装如图17所示的自我闭环的路径来实现的。端口Cj.g与蜂窝Cj相连接而每个端口Cj.g与图17所示的自我闭环的路径相连接,其中0≤j≤n。每个Cj.f处的TIP具有如下的格式,
[0837] Cj.f:mR?(){Cj.g:s();Cj:g:mR?()*{Cj.f:r().s()}}. (6.49)[0838] 这里,每个蜂窝Cj.g一旦经由Cj.f接收到消息时立即通过自我闭环路径向自身发送信号。仅在所有的蜂窝Cj经由它们各自的端口Cj.g发出信号(在部分7中描述了用于这个的协议)之后,同步的信号才通过代理a0传递到所有的Cj.g。每个Cj在接收到这个同步的信号之后立即在它的端口Cj.f响应已接收到的消息。在图17中与代理a0相连接的其中一个蜂窝可以具有全局时钟。在这种情况下,所有的蜂窝将会与全局时间同步地在端口Cj.f响应它们各自的消息,或是系统中的任何其他的事件。这非常类似于使用时钟的交汇技术,但是复杂得多:同步化机制不必须被编程为并行线程,仅必须安装自我闭环的网络和修改TIP。
[0839] 这里在思考后作出同步和调整。这些种类的ad hoc同步和调整不能在π微积分中、在施动者系统中、在CSP中或任何其他当前可以利用的并行编程范例中无需作出大量的重新编程而实现。我们将会在这个部分中总结出关于包含任意数目的节点的NFSPALLEOP的一些评述。
[0840] 6.7动态成长的非有限状态ALLEOP的例子
[0841] 在图18中示出了这样的一个简单网络。它具有n个蜂窝。每个蜂窝C[i],0≤i≤n与csm(通信系统管理器)相连接。当蜂窝被安装时,从蜂窝的被分配的csm端口(总端口的子类)自动地设定到它的相关联csm的私有路径。需要动态地安装新的蜂窝或路径的任何蜂窝通过调用合适的cell:installCell(…)和cell:installPathway(…)方法会将服TM务请求消息发送到它相关联的csm。这些方法都是由TICC -Ppde系统提供的。蜂窝X会向它的csm发送用于破坏X或破坏路径的请求。蜂窝使用csm来安装其他的蜂窝和路径,这是因为这些是昂贵的操作,需要花费100至250微秒。在经由它的csm端口向csm发送请求之后,蜂窝可继而服务它的其他端口并返回csm端口以确保轮询周期来接收来自csm的响应并采取合适的已经编程的动作。只有当所请求的蜂窝具有合适的特权时,csm才服务请求。在任何情况下,csm都将响应信息发送回到所请求的蜂窝。
[0842]
[0843] 图18:具有NFSP ALLEOP的网络
[0844] 当应用开始时,图18中的网络仅包含蜂窝C[0],X和csm。X通过向它的功能端口C[0].f发送消息来激活C[0]。开始时,如图18所示,C[0]的csm端口被调谐到代理a1。当被激活时,作为它的初始化的一部分,C[0]请求它的csm安装C[1],并经由路径将它的端口C[0].g连接到C[1].f。当C[0]从csm获得已经完成任务的响应时,它将C[0].csmPort从代理a1断开连接,经由C[0].g将消息发送到C[1].f,随后暂停自己,由此释放它的分配的CPU。发送到C[1].f的消息包含在下面将由C[1]所使用的条件。
[0845] 发送到C[1].f的消息激活C[1]在其中一个可利用的CPU中运行。当被激活时,C[1]按照顺序作相同的事情,将它的csm端口调谐到代理a1,安装并激活下一个蜂窝C[2],随后将C[1].csmPort从a1断开连接,并随后暂停自己,除非在接收到的消息中的条件停止它这样做。因此,每个最新安装的蜂窝继续安装并激活另一个蜂窝并暂停自己,除非是接收到的条件阻止它。这导致网络成长直到条件停止它。
[0846] 当条件停止成长时,假设在蜂窝C[n],n≥1,C[n]没有安装新的蜂窝,而是通过向C[n-1].g发送回答来响应它在端口C[n].f处接收到的消息,并随后破坏它自己,由此释放它的分配的CPU。在来自C[n].f的响应消息被传递到C[n-1].g时,C[n-1]在其中一个可利用的CPU中继续它的被暂停的操作,重复C[n]所作的动作。因此,每个新安装的蜂窝逐个地完成它的事务并破坏它自己,直到C[0],X和csm是在网络中剩下的唯一的蜂窝。此时,C[0]经由它的端口C[0].f响应它初始从X.g接收到的服务请求,并由此完成了事务。
[0847] 在这个例子中示出定义的细节并不重要,即蜂窝和路径、TIP、ALLEOP和迹线的动态生成和构造的设施。值得注意的是,在迹线中将会发生如下的因果序列。它开始于由X.g向C[0].f发送的消息,继续到C[n].f,并随后开始颠倒处理。因果链如下所示:
[0848]
[0849] 设定‘X.g’=‘g’,‘C[i].f’=‘fi’和‘C[i].g’=‘gi’,其中0≤i≤n,(6.50)被缩减为,其中n>0,
[0850] gSf0D[(g0Sf1D)(g1Sf2D)…(gn-1SfnD)][(fnSgn-1D)(fn-1Sgn-2D)…(f1Sg0D)]f0SgD (6.51)[0851] 现在设定gSf0D=α,giSfi+1D=βi,fi+1SgiD=βi-1,其中0≤i≤n和f0SgD=α-1,我们获得基于上下文的序列,
[0852] α[β0β1…βn][βn-1…β1-1β0-1]α-1,n≥0, (6.52)[0853] 因此,对于这个的ALLEOP明显不是有限ALLEOP,然而它具有有限的描述。我们通常认为与动态网络相关联的ALLEOP是一般递归的。
[0854] 我们现在继续展示分组至分组消息传递协议,该协议包括(i)用于生成当与应用并行地运行时关于应用的动态成长的因果网的SMS设备;(ii)用于数据从属安全检查的设备,其中消息仅被传递到满足先验指定的安全需求的端口;和(iii)用于自动同步和调整的设备。
[0855] 7.分组至分组通信和自我监视系统的协议
[0856] 利用ALLEOP通过ECT评估证明CTL断言,并且用于自我监视系统(SMS)的嵌入式TM TM设备是TICC -Ppde的集成部件。它们对于TICC -Ppde都是唯一的。如果不讨论SMS的基本架构是如何与消息交换协议集成的,这样的展示是不完全的。我们以分组至分组Das路径的变例作为例子在这个部分来进行展示。
[0857] 对于dm路径,分组至分组消息交换将来自计算网格的一个多处理器中的端口分组中的总端口的父蜂窝的服务请求传递到该网格中的其他不同的多处理器中的功能端口的不同端口分组。由功能端口分组以复用模式顺序地发送响应消息。响应消息是由发送规定的服务请求的总端口分组一起收集的,如果接收到的消息彼此之间不一致则请求重新计算。在网格中的每个多处理器动态地安装仅与在多处理器中操作的蜂窝一致的SMS因果网。Dm路径使用4状态硬件代理、4状态软件端口,并且还使用硬件路由器和交换机。因此,协议比这里描述的这个更加复杂。
[0858] 我们对于sm路径中的三种模式的消息传送提供了三种模式的完成信号:s用于发送模式,f用于转发模式,而h用于挂起计算的挂起模式。挂起模式仅由总端口使用。在挂起模式中,不发送服务请求消息并且路径是被拆卸的。蜂窝通过经由虚拟存储器M的便签式存储器交换信息来调整它们发送的信号的类型。
[0859] 如上所述,在共享的存储器环境下,在发送模式中而不在转发模式中切换路径的虚拟存储器的读取/写入存储器。由TIP确定的发送和转发之间的选择,可以基于由并行线程设定的布尔旗标。并行线程应基于TIP是转发消息还是发送消息将要被发送的消息写入到读取或写入存储器当中,并如果需要则设定合适的布尔旗标,以使得TIP作出正确的选择。因此,并行线程和TIP应该在它们所作的方面彼此一致。在分布式存储器消息交换中,不存在转发模式或挂起模式,而是存在数据信号e和取消信号a的结束以拆卸路径并使得网络路由器和交换机回到它们的活动状态,等待用于开始新的路径建立处理的新的信号。
[0860] 在图19中示出了分组至分组消息流动的修改后的Das路径。在总端口的分组G=[g0,g1,…,gn-1]和功能端口的分组F=[f0,f1,…,fm-1]之间交换消息。路径具有四个代理:a0,a1,a2和a3。它们通过如图所示的h分支彼此相连接。所有的四个代理都附接到虚拟存储器M上。为了使得图示清楚,如图19所示,a2和a3偏离地附接到M上。代理a0调谐到端口分组G,a1调谐到端口分组F,a2调谐到功能端口eb.f1而a3调谐到作为事件构建器蜂窝的eb蜂窝的功能端口eb.f2。代理a0.nxt=[a1,a2]并且a1.nxt=[a0,a3]。功能端口矢量[eb.f1,eb.f2]附接到eb蜂窝。我们很快将会看到由这个蜂窝执行的任务。每个eb蜂窝可服务几个不同的路径,其中每个路径通过功能端口矢量中的独立成对的端口和诸如图19所示的端口[eb.f1,eb.f2]和代理a2,a3的相关代理彼此相连接。应用可具有几个这样的eb蜂窝。
[0861]
[0862] 图19:具有自我监控的分组到分组SM路径
[0863] 端口分组G和F中的每个端口都关联于将消息从图19所示的路径的一端传递到另一端所需的协议。当端口分组中的端口的父蜂窝完成了它的计算并准备发送消息时,蜂窝开始执行与端口相关联的协议。因此,端口分组中的端口的所有父蜂窝将在相互不可比较的时间点并行地开始评估它们各自的端口处的协议。路径上的代理调整消息发送。
[0864] 图19中的代理ai,i=0,1,具有对它定义的三个属性:一个是ai.selectedPort,它可以是调谐到ai的任何端口,第二个是布尔属性,ai.dC(‘dC’表示‘传递完成’),它初始化为假,而第三个是被称为完成信号矢量ai.csV的矢量。它具有调谐到ai的每个端口的一个矢量分量以存储从该端口接收到的信号和用于从ai.nxt[1]接收到的信号的一个部件。每个部件假设四个可能的值中的一个>0:ai.csV[j]=(c|f|h|ignore)>0,其中0≤j<ai.csV:size()-1,c用于发送,f用于转发,而h用于挂起;这些信号是由调谐到ai的端口发送的。最后一个部件,ai.csV[ai.csV:size()-1],存储由ai.nxt[1]发送的信号c。存在有第四信号,ai基于在消息发送过程中计算得到的条件使用该第四信号来设定ai.csV[j],其中0≤j<ai.csV:size()-1,以指示对应于j的端口应该被忽略。我们很快将看到ai.csV的部件如何被使用。
[0865] 我们假设G中的总端口正在向F中的功能端口发送联合服务请求。总端口分组是[Ci.gi|0≤i<n-1],其中n-1=G:size()而a0.csV:size()=n。图19中的总端口分组G中的每个Ci.gi中的协议具有如下所示的格式(我们使用‘.’来指定协议的连续序列分量的串联)。Ci.gi:protocol()具有两个串联的分量,Ci.gi:prefix()和Ci.gi:suffix()。下面的语句(7.2a)描述了Ci.gi:prefix()将会作什么。我们下面将会看到Ci.gi:suffix()将会作什么。下面,m-1=F:size()而a1.csV:size()=m。
[0866]
[0867] 当父蜂窝Ci准备发送消息时,它与分组G中的其它端口的父蜂窝并行地执行Ci.gi:prefix()。这样的并行执行不是同步的;不同的父蜂窝Ci在不同的时间可做这个。当执行Ci.gi:prefix()时,如果它尚未被设定,Ci首先设定a0.selectedPort=C0.g0;如果它们尚未被初始化,则初始化矢量a0.csV和a1.csV;这些矢量的最后部件不被初始化。Ci随后设定a1.dC=false,如果它尚未为假。两个或更多的Ci可同时执行这些初始化。不存在相互干扰;这里不需要并行线程锁。
[0868] 在初始化之后,每个蜂窝发送三个可能的完成信号中的一个xi=c|f|h>0到他的端口Ci.gi并且端口将这个信号转发到a0。在这之后,Ci评估表达(a0.
selectedPort≠Ci.gi)?(){a1:dC?()*{};}。这导致除了a0.selectedPort的父蜂窝之外的所有其他蜂窝Ci等待直到a1:dC变为真;由此它们停止继续执行协议。当a1.dC变为真时,每个蜂窝Ci以它的服务顺序开始服务它的下一个端口。同时,在a1.dC变为真之前,当所有其他的蜂窝等待a1:dC?()变为真时,a0.selectedPort的父蜂窝C0开始执行C0.g0:suffix();这将会是执行C0.g0:suffix()的唯一蜂窝。
[0869] 代 理a0将 会 期 望 从 每 个Cj.gj∈ G接 收 到 完 成 信 号xj> 0,其 中a0.csV[j]≠ignore,并且从a0.nxt[1]=a2接收到一个信号c,其中a0.csV[n-1]>0。当a0从端口Cj.gj接收到信号xj>0时,它将会得知蜂窝Cj已经完成了它的运算。当它从a2接收到信号,c>0时,它将会得知在通过相同路径完成先前消息交换的过程中eb做了什么。这些信号成为保护间隔的变量,(7.2b)中的a0:AP1(a0.csV[0…n-1])?()*。C0执行这个保护间隔,这是因为只有蜂窝仍继续执行协议。仅当它的所有部件都大于0时,即它已经接收到所有期望的完成信号之后,保护间隔评估为真。重复地执行直到它变为真。当它变为真时,a0.selectedPort的父蜂窝C0执行C0.g0:suffix-body()。在G中对于所有总端口后缀体都是相同的。因此,哪个总端口被选择为选择的端口无关紧要。我们将会看到后缀体将会做什么。在定义gi:suffix-body()之前,我们必须定义更多的变量和方法。它们与sm路径中的代理和端口相关联。我们现在做这个。
[0870] 安全规范:下面,a1.M是指附接到a1的虚拟存储器。只有当端口Dj.fj满足指定的安全条件时,即a1:Sy(Dj.fj,a1.M)?(),其中0≤j<m-1=F:size(),代理a1将消息传递到转向它的端口Dj.fj。如果对于任何j,a1:Sy(Dj.fj,a1.M)?()为假,则设定a1.csV[j]=ignore,即忽略第j个端口。用户可对于不同的路径定义不同的安全功能(系统具有两个默认的安全定义:在一种定义中,F中的每个端口都接收消息。在这种情况下,不存在安全检查。在另一种定义中,定义了安全级别M.security,
安全模式M.rd:msg().mode,以及对于每个f∈F的安全级别f.security。当且仅当M.security≤(f.security+M.rd:msg().mode)时,M中的消息被传递到端口f。通过设定M.rd:msg().mode为高,由此将消息传递到低安全的端口,蜂窝具有特权。仅当它具有必要的特权时,蜂窝可请求其他的蜂窝或路径被动态地安装。蜂窝可临时地将它的特权委托给另一蜂窝。这种安全系统可内嵌到原型TICC和TICC-Ppde当中)。当消息被传递到所有的安全端口时,将变量a1.dC设定为真。
[0871] 其他路径变量和方法:变量a0.ccS保持由下面(7.4-(i))中使用的第二协定协议方法计算得到的合成完成信号(ccS)的值。在(7.3)中定义了AP2。在(7.4)中使用了方法a0:resetPathway()来将其中出现a0的sm路径复位为它的初始状态。方法exception(f)在端口f∈F发出意外以警告观察者在这个端口发生的安全故障。方法a0:swMem()切换a0的读取/写入存储器。方法f:timeStamp()在f的父蜂窝的本地时间下设定f处的时间戳,这指示什么时间消息被传递到f。条件f:active?()检查f的父蜂窝是否已经运行在CPU中;方法f:activate()激活在可利用的CPU中的f的父蜂窝。如上所述,TICC-Ppde自己管理所有的CPU分配和蜂窝激活。
[0872] 我 们 准 备 定 义 gi:suffix-body():它 使 用 了 第 二 协 定 协 议 功 能,a0:AP2[a0:csV[0…n-2]]。注意到,这在其中不包括从代理a2接收到的信号a0:csV[n-1]。它仅检查a0从G中的总端口接收到的完成信号,并设定合成完成信号a0.ccS=
a0:AP2[a0.csV[0…n-2],其中
[0873]
[0874] 注意到,作为来自a2的完成信号的a0.csV[n-1]在这里不使用。现在我们展示gi:suffix-body()并讨论它将做什么。
[0875]
[0876]
[0877] 相同的后缀与每个gi∈G的关联简化了对于端口分组G的动态改变的调整;在新的事务开始之前可动态地将端口追加到G或是从G中删除。现在让我们考虑gi:suffix-body()所做的:
[0878] (7.4-(i)):如果(a0.ccS=h),则复位路径并将a1.dC设定为真。在这种情况下,不发送消息。如果(a0:ccS≠h),则C0开始执行从(7.4-(ii))开始的其余协议并在这个执行的结束将a1.dC设定为真。发生如下的:
[0879] (7.4-(ii)):首先执行安全检查并利用不安全的安全端口的忽略信号更新矢量a1.csV,并且生成意外(用于通知安全故障的消息)。如果所有的功能端口都是不安全的,则协议执行被放弃。否则,它将继续。
[0880] (7.4-(iii)):首先,复位之前从a2和a3接收到的a0:csV[n-1]和a1:csV[m-1]中的信号。代理a0随后做如下的:如果(a0.ccS=c)(见(7.3)),则切换读取/写入存储器,将开始信号s发送到a1,并将信号c传递到eb.f1;否则,不切换读取/写入存储器,将转发信号f传递到eb.f1,并将信号s发送到a1。在任何一种情况下,在eb的本地时间下设定信号传递时间戳。这个时间戳被eb蜂窝解释为消息发送的时间,在下面的(7.6)中被称为eb.ts。由于所有的eb蜂窝是与全局时间同步的,因此这个消息发送时间也是全局时间。
[0881] (7.4-(iv)):它首先检查对于每个安全的功能端口f[j]∈F,它的父蜂窝是否已TM经被激活。如果没有,则它激活父蜂窝。TICC -Ppde中的激活相对而言是昂贵的。它花费大约2.5微秒在2GHz的计算机中激活蜂窝(由Rajesh Khumantham先生来实施用于管理TM
处理和并行线程激活的TICC 子系统)。这是描述从(7.3-(iv))中分开这个操作的语句的原因。通常,激活仅执行一次,消息被首次传递到端口;分开这部分使得传递信号以快速的持续被发送到所有的安全端口。在将传递信号发送到所有的安全端口之后,利用时间戳将信号s经由代理d传递到端口eb.f2,并随后将a1:dC设定为真;eb将这个时间戳解释为由(7.6)中eb.td表示的消息传递时间。
[0882] 如果CCP是以机器指令实现并且硬件辅助可用于设定时间戳,则信号被传递到在(估计的)2GHz的CPU中的连续端口之间小于3纳秒分隔的安全端口(利用软件中实施的CCP,无时间戳对于每个端口的每个信号传递它花费大约3纳秒。这是通过执行在每个环路周期中将信号传递到四个端口的环路测量的,复位信号并重复环路一百万次。一百万次重6
复花费的总时间被4×10 除以获得每个端口对于信号传递所花费的平均时间。C++优化器TM
在这个测试过程中被关闭。时间戳设备在原型TICC -Ppde中不可利用)。对于每个安全的功能端口f,在端口f处设定的信号传递时间戳是它的父蜂窝的本地时间。当对于所有的安全端口完成了消息传递时,或当放弃了协议执行时,a1.dC被设定为真。可由功能端口的父蜂窝来组织被传递的消息的处理以便仅在a1:dC变为真之后,即仅在消息被传递到所有的安全功能端口之后才开始。这是通过如下修改f:mR?()和g:pR?()来实现的:
[0883] {(t)}[●→f:mR?()(t)]{(true & f:state=S)(t’)}
[0884] {<(g:input=s∨g:state=S) & a0.dC=true>(t)}[●→g:pR?()(t)]
[0885] {(t’)}. (7.5)[0886] 同时,当eb在本地时间eb.ts和eb.td下分别感应到eb.f1处的信号c|f和eb.f2处的信号s时,它安装与分组至分组消息传递相关联的如下的通信事件:
[0887] C.giS|F(eb.ts)for(0≤i<n),and(eb.td)for(0≤j<m) (7.6)[0888] 如在等式(5.21)中指定的一样,并在与因果网相集成之后,通过在eb.f1和eb.f2处分别执行如下所示的协议,向a0和a1两者发回完成信号c:
[0889] (eb.f1:c→a2:c→a0)and(eb.f2:c→a3:c→a1). (7.7)[0890] 所有的这些都是当图19中的功能端口Dj.fj的父蜂窝正在处理对于刚传递给它们的服务请求的响应时所做的。由于不存在两个eb蜂窝在成长的因果网中的相同地点安装通信事件,因此当它们并行地执行它们的活动时在不同的eb蜂窝中不存在相互干扰。
[0891]
[0892] 由于eb蜂窝可访问虚拟存储器,因此它可访问a1.csV并识别消息被传递到的功能端口。利用ALLEOP,它可确定事件实例应该被安装的成长的因果网中的地点。利用这些数据,eb蜂窝将通信事件安装到因果网当中。在图20中示出了要被安装到因果网中的因S果网片段。这里gi 的分派时间被设定为ts,其中0≤i<n-1,即信号被传递到eb.f1的时间。到功能端口的传递时间表面上被记录为td,即信号被传递到eb.f2的时间。图21显示S S
了对于答复消息发送而安装的网络。如果消息已经被转发,则图20和图21中gi 和f1 的S F
上标 将会变为 。
[0893] 注意到,eb蜂窝根据它对于ALLEOP的知识可期望消息发送和消息传递事件实例。实际上,如果期望的事件节点没有处在先验指定的时间期限内,则不停地监视成长的因果网的与eb蜂窝并行的ea蜂窝(事件分析器蜂窝,下面将会描述)将会向观察者发出关于可能的系统故障的错误报告。由于eb蜂窝可访问与eb.f1和eb.f2相连接的路径的虚拟存储器,因此当安装事件实例时,它甚至可以检查在消息发送和接收蜂窝中保持为真的迹线中的条件。然而,这会不当地延迟的消息发送并且在运行时间中不是实际的。但是,这可以在测试模式下做出。
[0894] 当接收到服务请求的F中的功能端口的父蜂窝感应到功能端口处的消息传递信号时,通过向a1发送c|f信号,它们执行相关联的并行线程和协议以发回响应消息。此时,a1仅期望来自端口eb.f2和来自所有的安全功能端口的信号,这是因为对于不安全端口在a1.csV中已经设定了忽略信号。用于发回(转发)答复消息的协议类似于在(7.1),(7.2a),(7.2b)和(7.4)中示出的协议,具有如下的不同:a1:selectedPort被设定为a1.csV中的第一安全端口,即第一端口fj∈F,其中a1.csV[j]≠ignore。对于向G中的总端口传递响应不做安全检查;G中的每个端口都接收响应。
[0895]
[0896] 图22:在图21和22的事务中由eb蜂窝安装的因果网片段
[0897] 在响应消息的传递过程中,如(7.7)所述,仅在a1从所有的安全端口D.fj接收到完成信号并从a3接收到完成信号之后,a1才向a0发送信号s并向a3发送信号c|f。代理a3将信号c|f转发到eb.f2以通知eb响应消息正在被分派到G中的总端口。在将响应消息传递到总端口之后,a0向用于将信号转发到eb.f1的a2发送信号s以通知eb响应消息已经被传递回到G中的总端口。当eb在端口eb.f1和eb.f2处感应到这些信号时,它在成长的因果网中的适当地点对于每个安全的fj安装图21所示的通信事件实例。在完成这个安装之后,eb利用(7.7)所示的协议经由eb.f1和eb.f2向代理a0和a1发送完成信号c。在图22中示出了图20和图21的组合后的因果网片段。
[0898] 我们已经关于代理a0,a1和端口g和f(见图1至图4)讨论了ndFSM。sm路径中的所有代理和端口都是相同的2状态ndFSM。很明显,协议对于点对点通信而言更加简单,这是因为不存在选择的端口并且ai.csV都仅具有两个部件,其中i=0,1。协议最多使用(6+m-1)个CCP,其中m-1是F中端口的数目。这并不计数由Ci.gi的父蜂窝并行地执行以向a0发送完成信号的第n-1个CCP。分组至分组通信相对而言是昂贵的,但是仍比传统的分组至分组通信便宜很多。
[0899] 如上所述,应用在它的网络中可具有几个eb蜂窝。没有两个eb蜂窝将服务相同的sm路径。除了eb蜂窝之外,应用还具有几个ea蜂窝和事件分析器蜂窝。ea蜂窝用于检查成长的因果网和ALLEOP之间的一致性,并查找在因果网中的先验指定的事件模式的发生以警告观察者关于这些发生。在大多数情况下,将由使用ALLEOP节点作为终端符号的常规表达指定所关注的事件模式。TM
[0900] TICC -Ppde的这种方式的使用需要处理单元(CPU)的实际上不加限制的提供。随TM着多核芯片和
纳米技术的发展,所需的CPU很快应该可以利用。TICC -Ppde不仅提供了利用任意数目的处理单元的自然环境,而且还可有效地使用可利用的处理单元来自动地构建每个应用的自我监视系统(SMS)。当应用运行时,ALLEOP指定将发生的事件模式。与指定模式的偏差将会被SMS解释为错误。当然在计算值是错误的时因果网中的事件模式可以是正确的。然而,如在部分6.5中讨论的,通过在实施过程中和实施之后生成的正确性证明来排TM
除这种可能性。这些特征对于TICC -Ppde是唯一的(在这点上是值得怀疑的。某天我们可TM
能会实施“理解”它们做什么的软件系统。这里,我们怀疑这样的软件系统应该在TICC -范例中的SMS的上下文中的能力。这需要基于在它们当中构造的一组通用
种子模式将所关注的在因果网中发生的因果链的学习模式的通用能力包含在事件分析器蜂窝(ea蜂窝)当中。学习将会特殊化并细化种子模式。Ea蜂窝可通过与它们的环境的交互和与应用自身的交互来做这个。当然,ea蜂窝还需要代表所学习的模式的能力。出于这个目的,它们使用了用于定义种子模式的相同类型的语法。这些语法将会使用ALLEOP节点作为非终端符号。
可将这些模式想象为所关注的并指定了在应用中发生的活动的因果网的概要。甚至具有模式的模式概要等级。当系统识别出这些模式的发生时,使用它们来通信并引导它自己的计算,并细化它们,系统性能可表明类似于“理解”。这种能力对于构建可诊断并修复它们自己TM
的系统而言是必需的。长远来看,它们导致了自我理解的软件系统。TICC 范例中的SMS提供了用于调查这样的系统的设计中的问题的上下文。我们假设我们的大脑皮层可在大脑中作出这种类型的动态样式分析。进化已经使得我们构建了具有特定的内部种子模式:用于面部识别、声音识别、气味识别、运动识别、
手指调整、振动感应、手/眼调整、以及腿/身体调整的样式都是这样的种子模式的例子。识别出的模式动态地控制内部和外部的有
机体的行为,还控
制模式自身是如何细化的。生物学家同意,甚至处于原始形式的内部能力对于种群生存具有重大的影响。它们广泛地分布在各种类型的昆虫和动物种群当中。利用学习,这些内部能力被改善并被特殊化并导致我们在自然界所看到的令人眼花缭乱的大量展现。
学习能力随着种群而变化。当人类看到图像时,在人的整个大脑中发生事件。我们假设,所看到的图像的识别是一个连续的处理,该连续处理是当图像被看到时作为通过大脑皮层在大脑中动态识别正在进行中的事件的因果链的样式的结果而发生的。这里,识别出的模式与上述这些处理并行地影响并引导正在进行的识别处理。因为已经存在有为解决这个问题的许多
模式识别工作,因此不能以事件或模式的组合聚类的方式来描述这些类型的识别处理[Francis Crick,47])。
[0901] 7.1单向环型道路
[0902] 至此我们使用了这样的约定:答复通过与服务请求被发送路径相同的路径被发送。有时,当由不同的其它蜂窝中的一个蜂窝大量生成不同的序列计算时,这有助于复杂化并行线程并增多与蜂窝附接的端口的数目。也有助于降低序列计算的效率。图23中的修改后的Das路径避免了这个问题(在这个附图中没有示出利用eb和ea蜂窝的SMS的路径变量,以便使得附图变得简单)。
[0903] 这里,图23中的总端口分组G1中的端口向功能端口分组F1中的端口发送它们的联合服务请求消息。当G1作出这个时,它的端口获得复位以接收答复。它将会从F3中的端口接收这个答复。F1中的端口接收由G1中的端口发送的请求,并向F2中的端口发送它们的联合答复,该联合答复被视为另一服务请求。当F1作出这个时,它的端口获得复位以接收来自G1的下一个服务请求消息。图23中的经由路径环路的消息顺
时针流动,直到G1中的端点端口接收到来自F3中的端口的应答。仅在G1已经从F3接收到这个应答之后,G1才向F1发送它的下一个服务请求。可向图23中的虚拟存储器附接任意多个代理。我们将图23中的修改后的Das路径称为复合的sm路径,这是因为它具有一个虚拟存储器及与它相关联的几个代理。这种配置对于在并行网络中执行序列计算是有帮助的。当它们处理接收到的消息时,环绕复合路径的任何一个分组中的蜂窝都可并行地工作。
[0904]
[0905] 图23:单向环路径
[0906] 8.结论性评述
[0907] 我们这里介绍了组合来自各种其他范例的概念的并行编程范例。TICCTM提供了对TM TM于在并行编程开发中一起工作的必要粘合(glue)和执行平台TICC -Ppde。TICC -Ppde提TM
供了如下方法:(i)定义并行处理TICC -网络;(ii)利用TIP和CIP概要地指定了这些网络的部分之间的交互;(iii)通过并行线程的连续细化完成了实施;(iv)从实施中自动地获得ALLEOP模型;(v)利用动作特征化从ALLEOP模型自动地获得迹线;(vi)从迹线构建ECT网络;(vii)在FSP和NFSP等级上使用ECT网络来产生实施的有效属性的交互证明,被声明为CTL断言;(viii)将运行时间自我监视系统(SMS)自动地包含在每个完成的实施TM
中;和(ix)执行限制测试和ad hoc同步和调整。(x)TICC -Ppde需要并使用大量的处理单TM
元。它提供了对于在与TICCNET 集成的多核芯片的分集中高效的开发和运行程序所需的概要和工具。这些对于所有软件系统,特别是对于实时网络物理系统和在任何不可访问的TM
环境下运行的系统的设计、实施、验证及运行而言都是有价值的工具。它们对于TICC -Ppde都是唯一的。我们相信未来所有的软件系统都是并行软件系统。
[0908] 在施动者系统中,理论上在施动者系统的语义的定义中可包括消息交换的语义。当然它可以作出复杂得多的分析。但是在π微积分中,通信的语义不能被包括在微积分的语义中,这是因为不能在π微积分中框架中通过链接定义名称的通信的机制。它必须被假设为给定的原语。
[0909] 在TICCTM-Ppde中,同步和调整被构建到通信系统当中。对于每个消息交换,可在狭窄界限内预测何时消息发送事件开始和何时消息被传递。类似的,可在合理狭窄的界限内对于每个动作事件预测它开始执行的时间和它完成执行的时间。在施动者系统和π微积分中不能做这些。我们通过展示从领域上的一组事件到自身的单调连续映射定义了TMTICC -Ppde的语义,映射是由被有效后的实施定义的。因此,保证仅获得期望的结果。被有效后的实施变为语义定义的一部分。
[0910] TICCTM-Ppde中的TIP交互规范是与π微积分中的交互规范相类似的,区别在于通过与端口相关联的协议在TIP中明确地指定了通信机制。以与CSP相类似的方式将通信TM和计算集成,但是具有更大的复杂度、能耗并与异步通信部件相互隔离。TICC -Ppde是自我同步、自我调整和自我激活的。它们不需要监视器、旗语、调度器、同步器、调整器、线性化器或其他任何附件来正确地作出编程工作。
[0911] TICCTM-Ppde假设任意数目的处理单元的可利用性。如果需要满足在总结中讨论的量化条件,则处理单元的数目可达到几百万个:简单来说,量化条件要求在任何一个轮询周期内由蜂窝服务的端口的数目独立于在系统中蜂窝的数目。在这个标准下在部分6中没有解决方案是可任意量化的。这提供了充分利用由多核和纳米量化技术提供的期望扩展的TM大量处理单元的机会。在TICC -Ppde中提出的编程技术理想地适用于充分利用这样的技术。
[0912] 当前的原型实施尽可能地消除了使用操作系统的需求。理论上,可完全地消除TMTICC -Ppde中的操作系统的需求。我们尚未做到这点。如果CCP作为指令硬件实施并且TM TM
多核芯片通过还与芯片集成的TICCNET 相互连接,则TICC 对于共享存储器和分布式存储器通信两者提供了具有几百纳秒范围内的高速通信的设备。在任意给定的时间内并行地交TM
换的消息数目仅受到在这个时间内在系统中运行的有效蜂窝的数目和在TICCNET 中可利用路径的数目的限制。
[0913] 利用FSP[15]和CTL[40-44]的设计规范的基于模型的验证已经在系统设计中扮演了重要的角色。它们用于证实设计和验证实施应该满足的属性。FSP遇到的问题在于不能通过连续的细化将概要FSP规范直接地转换为实施。这使得必须利用不同的工具证实实施,这种任务与设计证实相比较更加复杂。
[0914] Clark等人[38-40]和[Emerson,41]的基于模型的验证已经验证了硬件设计规范,而非硬件实施,这是因为调整和争竞条件的争议点似乎不构成验证系统的一部分。可是,由Clark等人引入的验证方法被硬件设计者广泛地使用来使设计有效。存在有如GEZEL[Schaumont等人,46]的实现无争竞硬件系统的设计和验证的硬件描绘语言。然而不TM
清楚它们是否正在被广泛地使用。TICC -Ppde规范方法学可用于指定并验证无争竞异步硬件系统的实施。实施的所有定时、同步和调整需求都隐含地成为规范的一部分。在验证TM
过程中需要考虑它们。唯一的局限是部件应该异步地相互交互。这使得TICC -Ppde不适TM
用于验证由同步硬件设计驱动的时钟脉冲。利用TICC -范例的优点在于,期望的计算的概要规范看上去类似于概要设计的FSP规范,但是它们还提供了通过连续细化将它们直接地缩减为实施的方法学。
[0915] 利用TICCTM-范例由此可以组合基于模型的形式验证来使实施有效的优点和已经验证的部分实施的连续细化。除了提供这样的验证能力之外,无论是硬件还是软件,只要部TM件异步交互并且使用基于CCP的通信机制,TICC -范例还自动地将SMS(自我监视系统)TM
包含在完成的实施当中以监视应用的生命周期内的性能。TICC -Ppde将系统开发的焦点从编程转移到网络组织、交互规范和证实上。
[0916] TICCTM-范例中的软件/硬件部件之间的交互模式与它们在传统的并行软件系统、TM时间分割的并发软件系统或同步硬件系统不相同。应该被有效的设计TICC -网络、定义TIP和CIP、开发并行线程的特征化、以及识别CTL断言是重要和困难的问题。它们需要关于训练系统设计者和程序员方式的新方法。不仅应该在编程方面还应该在部件交互分析、逻辑和验证技术方面来训练设计者。
[0917] 这里提出的思想具有开启新时代的计算和软件/硬件工程学的潜力。很可能深远地影响个人使用它们的台式机和笔记本计算机的方式,在科学和技术应用中设计及使用计算机的方式,以及社会、教育、商业和政府组织使用计算机的方式。我们甚至能够生产可保护用户免受隐私泄露和恶意攻击的复杂的有效的自我校正软件。
[0918] 附录I
[0919] OG-解决方案:TIPS,ALLEOPs和迹线
[0920] 环境蜂窝:
[0921] E.i:TIP()=[(i:mR?()&g:pR?()){g:s();/*开始所有蜂窝*/
[0922] i:s();/*对用户的应答*/} (I.1)[0923] 入口十字转门传感器:
[0924] Se[j:0…1].f:TIP()=
[0925] (Se[j].f:personAtGate?()&Se[j]f:mR*?()){
[0926] Se[j].g:s();//signals Et[j].ft
[0927] Se[j].g:pR?()*{Se[j].g.personAtGate=false;}} (I.2)[0928] 当一个人接近门(十字转门)时,在门处的传感器设置Se.g.personAtGate=true。在让这个人进入公园或者因为公园已满拒绝这个人进入之后,这个人离开门。在这一点,入口十字转门的功能端口Et[j].ft发送回答复至Se.g。当传感器接收到该答复时,它将Se.g.personAtGate复位为假。当下一个人来到门口时,传感器再次将其设置为真。由此,第二个人仅在第一个人离开门后才能进入。
[0929] 入口十字转门:
[0930]
[0931] 定义:
[0932]
[0933] 这个判定被用于讨论便利性。仅当信号已经由Se[j].g传递给Et[j].ft并且Et[j]已经感应到该信号时其为真。当Et[j].ft答复Se[j].g时,在对在门口的那个人做出响应之后,Et[j]:personEntering?()自动地变为假,因为Et[j].ft.input=s将不再是真。
[0934] {Et[j].g:mR?()*}[●→Et[j].g:letPersonIn()]{Et[j]:personInPark?()} (I.5)
[0935]
[0936] 出口十字转门传感器:
[0937] Sx[j:0…1].f:TIP()=
[0938] Sx[j].f:personAtGate?(){
[0939] Sx[j].g:s();//信号Xt[j].ft
[0940] Sx[j].g:pR ? ()*{Sx[j].g.personAtGate = false;}} (I.7)
[0941] 出口十字转门:
[0942]
[0943] 定义:
[0944]
[0945] 计数器:如果在公园中有空间,在端口C.f[j:0…1]感应到信号时将计数器加一,即,counter.count<max,并且经过 并对Et[j].g做出响应,给出进入的允许,否则C经过 发送响应以拒绝进入,然后等待响应并且然后通过C.f[j]应
答接收的信号。当蜂窝C开始时,计数器被初始化为零,并且设置max大于零。
[0946]
[0947] 定义:
[0948] {counter.count<max)?()}[●→counter++]{counter.count≤max)?()} (I.15)[0949] {counter.count≤max)?()}[●→counter--]{counter.count<max)?()} (I.16)[0950] 显示单元:当在它的中断端口感应到信号时,将用于计数的请求转发给计数器。当接收到该请求时,显示计数。
[0951] D.i:TIP()=
[0952] D.i:mR?(){D.i:s();D.g:f();D.g:mR?()*{D.g:displayCount().s();}} (I.17)[0953] 定义:
[0954]
[0955]
[0956] 轮询周期:忽略中断端口,除了显示单元之外。
[0957]
[0958] 不需要定义用于蜂窝的CIP,因为它们应该是明显的。从上面的定义可知,系统计算下面的ALLEOP和迹线。
[0959] ALLEOPS:
[0960] Et[j:0…1]:ALLEOP():
[0961]
[0962]
[0963] Xt[j:0…1]:ALLEOP():.
[0964]
[0965] C ALLEOP():计数器ALLEOPs
[0966]
[0967]
[0968] D:ALLEOP():显示单元ALLEOP。这里U是请求计数的外部用户
[0969]
[0970] 注意,在(I.35)中,对于通过D.g接收的消息不需要答复。对于OG-解决方案的组合的ALLEOP是:
[0971] O-Garden:ALLEOP()=
[0972] □(Et[0]:ALLEOP()‖Et[1]:ALLEOP()‖D:ALLEOP()‖
[0973] Xt[0]:ALLEOP()‖Xt[1]:ALLEOP()‖C:ALLEOP())] (I.36)[0974] 迹线:我们现在将描述用于入口十字转门Et[j]的迹线。
[0975] 入口十字转门迹线:下面的迹线是从(I.27)中的Et[j:0…1].ft:ALLEOP()得到的。在部分6.1中的表I中的ECT网络的上面三块中表示这个迹线的信息。表I还表示了在C.f[j:0…1]:trace(cf[j].t0)中的信息和Et[j].ft:trace(e[j]ft.t0)与C.f[j ]:trace(cf[j].t0)之间的交互。建议读者比较下面的迹线和在表I中上面三块中的信息。这将使得读者能够理解迹线和ECT之间的对应性。这将是单调乏味的,但不是复杂的。
[0976]
[0977]
[0978] 从表I和II中的ECT网络可以推导用于本实施的其他迹线。
[0979] 附录II
[0980] PC-解决方案:TIPs,CIPs,ALLEOP和迹线
[0981] 这里我们通过定义用于实施中的所有蜂窝分类的CIP而描述实施。在这个例子中更容易这样做。此外,示出了定义实施的不同
风格。
[0982] 生产者CIP & TIP:
[0983] 在初始化之后,在每个轮询周期中,生产者P[j]在它的中断端口P[j].i寻找信号。如果在P[j].i存在信号,那么P[j]终止它的操作。否则继续轮询它的端口P[j].f,每次它在P[j].f感应到信号并将其发送至分发者的端口D.g[j]时,产生新的产品,如在(II.2)中P[j]:tip()所示。
[0984]
[0985]
[0986] 定义:
[0987]
[0988] 消费者CIP & TIP:
[0989]
[0990] 定义:
[0991]
[0992] C[j].hasProduct是在消费者分类中定义的属性。(II.5)中的C[j]:usedUp?()必须以适当的方式由设计者在消费者分类中定义。
[0993] 分发者CIP & TIP:
[0994]
[0995]
[0996] 定义:
[0997]
[0998] ALLEOPs:在下面的ALLEOP中,为了简单的原因,我们省略中断端口轮询、中断消息处理和终止处理。
[0999] Consumer C[j:0…(m-1)]ALLEOP:
[1000]
[1001] 生产者P[j:0…(n-1)]ALLEOP:
[1002]
[1003]
[1004] 分发者ALLEOP:
[1005]
[1006]
[1007] 迹线:我们在这里不展示迹线,因为在部分6.3的表III中的ECT网络中出现了组合迹线。迹线提供的所有信息封装在ECT网络中。
[1008] 附录III
[1009] DP-解决方案:CIPs,TIPs,ALLEOP和迹线
[1010] Btlr CIPs和Tips:Btlr代表Butler分类并且btlr是Btlr的例子。这里我们也忽略中断端口轮询、中断消息处理和开始/停止处理。
[1011]
[1012]
[1013] btlr:response(j)的定义
[1014]
[1015]
[1016] 注意,btlr在感应到中断信号的轮询周期中服务具有未决的服务请求的所有哲学家。仅在所有餐叉都在桌子上之后以及在从所有哲学家接收到他们已经终止的应答之后,终止游戏。在btlr:BODY()中用于while-loop的loop不变量是 其中W[j]表示哲学家P[j]正在等待餐叉。 是死锁状态。在游戏的过程中绝不会达到这种状态。在部分6.4中给出了证明。在Btlr分类中定义了下面表征的所有动作和条件。这里没有对于所有动作示出实施。下面给出它们的特征。
[1017] 定义:Btlr动作和条件的特征
[1018]
[1019]
[1020] 哲学家CIP和TIPs:
[1021]
[1022] 定义:哲学家定义和条件特征,0≤j<5:
[1023]
[1024]
[1025] ALLEOPs:在下文中,“|”分开替代物
[1026] Btlr ALLEOPs:
[1027]
[1028]
[1029]
[1030] 如我们已经提到的,仅在已经服务了所有等待哲学家并且所有哲学家已经停止了吃饭并返回餐叉之后btlr终止操作。
[1031] 哲学家ALLEOPs:
[1032]
[1033] 等待的哲学家仅在他/她吃完之后响应于终止信号。由此,在游戏结束之前,每个哲学家应该已经得到满足。
[1034] 轮询周期:
[1035] btlr:Polling()=[btlr.f[0]:mR?()→btlr.f[1]:mR?()→btlr.f[2]:mR?()[1036] →btlr.f[3]:mR?()→btlr.f[4]:mR?()→btlr.i:mR?()
[1037] →btlr:Polling()] (III.33)[1038] P[j:0…4]:Polling()=[P[j].g:pR()*→P[j].i:mR?()→P[j]:Polling()] (III.34)[1039] 突出的判定&初始状态:
[1040] 在用于TIP的ETC评估开始之前突出的判定的集合被用于指定初始状态。总的来说,突出的判定包括确定要在TIP的选择点进行选择的条件。由此,在这个集合中包括在虚拟存储器中的任何非标准保护间隔和消息的状态。例如,在这个例子中,如果在下一个TIP执行开始之前没有对在功能端口的业务请求做出响应,则在这个集合中包括虚拟存储器中的保护间隔和消息的状态。ECT的符号评估的规则是:如果在初始状态没有指定确定在选择点的选择的判定,或者在ECT评估中早先使用的判定当中没有指定该判定,那么从应该包括该选择点引出的所有因果链作为在符号评估中的可能的替代物。
[1041] 对于DP-解决方案,突出的判定集合包括下面的条件:
[1042] btlr:frksAvlbl?(j),E[j],T[j]和W[j],btlr.f[j]:mR?()和
[1043] btlr.f[j].rd:empty?(),其中0≤j<5. (III.35)[1044] 在部分6.4中定义了哲学家的状态T[j]、P[j]和E[j]。还定义了游戏的公理和它的初始条件。在部分6.4中表示的证明仅要求P[j].g:trace(p[j].g.t0)和btlr.f[j]:trace(bf[j].t0)。在部分6.4中在表IV和V中示出了从这些迹线中得到的ECT网络。为了方便和清楚的目的,我们将网络拆分为容易读取的一个接一个的块,或者通过并行动作彼此激活。读者可以注意到在每个ECT块中,在块中包括为动作定义的前提条件和后置条件。从这两个表中取出证明所需的信息。
[1045] 这完成了DP-解决方案的实施和定义。在表述权利要求之前,我们定义在权利要求中使用的术语,使得更容易地理解权利要求。
[1046] 权利要求的序言
[1047] 在该序言中定义权利要求的叙述中使用的术语名称、属性、数据、方法、条件、概要、改进、运行、动作事件和通信事件:
[1048] (i)名称是给定的字母符号中的任意有限字符串,
[1049] (ii)数据是通常用于表示值的二进制比特0和1的任意有限字符串,
[1050] (iii)属性是用于定义对象实例x的特性的任意名称,x.attribute被用于指代用于对象x的属性的值,x.attribute在对象实例x的分类X中定义。
[1051] (iv)方法具有格式x:name(
),是可选的,每个方法是计算机程序,在对象实例x的分类X中定义用于方法x:name()的计算机程序。如果对其没有定义计算机程序,则方法是概要。[1052] (v)条件具有格式x:name?(),没有自变量,每个条件是计算机程序,在对象实例x的分类X中定义用于条件x:name?()的计算机程序。条件的评估将返回真值(真或假),或者真值(真、假或未知)。如果对其没有定义计算机程序,条件是概要。
[1053] (vi)概要:如果软件部件包括概要方法和/或条件,则软件部件是概要。
[1054] (vii)改进:定义用于软件部件中的概要方法和条件的计算机程序被称为改进该软件部件。如果已经对软件部件中的所有方法和条件定义了计算机程序,则该软件部件被完全改进。
[1055] (viii)运行:执行用于应用A的完全改进的并行计算机程序被称为A的运行,在A中的每个并行计算机程序由不同的专用CPU(计算单元)执行,在A中的并行计算机程序通过消息交换彼此交互,同时运行A,这是在A中的并行计算机程序之间的唯一交互模式。
[1056] (ix)动作事件:动作事件具有格式(name,t),动作事件是由程序语言中语句的执行引起的,或者由方法或条件的执行引起的,名称是由该执行引起的事件的名称并且t是该事件的发生时间。
[1057] (x)通信事件:通信事件具有格式(nameS,t)或(nameD,t)或(nameF,t)(‘S’用TM于‘发送’,‘D’用于‘传递’以及‘F’用于‘转发’),通信事件发生是由在TICC -Ppde编程语言中的通信语句的执行引起的,名称是附接于蜂窝的端口的名称,该蜂窝发送/接收或转发在通信中交换的消息,t是该通信事件发生的时间。