资源描述:
《复习资料3(P、V操作).doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、P、V一、生产者--消费者问题(采用信号量机制)full是"满"数目,初值为0,empty是"空"数目,初值为N。实际上,full+empty==N;mutex用于访问缓冲区时的互斥,初值是1;每个进程中各个P操作的次序是重要的:先检查资源数目,再检查是否互斥――否则可能死锁;Varmutex,empty,full:semaphore:=1,n,0;buffer:array[0,.....n-1];in,out:integer:=0,0;beginparbegin生产者:beginrepeat生产一个产品nex
2、tp;P(empty);P(mutex);将产品输入到buffer中buffer[in]:=nextp;in=(in+1)modn;V(mutex);V(full);untilfalse;end;消费者:beginrepeatP(full);P(mutex);从buffer中取一个产品nextc=buffer[out];out:=(out+1)modn;V(mutex);V(empty);untilfalse;end;parend;end;三、读者--写着问题(采用信号量机制)第一类:读者优先如果读者来:1)无
3、读者、写者,新读者可以读2)有写者等,但有其它读者正在读,则新读者也可以读3)有写者写,新读者等如果写者来:1)无读者,新写者可以写2)有读者,新写者等待3)有其它写者,新写者等待Wmutex表示"允许写",初值是1。公共变量Rcount表示“正在读”的进程数,初值是0;Rmutex表示对Rcount的互斥操作,初值是1。Varwmutex,rmutex:semaphore=1,1;buffer:array[0,.....n-1];Rcount:integer:=0;beginparbegin读者:beginr
4、epeatP(rmutex);if(Rcount==0)P(wmutex);Rcount=Rcount+1;V(rmutex);执行read操作;P(rmutex);Rcount=Rcount-1;if(Rcount==0)V(wmutex);V(rmutex);untilfalse;end;写者:beginrepeatP(wmutex);进行write操作;V(wmutex);untilfalse;end;parend;end;第二类:写者优先7Wmutex表示"允许写",初值是1。公共变量Rcount表示“
5、正在读”的进程数,初值是0;Rmutex表示对Rcount的互斥操作,初值是1。“为了使写者优先,可在原来读者优先的基础上增加一个初值为1的信号量S,使得至少有一个写者准备访问共享对象时,他可以使后续的读者进程等待写完成。初值为0的Wcount用来对写者进行计数,初值为1的互斥信号量mutex用来实现多个写者对Wcount的互斥访问”。VarS,wmutex,rmutexmutex:semaphore=1,1,1,1;buffer:array[0,.....n-1];Rcount:integer:=0;begi
6、nparbegin读者:beginrepeatP(S);P(rmutex);if(Rcount==0)P(wmutex);Rcount=Rcount+1;V(rmutex);V(S);执行read操作;P(rmutex);Rcount=Rcount-1;if(Rcount==0)V(wmutex);V(rmutex);untilfalse;end;写者:beginrepeatP(mutex);if(Wcount==0)P(S);Wcount=Wcount+1;V(mutex);P(wmutex);进行write
7、操作;V(wmutex);P(mutex);Wcount=Wcount-1;if(Wcount==0)V(S);V(mutex);untilfalse;end;parend;end;二、哲学家进餐问题Varsm:semaphore:=4;Philosopheri:while(true){P(sm);P(chopStick[i]);//getleftchopstickP(chopStick[(i+1)%5]);//getrightchopstick......eat;......V(chopStick[i]);/
8、/returnleftchopstickV(chopStick[(i+1)%5]);//returnrightchopstickV(sm);......think;......}7老和尚喝水问题:某寺庙,有小、老和尚若干,由小和尚提水入缸供老和尚饮用。水缸可容10桶水,水取自同一井中。水井窄,每次只能容一个桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可同时进行。试给出有关取水、