{ int t, u; wait(s); x=0; t=0; if(x<1) t=t+z; u=t; signal(s); }
void main( )
{ parbegin(P1( ), P2( )); }
(6)共享存储区通信是如何实现的?
(7)假设某系统未直接提供信号量机制,但提供了进程通信工具。如果某程序希望使用关于信号量的wait、signal操作,那么该程序应如何利用通信工具模拟信号量机制?要求说明如何用send/receive操作及消息表示wait/signal操作及信号量。 5.应用题
(1)有三个并发进程R、W1和W2,共享两个各可存放一个数的缓冲区B1、B2。进程R每次从输入设备读入一个数,若读入的是奇数,则将它存入B1中,若读入的是偶数,将它存入B2中;当B1中有数,由进程W1将其打印输出;当B2中有数,进程W2将其打印输出。试编写保证三者正确工作的程序。
struct semaphone B1_Empty, B1_Full, B2_Empty, B2_Full; B1_Empty.value=1; B1_Full.value=0; B2_Empty.value=1; B2_Full.value=0; void R( ) { int a; While(1)
{ read a number a; if(a%2==1) { wait(B1_Empty);
put a in B1; signal(B1_Full);
} else
{ wait(B2_Empty);
put a in B2; signal(B2_Full);
} } } void W1( ) { while(1)
{ wait(B1_Full); print a number from B1; signal(B1_Empty); } }
void W2( ) { while(1) { wait(B2_Full); print a number from B2; signal(B2_Empty); } }
void main( )
{ parbegin(R( ), W1( ), W2( )); }
(2)8个协作的任务A、B、C、D、E、F、G、H分别完成各自的工作。它们满足下列条件:任务A必须领先于任务B、C和E;任务E和D必须领先于任务F;任务B和C必须领先与任务D;而任务F必须领先于任务G和H。试写出并发程序,使得在任何情况下它们均能正确工作。
(3)多个进程共享一个文件,其中只读文件的称为读者,只写文件的称为写者。读者可以同时读,但写者只能独立写。问:
1)说明进程间的制约关系,应设置哪些信号量? 2)用wait、signal操作写出其同步程序。
3)修改上述算法,使得它对写者优先,即一旦有写者到达,后续的读者必须等待。而无论是否有读者在读文件。
见教材“读者-写者问题”
(4)桌上有一空盘,可放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子;儿子专等吃盘中的桔子;女儿专等吃盘中的苹果。规定一次只能放一只水果,试写出爸爸、儿子、女儿正确同步的程序。
struct semaphone plate, apple, orange; plate.value=1; apple.value=0; orange.value=0; void father( ) { while(1)
{ prepare an apple or orange; wait(plate); put the apple or orange in plate; if(Apple) signal(apple); //如果放的是苹果 else signal(orange); //如果放的是桔子 }
} void son( ) { while(1)
{ wait(orange); get an orange from the plate; signal(plate); } }
void daughter( ) { while(1) { wait(apple); get an apple from the plate; signal(plate); } }
Void main( )
(5)三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用procuce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述(2009年全国硕士研究生入学考试题)。
struct semaphone full_odd, full_even, mutex, empty; full_odd.value=0; full_even.value=0; mutex.value=1; empty.value=N; void P1( ) { int X; while(1)
{ X=produce( ); wait(empty); wait(mutex); put( ); if(X%2==0) signal(full_even); else signal(full_odd); signal(mutex); } }
void P2( )
{ wait(full_odd); wait(mutex); getodd( );
countodd( )=countodd( )+1; signal(empty); signal(mutex); }
void P3( )
{ wait(full_even); wait(mutex); geteven( ); counteven( )=counteven( )+1; signal(empty); signal(mutex); }
void main( )
{ parbegin(P1( ), P2( ), P3( )); }
(6)放小球问题:一个箱子里只有白色和黑色两种小球,且数量足够多。现在需要从中取出一些小球放入一个袋子中。约定:1)一次只能放入一个小球;2)白球的数量至多只能比黑球少N个,至多只能比黑球多M个(M,N为正整数)。请用信号量机制实现进程的同步与互斥。
struct semaphone mutex1, mutex2; int black=0, white=0; mutex1.value=1; mutex2.value=1; void put( ) { while(1)
{ wait(mutex1);
get a black ball or white ball from the box; signal(mutex1); wait(mutex2);