1、如果有三个进程R、W1、W2共享一个缓冲器B,而B中每次只能存放一个数。
当缓冲器中无数时,进程R可以将从输入设备上读入的数存放到缓冲器中。
若存放到缓冲器中的是奇数,则允许进程W1将其取出打印;若存放到缓冲器中的是偶数,则允许进程W2将其取出打印。
同时规定:进程R必须等缓冲区中的数被取出打印后才能再存放一个数;进程W1或W2对每次存入缓冲器的数只能打印一次;W1和W2都不能从空缓冲中取数。
写出这三个并发进程能正确工作的程序。
semaphore S=1,SO=SE=0;buffer B;void R1(){int x;while(1){从输入设备上读一个数;x=接收的数;wait(S);B=x;if B是奇数then signal(SO);else signal(SE);}}void W1(){int y;while(1){wait(SO);y=B;signal(S);{打印y中数};}}void W2(){int z;while(1){wait(SO);z=B;signal(S);打印z中数 ;}}main(){cobegin{R();W1();W2();}2、有一个仓库,可以存放A和B两种产品,但要求:1)每次只能存入一种产品(A或B);2)-N<A产品数量—B产品数量<M。
其中,N和M是正整数。
试用同步算法描述产品A与产品B的入库过程。
Semaphore mutex=1,sa=M-1, sb=N-1;Process puta(){ while(1){ 取一个产品;wait(sa);wait(mutex);将产品入库;signal(mutex);signal(sb);}}Process puta(){ while(1){ 取一个产品;wait(sb);wait(mutex);将产品入库;signal(mutex);signal(sa);}}main(){cobegin{{puta();Putb();}}3、假定有一个信箱可存放N封信,当信箱不满时发信者可把信件送入信箱;当信箱中有信时收信者可从信箱中取信。
用指针R,K分别表示可存信和取信的位置,请用信号量来管理这个信箱,使发信者和收信者能正确工作。
(生产者消费者)semaphore mutex=1,empty=n,full=0;item buffer[n];int in=out=0;void sender(int i){while (1){…Write an mail;wait(empty);wait(mutex);buffer[in]=mail;in=(in+1) mod n;signal(mutex);signal(full);}}void receiver(int i){while (1){...wait(full);wait(mutex);mail=buffer[out];out=(out+1) mod n;signal(mutex);signal(empty);...Deal with the mail;…}}main(){cobegin {sender(i);receiver(i);}}4、考虑三个吸烟者进程和一个经销商进程的系统。
每个吸烟者连续不断地做烟卷并抽他做好的烟卷,做一支烟卷需要烟草、纸和火柴三种原料。
这三个吸烟者分别掌握有烟草、纸和火柴。
经销商源源不断地提供上述三种原料,但他只将其中的两种原料放在桌上,具有另一种原料的吸烟者就可以做烟卷并抽烟,且在做完后给经销商发信号,然后经销商再拿出两种原料放在桌上,如此反复。
试设计一个同步算法来描述他们的活动。
Semaphore SA=SB=SC=0,SD=1;i:integer;void smokerA(){while (1){wait(SA);制烟;signal(SD);吸烟;}}void smokerB(){while (1){wait(SB);制烟;signal(SD);吸烟;}}void smokerC(){while (1){wait(SC);制烟;signal(SD);吸烟;}}Void provider( ){ while(1){i=random(2);wait(SD);switch(i){case'0': signal(SA);case'1': signal (SB);case'2': signal (SC);}Main(){cobegin{somkerA();somkerB();somkerC();provider();}}5、现有四个进程R1、R2、W1、W2,它们共享可以存放一个数的缓冲器B。
进程R1每次把来自键盘的一个数存入缓冲器B中,供进程W1打印输出;进程R2每次从磁盘上读一个数存放到缓冲器B中,供进程W2打印输出。
为防止数据的丢失和重复打印,问怎样用信号量操作来协调这四个进程的并发执行。
semaphore S=1,S1=S2=0;buffer B;void R1(){int x;while(1){接收来自键盘的数;x=接收的数;wait(S);B=x;signal(S1);}}void R2(){int y;while(1){从磁盘上读一个数;y=接收的数;wait(S);B=y;signal(S2);}}void W1(){int k;while(1){wait(Sl);k=B;signal(S);打印k中数;}}void W2(){int j;while(1){wait(S2);j=B;signal(S);打印j中数;}}main(){cobegin{R1();R2();W1();W2();}6、a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab段外等待;当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a点和b点同时驶入,当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab 段行驶。
请用信号量机制为工具,对ab段实现正确管理以保证行驶安全。
Semaphore S1=1,S2=1,Sab=1;int ab=ba=0;void P()ab{while(1){wait(S1);if(ab==0)wait(Sab);ab=ab+1;signal(S1);车辆从a点驶向b点;wait(S1);ab=ab-1;if(ab==0)signal(Sab);signal(S1);}}void P()ba{while(1){wait(S2);if(ba==0)wait(Sab);ba=ba+1;signal(S2);车辆从b点驶向a点;wait(S2);ba=ba-1;if(ba==0)signal(Sab);signal(S2);}}main(){cobegin{();PabP ba ();}}7.复印室里有一个操作员为顾客复印资料,有5把椅子供顾客休息等待复印。
如果没有顾客,则操作员休息。
当顾客来到复印室时,如果有空椅子则坐下来,并唤醒复印操作员;如果没有空椅子则必须离开复印室。
答:Customers表示正在等待复印的顾客数量operator代表操作员状态,只有1和0waiting表示等待的顾客数量mutex事项对waiting的访问;semaphore customers=0,operator=0,mutex=1;waiting=0;process operator( )//操作员进程{ while(1){ wait(customers);//等待顾客到来复印;Signal(Operator);//通知顾客已经完成复印}}process cusotmeri( )//顾客进程i{ wait(mutex);If(waiting<5){waiting++;signal(customers);signal(mutex);wait(operator);wait(mutex);waiting--;signal(mutex);}else{signal(mutex);离开复印室;}}main( ){cobegin{ operator( );cusotmeri( );}}8. 某寺庙有小和尚和老和尚各若干人,水缸一只,由小和尚提水入缸给老和尚饮用。
水缸可容水10桶,水取自同一口水井中。
水井径窄,每次仅能容一只水桶取水,水桶总数为3个。
若每次入、取水仅为1桶,而且不可同时进行。
试用一种同步工具写出小和尚和老和尚入水、取水的活动过程。
互斥资源有水缸和水井,分别用mutex1和mutex2来互斥。
水桶总数仅3只,由信号量count控制,信号量empty和full控制入水和出水量。
semaphore mutex1,mutex2,empty,full,count;mutex1=1;mutex2=1;count=3;empty=10;full=0;process young_monk(int i)(i=1、2、……){While(1){wait(empty);wait(count);wait(mutex1);从井中取水;signal(mutex1);wait(mutex2);倒水入缸;signal(mutex2);signal(count);signal(full);}}process old_monk(int j)j(j=1、2……){While(1){wait(full);wait(count);wait(mutex2);从缸中取水;signal(mutex2);signal(count);signal(empty);}}main(){cobegin{young_monk(i);old_monk(j);}}9. 有一阅览室,共有100个座位。
为了很好地利用它,读者进入时必须先在登记表上进行登记。
该表表目设有座位号和读者姓名,离开时再将其登记项摒除。
试问:(1)为描述读者的动作,应编写几个程序?应设几个进程?它们之间的关系是什么?(2)试用wait、signal操作描述进程之间的同步算法。
11.将只读数据的进程称为“读者”进程,而写或修改数据的进程称为“写者”进程。
允许多个“读者”同时读数据,但不允许“写者”与其他“读者”或“写者”同时访问数据。
另外,要保证:一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。
试用P、V操作正确实现“读者”与“写者”的同步。
【分析】此题是第二类读者-写者问题,即写者优先,与读者优先有一定差别。
为了使写者优先,可在原来的读者优先算法的基础上增加一个互斥信号量s,初值为1,使得当至少有一个写者准备访问共享对象时,它可以使后续的读者进程等待完成;整型变量writecount,初值为0,用来对写者进行计数;互斥信号量mutex,初值为1,用来实现多个读者对写者writecount进行互斥访问。