同步练习答案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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();

}

}

相关文档
最新文档