同步练习答案
- 格式:doc
- 大小:84.50 KB
- 文档页数:12
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();
}
}