概念
- 握手是在TS上面直接进行的一种操作,在讲述握手之前,先来回顾两个以前学的定义:
- 交错(Interleaving):指多个活动完全自主进行,异步访问共享变量。活动之间没有任何相互影响的操作,比如两个路口的红绿灯,各自运行,互不干涉。
- 共享变量(Shared-variable):共享变量是一个多个活动都可以访问的变量,可以用于活动之间的通信(也叫消息传递),比如活动A对共享变量赋值,活动B检测共享变量的值进行响应的操作。
- 握手(handshaking):一种同步操作,参与者双方同时访问共享变量进行数据交换。
- 握手交换的信息:在握手中交换的信息可以是整形,也可以是复杂的数据类型。
- 消息传递的发生条件: 只有当两个参与进程都准备执行相同的握手动作时,消息传递才能发生。
定义
- 握手动作来源:对于两个进程
P
1
,
P
2
P_1,P_2
P1,P2来说,有三种变量
- P 1 P_1 P1独有的动作
- P 2 P_2 P2独有的动作
- P 1 , P 2 P_1,P_2 P1,P2共享的动作,这个动作称为握手
- 握手动作定义:指进程共有的动作,用符号 H H H表示,类似于 T S , P G TS,PG TS,PG的动作 A c t Act Act
- 对于以前学习的
T
S
TS
TS的定义:
T S i = ( S i , A c t i , → i , I i , A P i , L i ) , i = 1 , 2 TS_i = (S_i,Act_i,\to_i,I_i,AP_i,L_i),i=1,2 TSi=(Si,Acti,→i,Ii,APi,Li),i=1,2
其中: T S s , H ⊆ A c t 1 ∩ A c t 2 w i t h τ ∉ H TS_s,H \subseteq Act_1 \cap Act_2 \ with \ \tau \notin H TSs,H⊆Act1∩Act2 with τ∈/H - 对
T
S
1
∣
∣
H
T
S
2
TS_1 ||_H TS_2
TS1∣∣HTS2的定义:
T S 1 ∣ ∣ H T S 2 = ( S 1 × S 2 , A c t 1 ∪ A c t 2 , → , I 1 × I 2 , A P 1 ∪ A P 2 , L ) TS_1 \ ||_H \ TS_2 = (S_1 \times S_2,Act_1 \cup Act_2,\to,I_1\times I_2,AP_1 \cup AP_2,L) TS1 ∣∣H TS2=(S1×S2,Act1∪Act2,→,I1×I2,AP1∪AP2,L)
其中:- L L L的定义: L ( S 1 , S 2 ) = L ( S 1 ) ∪ L ( S 2 ) L(S_1,S_2)=L(S_1) \cup L(S_2) L(S1,S2)=L(S1)∪L(S2)
-
→
\to
→的定义:
- 在交错(Interleaving)动作中,即
α
∉
H
\alpha \notin H
α∈/H的情况下,多个状态
S
S
S分别进行变化,变化过程如下:
S 1 → α 1 S 1 ′ ⟨ S 1 , S 2 ⟩ → α ⟨ S 1 ′ , S 2 ⟩ S 2 → α 2 S 2 ′ ⟨ S 1 , S 2 ⟩ → α ⟨ S 1 , S 2 ′ ⟩ \tfrac{ S_1 \overset{\alpha }{\rightarrow}_1 {S_1}' }{ \langle S_1,S_2 \rangle \overset{\alpha }{\rightarrow} \langle {S_1}',S_2 \rangle } \quad\quad \tfrac{ S_2 \overset{\alpha }{\rightarrow}_2 {S_2}' }{ \langle S_1,S_2 \rangle \overset{\alpha }{\rightarrow} \langle S_1,{S_2}' \rangle } ⟨S1,S2⟩→α⟨S1′,S2⟩S1→α1S1′⟨S1,S2⟩→α⟨S1,S2′⟩S2→α2S2′
- 在握手动作下,即
α
∈
H
\alpha \in H
α∈H的情况下,多个状态
S
S
S同步进行变化,变化过程如下:
S 1 → α 1 S 1 ′ ∧ S 2 → α 2 S 2 ′ ⟨ S 1 , S 2 ⟩ → α ⟨ S 1 ′ , S 2 ′ ⟩ \tfrac{ S_1 \overset{\alpha }{\rightarrow}_1 {S_1}' \wedge S_2 \overset{\alpha }{\rightarrow}_2 {S_2}' }{ \langle S_1,S_2 \rangle \overset{\alpha }{\rightarrow} \langle {S_1}',{S_2}' \rangle } ⟨S1,S2⟩→α⟨S1′,S2′⟩S1→α1S1′∧S2→α2S2′
- 在交错(Interleaving)动作中,即
α
∉
H
\alpha \notin H
α∈/H的情况下,多个状态
S
S
S分别进行变化,变化过程如下:
- 当动作 H H H为 A c t 1 Act_1 Act1和 A c t 2 Act_2 Act2所共有的动作( H = A c t 1 ∩ A c t 2 H = Act_1 \cap Act_2 H=Act1∩Act2)时, T S 1 ∣ ∣ T S 2 = T S 1 ∣ ∣ H T S 2 TS_1 || TS_2 =TS_1 ||_H \ TS_2 TS1∣∣TS2=TS1∣∣H TS2
握手的三条性质
- 无共享动作时:这个时候,
T
S
1
TS_1
TS1和
T
S
2
TS_2
TS2的握手和交错一样,可直接转换为交错(Interleaving)动作的公式
T
S
1
∣
∣
∣
T
S
2
TS_1 \ ||| \ TS_2
TS1 ∣∣∣ TS2表示,具体等式如下:
T S 1 ∣ ∣ ∅ T S 2 = T S 1 ∣ ∣ ∣ T S 2 TS_1 \ ||_\varnothing \ TS_2 = TS_1 \ ||| \ TS_2 TS1 ∣∣∅ TS2=TS1 ∣∣∣ TS2 - 交换律:两个
T
S
TS
TS握手时,可以进行如下交换
T S 1 ∣ ∣ H T S 2 = T S 1 ∣ ∣ H T S 2 TS_1 \ ||_H \ TS_2 = TS_1 \ ||_H \ TS_2 TS1 ∣∣H TS2=TS1 ∣∣H TS2 - 结合律:对于多个进行握手的
T
S
TS
TS,如果
H
⊆
A
c
t
1
∩
.
.
.
∩
A
c
t
n
H \subseteq Act_1 \cap ... \cap Act_n
H⊆Act1∩...∩Actn
那么 T S = T S 1 ∣ ∣ H T S 2 ∣ ∣ H . . . ∣ ∣ H T S n TS =TS_1 \ ||_H \ TS_2 \ ||_H \ ... \ ||_H \ TS_n TS=TS1 ∣∣H TS2 ∣∣H ... ∣∣H TSn
对于一组进程,虽然可以多个进程一起握手,但我们通常只让进程两两握手
多个进程同时通信: T S 1 ∣ ∣ T S 2 ∣ ∣ . . . ∣ ∣ T S n TS_1||TS_2||...||TS_n TS1∣∣TS2∣∣...∣∣TSn
-
T S i TS_i TSi和 T S j ( 0 < i ≠ j ≤ n ) TS_j(0<i \neq j \leq n) TSj(0<i=j≤n)同步进行
-
H i , j = A c t i ∩ A c t j H_{i,j}=Act_i \cap Act_j Hi,j=Acti∩Actj
-
当 k ∉ i , j k \notin {i,j} k∈/i,j且 τ ∉ H i , j \tau \notin H_{i,j} τ∈/Hi,j时, H i , j ∩ A c t k = ∅ H_i,j \cap Act_k = \varnothing Hi,j∩Actk=∅
-
对于 T S TS TS独有的动作执行时,即 f o r α ∈ A c t i ∖ ( ⋃ 0 < i ≠ j ≤ n ) for \ \alpha \in Act_i \setminus (\bigcup_{0<i \neq j \leq n}) for α∈Acti∖(⋃0<i=j≤n),状态发生的变化:
S i → α i S i ′ ⟨ S 1 , S 2 . . . S i . . . S j . . . S n ⟩ → α ⟨ S 1 , S 2 . . . S i ′ . . . S j . . . S n ⟩ \tfrac{ S_i \overset{\alpha}{\rightarrow}_i {S_i}' }{ \left \langle S_1,S_2...S_i...S_j...S_n \right \rangle \overset{\alpha}{\rightarrow} \left \langle S_1,S_2...{S_i}'...S_j...S_n \right \rangle } ⟨S1,S2...Si...Sj...Sn⟩→α⟨S1,S2...Si′...Sj...Sn⟩Si→αiSi′ -
对于两个 T S TS TS共享的动作执行时,即 f o r α ∈ H i , j a n d 0 < i < j ≤ n ) for \ \alpha \in H_{i,j} \ and \ 0<i < j \leq n) for α∈Hi,j and 0<i<j≤n),状态发生的变化:
S i → α i S i ′ ∧ S j → α j S j ′ ⟨ S 1 , S 2 . . . S i . . . S j . . . S n ⟩ → α ⟨ S 1 , S 2 . . . S i ′ . . . S j ′ . . . S n ⟩ \tfrac{ S_i \overset{\alpha}{\rightarrow}_i {S_i}' \ \wedge \ S_j \overset{\alpha}{\rightarrow}_j {S_j}' }{ \left \langle S_1,S_2...S_i...S_j...S_n \right \rangle \overset{\alpha}{\rightarrow} \left \langle S_1,S_2...{S_i}'...{S_j}'...S_n \right \rangle } ⟨S1,S2...Si...Sj...Sn⟩→α⟨S1,S2...Si′...Sj′...Sn⟩Si→αiSi′ ∧ Sj→αjSj′ -
范例
- 例题一: 通过握手相互排斥
- 有两个进程
T
1
T_1
T1和
T
2
T_2
T2,他们重复执行
r
e
q
u
e
s
t
request
request和
r
e
l
e
a
s
e
release
release,位置也由由临界区(crit)和非临界区(noncrit)不断替换,当我们将这两个进程进行交错(Interleaving)动作
T
1
∣
∣
∣
T
2
T_1|||T_2
T1∣∣∣T2后,我们可以得到下图
但我们发现, T 1 , T 2 T_1,T_2 T1,T2有可能同时占用临界资源(处于 c r i t 1 , c r i t 2 crit_1,crit_2 crit1,crit2结点)。
为避免他们同时进入临界资源,我们增加一个仲裁器来避免这种情况的发生。仲裁器的执行流程如下图所示:
下面,请画出引入了仲裁器的交错图,即 T S A r b = ( T S 1 ∣ ∣ ∣ T S 2 ) ∣ ∣ A r b i t e r TS_{Arb} = (TS_1 ||| TS_2 ) || Arbiter TSArb=(TS1∣∣∣TS2)∣∣Arbiter- 答案:
- 答案:
- 有两个进程
T
1
T_1
T1和
T
2
T_2
T2,他们重复执行
r
e
q
u
e
s
t
request
request和
r
e
l
e
a
s
e
release
release,位置也由由临界区(crit)和非临界区(noncrit)不断替换,当我们将这两个进程进行交错(Interleaving)动作
T
1
∣
∣
∣
T
2
T_1|||T_2
T1∣∣∣T2后,我们可以得到下图
- 例题二:登记系统
- 三个进程:
BCR:条码读取进程,当BCR=0时表示等待读取条形码,当BCR=1表示正在读取条形码
BP:登记进程,当BP=0时表示等待登记,当BP=1表示正在登记
Printer:打印登记结果进程,当Printer=0时表示等待打印,当Printer=1表示正在打印 - 四个动作:
store:进入准备扫码状态
scan:进入扫描条形码状态
prt_cmd:进入准备打印状态
print:执行完成打印状态
- 三个进程:
画出这三个进程握手以后并发的模型,即 BCR || BP || Printer
- 答案:
- 解析:
- 模型中结点的三个数字依次表示BCR、BP、Printer在结点时的取值。例如:000表示初始状态,三个进程都处在等待状态;101表示读取条码和打印进程在同时进行,登记进程处于等待状态。
- store和prt_cmd为握手动作。
- 例题一: 通过握手相互排斥
通道系统(Channel System,简称CS)
- 作用: 可以将一条或多条信息暂时存放在通道内,类似于缓存的功能。每个通道为握手的参与者们所独有,只能用于参与者之间交换信息,参与者们不可使用与其无关的通道。
- 动作集合 C o m m = c ! v , c ? x ∣ c ∈ C h a n , v ∈ d o m ( c ) , x ∈ V a r , d o m ( x ) ⊇ d o m ( c ) Comm={c!v,c?x|c\in Chan,v\in dom(c),x\in Var,dom(x) \supseteq dom(c) } Comm=c!v,c?x∣c∈Chan,v∈dom(c),x∈Var,dom(x)⊇dom(c) ,其中, C h a n Chan Chan是有限的通道集合, d o m ( c ) dom(c) dom(c)表示c通道所能接受的类型, d o m ( x ) dom(x) dom(x)表示x通道所能接受的类型, d o m ( x ) ⊇ d o m ( c ) dom(x) \supseteq dom(c) dom(x)⊇dom(c)表示x所能接受的数据类型包含c所能接受的数据类型
- 通道容量:通道有一个有限或无限的容量,表示为
c
a
p
(
c
)
∈
2
I
N
∪
{
∞
}
cap(c) \in 2^{IN} \cup \{ \infty \}
cap(c)∈2IN∪{∞},有三种可能:
- c a p ( c ) = ∞ cap(c)=\infty cap(c)=∞,表示通道容量无限大
- c a p ( c ) = 0 cap(c)=0 cap(c)=0,表示通道容量为零,此时退化为同步数据通信方式——握手
- c a p ( c ) > 0 cap(c)>0 cap(c)>0,表示有限个通道容量, 此时同一消息的发送和读取发生在不同的时刻,称为异步消息传递。
- 通道系统的组成:一个通道系统由多个PG组成
C S = [ P G 1 ∣ P G 2 ∣ . . . ∣ P G n ] CS=[PG_1|PG_2|...|PG_n] CS=[PG1∣PG2∣...∣PGn] - 通道系统的转变:
- 条件转变: l ↪ g : α l ′ l \xhookrightarrow[]{g : \alpha } {l}' lg:α l′
- 具有通信动作的条件转变:
- 将一条消息v通过通道c发送出去: l ↪ g : c ! v l ′ l \xhookrightarrow[]{g : c!v } {l}' lg:c!v l′
- 从通道c中取出要给消息v放入变量x中: l ↪ g : c ? x l ′ l \xhookrightarrow[]{g : c?x } {l}' lg:c?x l′
- 在发送和接受消息前,要进行判断
- 只有当通道没有满的时候,才会发送消息
- 只有当通道不为空的时候,才会发送消息
- 范例:交替位协议
- 在不可信通道unreliable channel c上,sender发送 < m 0 , 0 > , < m 1 , 0 > , < m 2 , 0 > , . . . <m_0,0>,<m_1,0>,<m_2,0>,... <m0,0>,<m1,0>,<m2,0>,...给receiver,其中 m 0 , m 1 , m 2 . . . m_0,m_1,m_2... m0,m1,m2...表示信息, b 0 , b 1 , b 0 . . . b_0,b_1,b_0... b0,b1,b0...表示控制位
- 在可信通道channel d上,receiver发送返回确认消息给sender
- timer为计时器,消息发送后,开始计时,如果时间过去后未收到返回确认消息,则重新发送消息
- 请画出该协议的sender和receiver的PG通信图。
- 答案
- 协议sender的PG图:
- 协议receiver的PG图:
- 协议sender的PG图:
- 解析:
- Chan={ c, d, tmr_on, tmr_off , timeout }
- Var = { x, y,mi }
- Alternating Bit Protocol = [S | Timer | R ]
- tmr_on表示打开计时器,进行等待。对于sender来说,若收到了返回的确认消息,则关闭计时器(tmr_off),若等待超时(timeout),则重新发送该消息。