1、信号量机制,P、V操作例题,信号量机制,信号量机制,wait和signal又称为P、V操作,P、V原语, P、V操作的一般描述如下:P操作:(1)S减1;(2)若s减1后仍大于或等于零,则进程继续执行(可进入临界区);(3)若s减1后小于零,则该进程被阻塞在与该信号相对应的队列中,然后转进程调度。,P、V操作,V操作:(1)S加1;(2)若相加结果大于零,进程继续执行(无等待该临界资源的阻塞进程);(3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转进程调度。,1、独木桥问题。某条河上只有一座独木桥,以便行人过桥,现在河的两边都有人要过桥,按照下面
2、的规则过桥,为了保证过桥安全,请用P,V操作分别实现正确的管理。 过桥的规则:同一方向的可连续过桥,某方向有人过桥时另一方向的人要等待。,2、桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的香蕉,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者使用,请用P,V原语实现爸爸、儿子、女儿三个并发进程的同步。,3、某寺庙,有小、老和尚若干,有一水缸,有小和尚提水入缸供老和尚饮用。水缸可容10 桶水,水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可同时进行。给出取水、入水的算法描述。,1、独木桥问题。过桥的规
3、则:同一方向的可连续过桥,某方向有人过桥时另一方向的人要等待。,Var Semaphore mutex,Lmutex,Rmutex=1,0,0;int Lcount=0, Rcount=0; Main() cobeginLeft(); Right();Coend Left() while (true)P(Lmutex); if Lcount=0 P(mutex);Lcount=Lcount+1; V(Lmutex)过桥;p(Lmutex); if Lcount=0 V(mutex);Lcount=Lcount-1; V(Lmutex) ,/mutex左右两边过桥的互斥信号量;Lcount, R
4、count左右两边过桥人数 /Lmutex, Rmutex 分别表示对Lcount, Rcount互斥访问的信号量,Right() while (true)P(Rmutex); if Rcount=0 P(mutex);Rcount=Rcount+1; V(Rmutex)过桥;p(Rmutex); if Rcount=0 V(mutex);Rcount=Rcount-1; V(Rmutex) ,桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果和香蕉,儿子专等吃盘中的香蕉,女儿专等吃盘中的苹果。,Var dish,apple,banana:Semaphore:=1,0,0; Main() co
5、begin Father(); son();daugher(); Coend Father() while (true)p(dish); if 放的是苹果 v(apple);else V(banana) ,son() while (true) p(banana);从盘子取香蕉;v(dish); 吃香蕉; daugher() while (true) p(apple);从盘子取苹果;v(dish); 吃苹果; ,/dish互斥使用盘子;apple盘中苹果数;banana盘中香蕉数,桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,妈妈向盘中放香蕉,儿子专等吃盘中的香蕉,女儿专等吃盘中的苹果。,
6、Var dish,apple,banana:Semaphore:=1,0,0; Main() cobegin Father();mother();son();daugher(); Coend Father() while (true)p(dish); 将苹果放入盘子;v(apple); Mother() while (true) p(dish);将香蕉放入盘子;v(banana); ,son() while (true) p(banana);从盘子取香蕉;v(dish); 吃香蕉; daugher() while (true) p(apple);从盘子取苹果;v(dish); 吃苹果; ,/d
7、ish互斥使用盘子;apple盘中苹果数;banana盘中香蕉数,某寺庙,有小、老和尚若干,有一水缸,有小和尚提水入缸供老和尚饮用。水缸可容10 桶水,水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可同时进行。给出取水、入水的算法描述,Semaphore mutex1=1;mutex2=1; empty=10;full=0;count=3; Main() cobegin get(); use(); coend Get() /小和尚入水 while (true) p(empty) ; p(count) ; P(mutex1); 从井中取水; v(mutex1) ; P(mutex2) ; 将水倒入缸中; v (mutex2) ; v (count) ; v (full) ; ,Use() /老和尚取水 while(true)p (full) ;p(count) ;P(mutex2) ;从缸中取水;v (mutex2) ;v(empty) ;v (count) ; ,/mutex1:互斥从井中提水;mutex2:互斥从缸中取水;empty:缸中尚能盛水的桶数;full:缸中已盛水的桶数;count:已用水桶数,