操作系统第二次作业题答案(第二章与第三章).doc
文本预览下载声明
1、p82第24题答案:
将wait(mutex)互换位置后,可能引起死锁,当系统中缓冲区满时,若一生产者进程先执行wait(mutex)操作并获得成功,则当再执行wait(empty)操作时,它将因为失败而进入阻塞状态,它期待消费者进程执行signal(empty)来唤醒自己,在此之前,它不可能执行signal(mutex)操作,从而使试图通过执行wait(mutex)操作而进入自己的临界区的其他生产者和所有消费者进程全部进入阻塞状态,这样易引起系统死锁。
若signal(mutex)和signal(full)互换位置后,只是影响进程对临界资源的释放次序,而不会引起系统死锁,因此可以互换位置。
说明:该答案由2011计应1班课程研习社社长扈艳风提供
读者与写者问题:
写者优先:
Semaphore rw=1,r=1,nr=1;
Int count=0;
Reader ()//读者
{
Do
{
Wait(rw);
Wait(r);
Count++;
If(count==1)
Wait(nr)
Signal(r);
Signal(rw);
读
……
Count--;
If(count==0)
Signal(nr);
Signal(r);
}while(1);
}
Writer()//写者
{
Do
{
Wait(rw);
Wait(nr);
写
Signal(nr);
Signal(rw);
}while(1);
}
说明:该答案由2011计应1班课程研习社社长扈艳风提供
3、p82第22题答案:
答(1)
Var a, b, c, d, e, f, g, h; semaphore:= 0, 0, 0, 0, 0, 0, 0, 0;
begin
parbegin
begin S1; signal(a); signal(b); end;
begin wait(a); S2; signal(c); signal(d); end;
begin wait(b); S3; signal(e); end;
begin wait(c); S4; signal(f); end;
begin wait(d); S5; signal(g); end;
begin wait(e); S6; signal(h); end;
begin wait(f); wait(g); wait(h); S7; end;
parend
end
(2)
Var a, b, c, d, e, f, g, h,i,j; semaphore:= 0, 0, 0, 0, 0, 0, 0,0,0, 0;
begin
parbegin
begin S1; signal(a); signal(b); end;
begin wait(a); S2; signal(c); signal(d); end;
begin wait(b); S3; signal(e); signal(f); end;
begin wait(c); S4; signal(g); end;
begin wait(d); S5; signal(h); end;
begin wait(e); S6; signal(i); end;
begin wait(f); S7; signal(j); end;
begin wait(g);wait(h); wait(i); wait(j); S8; end;
parend
end
注意:该题目需要画出前驱图,同时在图上标注出a,b,c,d,e,f……等信号量来
4、p82 第26题答案:
答
producer:
begin
repeat
……
producer an item in nextp;
wait(mutex);
wait(full); /* 应为wait(empty),而且还应该在wait(mutex)的前面 */
buffer(in):=nextp; /* 缓冲池数组游标应前移: in:=(in+1) mod n; */
signal(mutex); /* signal(full); */
until false;
end
consumer:
begin
repeat
wait(mutex);
wait(empty); /* 应为wait(full),而且还应该在wait(mutex)的前面 */
nextc:=buffer(out);
out:=out+1; /* 考虑循环应改为: out:=(out+1) mod n; */
signal(mutex);/*
显示全部