1、Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,*,信号量机制,P,、,V,操作例题,信号量机制,信号量机制,wait,和,signal,又称为,P,、,V,操作,,P,、,V,原语,,P,、,V,操作的一般描述如下:,P,操作:,(,1,),S,减,1,;,(,2,)若,s,减,1,后仍大于或等于零,则进程继续执行(可进入临界区);,(,3,)若,s,减,1,后小于零,则该进程被阻塞在与该信号相对应的队
2、列中,然后转进程调度。,P,、,V,操作,入 口,S=S-1,S 0,返 回,调用进程入等待队列,转进程调度,否,是,入 口,S=S+1,S 0,返 回,唤醒等待队列中的一个进程,返回或转进程调度,是,否,V,操作:,(,1,),S,加,1,;,(,2,),若相加结果大于零,进程继续执行(无等待该临界资源的阻塞进程);,(,3,)若相加结果小于或等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转进程调度。,1,、独木桥问题。某条河上只有一座独木桥,以便行人过桥,现在河的两边都有人要过桥,按照下面的规则过桥,为了保证过桥安全,请用,P,,,V,操作分别实现正确的管理。,
3、过桥的规则:同一方向的可连续过桥,某方向有人过桥时另一方向的人要等待。,2,、桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的香蕉,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者使用,请用,P,,,V,原语实现爸爸、儿子、女儿三个并发进程的同步。,3,、某寺庙,有小、老和尚若干,有一水缸,有小和尚提水入缸供老和尚饮用。水缸可容,10,桶水,水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为,3,个。每次入、取缸水仅为,1,桶,且不可同时进行。给出取水、入水的算法描述。,1,、独木桥问题。过桥的规则:同一方向的可连续过桥,某方向有人过桥时
4、另一方向的人要等待。,Var,Semaphore,mutex,Lmutex,Rmutex,=1,0,0;,int,Lcount,=0,Rcount,=0,;,Main(),cobegin,Left();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,Rc
5、ount,左右两边过桥人数,/,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,
6、0,0;,Main(),cobegin,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,盘中香蕉数,桌上有一空盘,允许存放一只水果。,爸爸可向盘中放苹果,,,妈妈向盘中
7、放香蕉,,儿子专等吃盘中的香蕉,女儿专等吃盘中的苹果。,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)
8、p(apple);,从盘子取苹果;,v(dish);,吃苹果;,/dish,互斥使用盘子;,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:,已用水桶数,