本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.并行与并发
1.并行(Parallelism)进程:有两个进程P、Q,他们在系统中的执行顺序为PQPPQP,PPPQQP,QPQQPP等多种可能,这就叫做并行进程。用P||Q表示P和Q为一组并行进程。
2.并发(Concurrency)进程:有两个进程P、Q,他们虽处在统一系统中,但他们可以同时执行,不分先后,这就叫做并发进程。也可以类似的看作两个路口的红绿灯系统,他们都属于交通系统,同一时间都在工作,但他们之间的运作不分先后,互不干扰。用P|||Q表示P和Q为一组并发进程。
2.交错的TS(Interleaving of Transition Systems)
1.TS的定义TSi=(Si,Acti,→i,Ii,APi,Li),i=1,2
2.TS并发的表达式:TS1|||TS2=(S1×S2,Act1∪Act2,→,I1×I2,AP1∪AP2,L)
其中,转移关系→定义规则为:
⟨S1,S2⟩→α⟨S1′,S2⟩S1→1αS1′ 和 ⟨S1,S2⟩→α⟨S1,S2′⟩S2→2αS2′
标签函数L定义规则为:L(⟨s1,s2⟩)=L(S1)∪L(S2)
3.范例:
- 活动α表示x:=x+1
活动β表示y:=y−2
初始条件:x=0,y=7
那么α∣∣∣β的过程如图所示:
(右图表示从初始状态开始,每次任选一个活动执行,活动α和β各执行一次)
- 但如果两个活动共享一个变量,对同一个变量进行修改,则可能会导致错误情况,比如:
活动α表示x:=2⋅x
活动β表示x:=x+1
初始条件:x=3
那么α∣∣∣β的过程如图所示:
(此时用TS建立的模型会导致最终共享变量的结果出现矛盾:在同一状态上的共享变量取值不同,且执行结果也不正确)
3.交错的PG(Interleaving of Program Graphs)
1.定义:PGi=(Loci,Acti,Effecti,↪i,Loc0,i,g0,i),i=1,2,是变量Vari上的两个PG,则在Var1∪Var2上,有PG1∣∣∣PG2=(Loc1×Loc2,Act1⊎Act2,Effect,↪,Loc0,1,Loc0,2,g0,1∧g0,2)
- 转移关系↪定义规则为:
$\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>\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>\quad表示满足哪个PG$转移的条件,就引出一条向那个位置转移的关系。
- 影响集合Effect定义规则为:Effect(α,η)=Effecti(α,η) if α∈Acti
表示新的Effect表取自之前的两个Effect表,当前转移上执行的动作α是哪个PG的动作(Acti)中的,就使用相应的之前表(Effecti)中的动作α对赋值η的变换即可。
2.范例1:x=x+1∣∣∣x:=2⋅x
- PG建模

- 模型交错

- 将交错的PG模型转换为TS模型
此时,得到的是两进程正确进行交错的结果,最终变量的取值取决于两段临界区代码的执行次序。
3.带互斥信号量的程序建模
- 定义:有一个共享变量y,初始值为1;当y的值为1的时候,互斥信号量是自由的,可以占用和访问,当y的值为0的时候,互斥信号量是被锁死的,不可以占用和访问。
- 范例:
刚开始,PG1和PG2均处于非临界区(noncriti),接着,会进入等待区;在等待区,会判断是否满足条件:y>0,如果条件满足,那么会执行y:=y−1,对临界区进行加锁,表示临界区正在使用,其他PG不可进入临界区,然后该PG进入临界区,执行相应的操作;在临界区执行完操作后,执行y:=y+1,对临界区进行解锁,回到非临界区,其他PG可以进入临界区。
PG1∣∣∣PG2的结果
将结果转换为TS模型
n1和n2表示非临界区
w1和w2表示等待区
c1和c2表示临界区资源,他们不会同时出现在同一个结点上,因此避免了临界区资源的冲突问题。
4.彼得森进程互斥(Peterson’s Mutual exclusion)算法
- 共享变量:b1,b2,x,
- 初始条件:b1=b2=false
进程P1:
loop forever
... (*noncritical actions*)
<b1 := true; x := 2;>
wait until (x = 1 ∨ ¬b2)
do critical section od
b1 := false
... (*noncritical actions*)
end loop
进程P2:
loop forever
... (*noncritical actions*)
<b2 := true; x := 1;>
wait until (x = 2 ∨¬ b1)
do critical section od
b2 := false
... (*noncritical actions*)
end loop
- 进程P1和P2的PG图

- TS(PG1∣∣∣PG1)
