现在的位置: 首页 > 综合 > 正文

信号量(二) 经典例子举例(一)

2019年06月05日 ⁄ 综合 ⁄ 共 2532字 ⁄ 字号 评论关闭

      本文中的PV操作例子都取自上课时老师讲的例题,当中包括“《越狱》寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等

 

首先,讲 semWait操作(P操作)和semSignal操作(V操作)的一些基本原则。(接下来同意称为P,V操作)

1. P操作,s - -,if(s<0)阻塞自己

2. V操作,s++,if(s<=0)唤醒一个其他进程

3. P,V操作时原语(通俗讲,就是执行PV操作时时不能被打打断的)

4. P,V操作总是成对出现的。P:资源申请/分配;V操作:资源的释放

 

一般每个进程的PV操作代码:

s = ?  //根据资源数进行初始化

P(s)

临界区

V(s)

 

 

 

一.《越狱》寄信

 

 题目描述:

T-boy给brad送信,Mike给Lincon送信,但他们送信收信都通过同一个树洞。

 

解答:

信号量:

 

Lincon: 是否有Mike的信,s1 = 0

Brad:    是否有T-boy的信,s2 = 0

Mike和T-boy: 树洞是否为空,s3 = 1

 

Mike:                    T-boy:                 Lincon:                 Brad:

 

write()                  write()                P(s1)                    P(s2)                               

P(s3)                    P(s3)                  getit()                   getit()                                    

putit()                   putit()                 V(s3)                   V(s3)                                           

V(s1)                     V(s2)                 readit()                 readit()

 

 

 

二. 家庭吃水果(对第一题的扩充,不同的只是现在资源比之前多了,变成了3个)

 

                                       

 

                                                                                             

 

 

解答:

信号量:

 

儿子: 是否有苹果,s1 = 0

女儿: 是否有桔子,s2 = 0

爸妈: 是否可以放水果,s3 = 3

 

爸:                          妈:                     儿子:                      女儿:

 

makeit()               makeit()              P(s1)                    P(s2)                               

P(s3)                    P(s3)                  getit()                   getit()                                    

putit()                   putit()                 V(s3)                   V(s3)                                           

V(s1)                    V(s2)                   eatit()                  eatit()

 

 

 

 三. 五子棋

题目描述:白子和黑子各有32个,黑子先行,怎样设置信号量,才能黑子先行,且是交替下子

 

解答:

信号量: 

白子可下吗? s1 = 0

黑子可下吗? s2 = 1

     白                                             黑

for(i=0;i<32;i++){                   for(i=0;i<32;i++){                             

   取子                                          取子       

   P(s1)                                        P(s2)         

   放白子                                       放黑子     

   V(s2)                                        V(s1)

}                                              }

 

 

四.接力赛跑

题目描述:四个人进行接力赛跑,要求使用信号量的方法使得跑的顺序是P1->P2->P3->P4

解答:

信号量:

s2:2号接棒 0

s3:3号接棒 0

s4:4号接棒 0

 

P1                P2                 P3                       P4

 

                  P(s2)             P(s3)                   P(s4)                    

run             run                 run                      run               

V(s2)          V(s3)             V(s4)                                       

 

 

 

抱歉!评论已关闭.