【系统分析与验证笔记】PG、TS各自的交错(Interleaving)

890 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1.并行与并发

1.并行(Parallelism)进程:有两个进程P、Q,他们在系统中的执行顺序为PQPPQP,PPPQQP,QPQQPP等多种可能,这就叫做并行进程。用P||Q表示P和Q为一组并行进程。

2.并发(Concurrency)进程:有两个进程P、Q,他们虽处在统一系统中,但他们可以同时执行,不分先后,这就叫做并发进程。也可以类似的看作两个路口的红绿灯系统,他们都属于交通系统,同一时间都在工作,但他们之间的运作不分先后,互不干扰。用P|||Q表示P和Q为一组并发进程。

2.交错的TSTS(Interleaving of Transition Systems)

1.TSTS的定义TSi=(Si,Acti,i,Ii,APi,Li),i=1,2TS_{i}=(S_{i},Act_{i},\to_{i},I_{i},AP_{i},L_{i}),i=1,2

2.TSTS并发的表达式:TS1TS_{1}|||TS2=(S1×S2,Act1Act2,,I1×I2,AP1AP2,L)TS_{2}=(S_{1} \times S_{2},Act_{1} \cup Act_{2} ,\to,I_{1} \times I_{2},AP_{1} \cup AP_{2},L) 其中,转移关系\to定义规则为: S11αS1S1,S2αS1,S2\tfrac {S_{1} \overset{\alpha }{\rightarrow_{1}}{S_{1}'}} {\langle S_{1},S_{2} \rangle \overset{\alpha }{\rightarrow}\langle {S_{1}}',S_{2} \rangle }S22αS2S1,S2αS1,S2\tfrac {S_{2} \overset{\alpha }{\rightarrow_{2}}{S_{2}'}} {\langle S_{1},S_{2} \rangle \overset{\alpha }{\rightarrow}\langle S_{1},{S_{2}}' \rangle }

标签函数LL定义规则为:L(s1,s2)=L(S1)L(S2)L(\langle s_{1},s_{2} \rangle) = L(S_{1} )\cup L(S_{2})

3.范例:

  • 活动α\alpha表示x:=x+1x:=x+1 活动β\beta表示y:=y2y:=y-2 初始条件:x=0,y=7x=0,y=7 那么αβ\alpha ||| \beta的过程如图所示: 在这里插入图片描述 (右图表示从初始状态开始,每次任选一个活动执行,活动α\alphaβ\beta各执行一次)
  • 但如果两个活动共享一个变量,对同一个变量进行修改,则可能会导致错误情况,比如: 活动α\alpha表示x:=2xx:=2\cdot x 活动β\beta表示x:=x+1x:=x+1 初始条件:x=3x=3 那么αβ\alpha ||| \beta的过程如图所示: 在这里插入图片描述 (此时用TS建立的模型会导致最终共享变量的结果出现矛盾:在同一状态上的共享变量取值不同,且执行结果也不正确)

3.交错的PGPG(Interleaving of Program Graphs)

1.定义:PGi=(Loci,Acti,Effecti,i,Loc0,i,g0,i),i=1,2PG_{i} = (Loc_{i}, Act_{i},Effect_{i}, \hookrightarrow_{i}, Loc_{0,i},g_{0,i}),i=1,2,是变量VariVar_{i}上的两个PG,则在Var1Var2Var_{1} \cup Var_{2}上,有PG1PG2=(Loc1×Loc2,Act1Act2,Effect,,Loc0,1,Loc0,2,g0,1g0,2)PG_{1}|||PG_{2}=(Loc_{1} \times Loc_{2},Act_{1} \uplus Act_{2},Effect, \hookrightarrow_, Loc_{0,1}, Loc_{0,2},g_{0,1} \wedge g_{0,2})

  • 转移关系\hookrightarrow定义规则为: $\tfrac

{l_{1} \xhookrightarrow[]{g : \alpha }{1}{l{1}'}} {\langle l_{1},l_{2} \rangle \xhookrightarrow[]{g : \alpha }\langle {l_{1}}',l_{2} \rangle }</font><fontsize=6></font> 和 <font size =6> \tfrac {l_{2} \xhookrightarrow[]{g : \alpha}{2}{l{2}'}} {\langle l_{1},l_{2} \rangle \xhookrightarrow[] {g : \alpha }\langle l_{1},{l_{2}}' \rangle }</font></font> \quad表示满足哪个 表示满足哪个PG$转移的条件,就引出一条向那个位置转移的关系。

  • 影响集合EffectEffect定义规则为:Effect(α,η)=Effecti(α,η)  if αActiEffect(\alpha,\eta ) = Effect_{i}(\alpha,\eta ) \ \ if \ \alpha \in Act_{i} \quad 表示新的EffectEffect表取自之前的两个EffectEffect表,当前转移上执行的动作α\alpha是哪个PG的动作(ActiAct_i)中的,就使用相应的之前表(EffectiEffect_i)中的动作α\alpha对赋值η\eta的变换即可。

2.范例1:x=x+1x:=2xx=x+1|||x:=2\cdot x

  • PG建模 在这里插入图片描述
  • 模型交错 在这里插入图片描述
  • 将交错的PG模型转换为TS模型 在这里插入图片描述 此时,得到的是两进程正确进行交错的结果,最终变量的取值取决于两段临界区代码的执行次序。

3.带互斥信号量的程序建模

  • 定义:有一个共享变量y,初始值为1;当y的值为1的时候,互斥信号量是自由的,可以占用和访问,当y的值为0的时候,互斥信号量是被锁死的,不可以占用和访问。
  • 范例: 刚开始,PG1PG_1PG2PG_2均处于非临界区(noncritinoncrit_i),接着,会进入等待区;在等待区,会判断是否满足条件:y>0y>0,如果条件满足,那么会执行y:=y1y:=y-1,对临界区进行加锁,表示临界区正在使用,其他PG不可进入临界区,然后该PG进入临界区,执行相应的操作;在临界区执行完操作后,执行y:=y+1y:=y+1,对临界区进行解锁,回到非临界区,其他PG可以进入临界区。 图片来自https://blog.csdn.net/SHU15121856/article/details/102635137 PG1PG2PG_1|||PG_2的结果 在这里插入图片描述 将结果转换为TS模型 在这里插入图片描述 n1n_1n2n_2表示非临界区 w1w_1w2w_2表示等待区 c1c_1c2c_2表示临界区资源,他们不会同时出现在同一个结点上,因此避免了临界区资源的冲突问题。

4.彼得森进程互斥(Peterson’s Mutual exclusion)算法

  • 共享变量:b1,b2,x,b_1,b_2,x,
  • 初始条件:b1=b2=falseb_1=b_2=false 进程P1P_1
loop forever 
... (*noncritical actions*)
 <b1 := true; x := 2;> 
 wait until (x = 1 ∨ ¬b2) 
 do critical section od 
 b1 := false 
 ... (*noncritical actions*)
 end loop

进程P2P_2

loop forever 
... (*noncritical actions*)
 <b2 := true; x := 1;> 
 wait until (x = 2 ∨¬ b1) 
 do critical section od 
 b2 := false 
... (*noncritical actions*)
 end loop
  • 进程P1P_1P2P_2PGPG在这里插入图片描述
  • TSPG1PG1TS(PG_1|||PG_1在这里插入图片描述