收藏 分享(赏)

第3章 部分习题答案.doc

上传人:kpmy5893 文档编号:8420746 上传时间:2019-06-25 格式:DOC 页数:6 大小:45.50KB
下载 相关 举报
第3章 部分习题答案.doc_第1页
第1页 / 共6页
第3章 部分习题答案.doc_第2页
第2页 / 共6页
第3章 部分习题答案.doc_第3页
第3页 / 共6页
第3章 部分习题答案.doc_第4页
第4页 / 共6页
第3章 部分习题答案.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、第 3 章 部分习题答案3.2. 为什么进程在进入临界区之前,应先执行“进入区“代码,在退出临界区后又执行“退出区“代码?为了实现多个进程对临界资源的互斥访问,必须在临界区前面增加一段用于检查欲访问的临界资源是否正被访问的代码,如果未被访问,该进程便可进入临界区对资源进行访问,并设置正被访问标志,如果正被访问,则本进程不能进入临界区,实现这一功能的代码成为“进入区“代码;在退出临界区后,必须执行“退出区“代码,用于恢复未被访问标志. 3.3 同步机构应遵循哪些基本准则?为什么?a. 空闲让进.b. 忙则等待.c. 有限等待.d. 让权等待. 3.6 你认为整型信号量机制和记录型信号量机制,是否

2、完全遵循了同步机构的四条准则?a. 在整型信号量机制中,未遵循“让权等待“的准则.b. 记录型信号量机制完全遵循了同步机构的“空闲让进,忙则等待,有限等待,让权等待“四条准则.3.9 在生产者消费者问题中,如果缺少了 signal(full)或 signal(empty),对执行结果会有何影响?生产者消费者问题可描述如下:var mutex,empty,full: semaphore:=1,n,0;buffer: array0,.,n-1 of item;in,out: integer:=0,0;beginparbeginproducer: beginrepeat.produce an ite

3、m in nextp;.wait(empty);wait(mutex);buffer(in):=nextp;in:=(in+1) mod n;signal(mutex);/* * */signal(full);/* * */until false;endconsumer: beginrepeatwait(full);wait(mutex);nextc:=buffer(out);out:=(out+1) mod n;signal(mutex);/* * */signal(empty);/* * */consume the item in nextc;until false;endparenden

4、d可见,生产者可以不断地往缓冲池送消息,如果缓冲池满,就会覆盖原有数据,造成数据混乱.而消费者始终因 wait(full)操作将消费进程直接送入进程链表进行等待,无法访问缓冲池,造成无限等待. 3.10 在生产者消费者问题中,如果将两个 wait 操作即 wait(full)和 wait(mutex)互换位置;或者是将signal(mutex)与 signal(full)互换位置结果会如何?var mutex,empty,full: semaphore:=1,n,0;buffer: array0,.,n-1 of item;in,out: integer:=0,0;beginparbeginp

5、roducer: beginrepeat.produce an item in nextp;.wait(empty);wait(mutex);buffer(in):=nextp;in:=(in+1) mod n;/* * */signal(full);signal(mutex);/* * */until false;endconsumer: beginrepeat/* * */wait(mutex);wait(full);/* * */nextc:=buffer(out);out:=(out+1) mod n;signal(mutex);signal(empty);consume the it

6、em in nextc;until false;endparendendwait(full)和 wait(mutex)互换位置后,因为 mutex 在这儿是全局变量,执行完 wait(mutex),则 mutex赋值为 0,倘若 full 也为 0,则该生产者进程就会转入进程链表进行等待,而生产者进程会因全局变量mutex 为 0 而进行等待,使 full 始终为 0,这样就形成了死锁.而 signal(mutex)与 signal(full)互换位置后,从逻辑上来说应该是一样的. 3.11 我们为某临界区设置一把锁 W,当 W=1 时,表示关锁;W=0 时,表示锁已打开.试写出开锁原语和关锁

7、原语,并利用它们去实现互斥.开锁原语:unlock(W):W=0;关锁原语:lock(W);if(W=1) do no_op;W=1;利用开关锁原语实现互斥:var W: semaphore:=0;beginparbeginprocess : beginrepeatlock(W);critical sectionunlock(W);remainder sectionuntil false;endparend 3.12 试修改下面生产者消费者问题解法中的错误:producer:beginrepeat.producer an item in nextp;wait(mutex);wait(full)

8、; /* 应为 wait(empty),而且还应该在 wait(mutex)的前面 */buffer(in):=nextp; /* 缓冲池数组游标应前移: in:=(in+1) mod n; */signal(mutex);/* signal(full); */until false;endconsumer:beginrepeatwait(mutex);wait(empty); /* 应为 wait(full),而且还应该在 wait(mutex)的前面 */nextc:=buffer(out);out:=out+1; /* 考虑循环,应改为: out:=(out+1) mod n; */si

9、gnal(mutex);/* signal(empty); */consumer item in nextc;until false;end 3.13 试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法.设初始值为 1 的信号量 cI表示 I 号筷子被拿(I=1,2,3,4,.,2n),其中 n 为自然数.send(I):Beginif I mod 2=1 thenP(cI);P(cI-1 mod 5);Eat;V(cI-1 mod 5);V(cI);elseP(cI-1 mod 5);P(cI);Eat;V(cI);V(cI-1 mod 5);End 3.14 在测量控制系统中的数

10、据采集任务,把所采集的数据送一单缓冲区;计算任务从该单缓冲中取出数据进行计算.试写出利用信号量机制实现两者共享单缓冲的同步算法.int mutex=1;int empty=n;int full=0;int in=0;int out=0;main()cobeginsend();obtain();coendsend()while(1).collect data in nextp;.wait(empty);wait(mutex);buffer(in)=nextp;in=(in+1) mod n;signal(mutex);signal(full);/sendobtain()while(1)wait(

11、full);wait(mutex);nextc:=buffer(out);out:=(out+1) mod n;signal(mutex);signal(empty);culculate the data in nextc;/while/obtain 3.19 什么是 AND 信号量?试利用 AND 信号量写出生产者消费者问题的解法.为解决并行所带来的死锁问题,在 wait 操作中引入 AND 条件,其基本思想是将进程在整个运行过程中所需要的所有临界资源,一次性地全部分配给进程,用完后一次性释放.解决生产者消费者问题可描述如下:var mutex,empty,full: semaphore:=

12、1,n,0;buffer: array0,.,n-1 of item;in,out: integer:=0,0;beginparbeginproducer: beginrepeat.produce an item in nextp;.wait(empty); wait(s1,s2,s3,.,sn); /s1,s2,.,sn 为执行生产者进程除 empty 外其余的条件wait(mutex);buffer(in):=nextp;in:=(in+1) mod n;signal(mutex);signal(full);signal(s1,s2,s3,.,sn);until false;endcons

13、umer: beginrepeatwait(full);wait(k1,k2,k3,.,kn); /k1,k2,.,kn 为执行消费者进程除 full 外其余的条件wait(mutex);nextc:=buffer(out);out:=(out+1) mod n;signal(mutex);signal(empty);signal(k1,k2,k3,.,kn);consume the item in nextc;until false;endparendend 3.21 试比较进程间的低级通信工具与高级通信工具.用户用低级通信工具实现进程通信很不方便,因为其效率低,通信对用户不透明,所有的操作都必须由程序员来实现. 而高级通信工具则可弥补这些缺陷,用户可直接利用操作系统所提供的一组通信命令,高效地传送大量的数据.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报