汤子瀛 - 计算机操作系统第三版习题答案+复习重点(临考必备)(3)

2019-01-12 14:05

/* ************** */ signal(full); /* ************** */ until false; end

consumer: begin repeat wait(full); wait(mutex); nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); /* ************** */ signal(empty); /* ************** */ consume the item in nextc; until false; end parend end

可见,生产者可以不断地往缓冲池送消息,如果缓冲池满,就会覆盖原有数据,造成数据混乱.而消费者

始终因wait(full)操作将消费进程直接送入进程链表进行等待,无法访问缓冲池,造成无限等待. 7. 在生产者-消费者问题中,如果将两个wait操作即wait(full)和wait(mutex)互换位置;或者是将signal(mutex)与signal(full)互换位置结果会如何?

var mutex,empty,full: semaphore:=1,n,0; buffer: array[0,...,n-1] of item; in,out: integer:=0,0; begin parbegin producer: begin repeat . .

produce an item in nextp; . .

wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n;

/* ***************** */ signal(full); signal(mutex);

/* ***************** */ until false; end

consumer: begin repeat

/* **************** */ wait(mutex); wait(full);

/* **************** */ nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty);

consume the item in nextc; until false; end parend end

wait(full)和wait(mutex)互换位置后,因为mutex

在这儿是全局变量,执行完wait(mutex),则mutex赋值为0,倘若full也为0,则该生产者进程就会转入进程链表进行等待,而生产者进程会因全局变量mutex为0而进行等待,使full始终为0,这样就形成了死锁.

而signal(mutex)与signal(full)互换位置后,从逻辑上来说应该是一样的.

8. 我们为某临界区设置一把锁W,当W=1时,表示关锁;W=0时,表示锁已打开.试写出开锁原语和关锁原语,并利用它们去实现互斥. 开锁原语: unlock(W): W=0; 关锁原语: lock(W);

if(W==1) do no_op; W=1;

利用开关锁原语实现互斥: var W: semaphore:=0; begin parbegin process :

begin repeat lock(W);

critical section unlock(W); remainder section until false; end parend

9. 试修改下面生产者-消费者问题解法中的错误: 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);


汤子瀛 - 计算机操作系统第三版习题答案+复习重点(临考必备)(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:许国璋英语第二册第二单元(6至10课)练习

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: