操作系统作业.docx

上传人:pu****.1 文档编号:547920228 上传时间:2022-10-26 格式:DOCX 页数:4 大小:18.78KB
返回 下载 相关 举报
操作系统作业.docx_第1页
第1页 / 共4页
操作系统作业.docx_第2页
第2页 / 共4页
操作系统作业.docx_第3页
第3页 / 共4页
操作系统作业.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《操作系统作业.docx》由会员分享,可在线阅读,更多相关《操作系统作业.docx(4页珍藏版)》请在金锄头文库上搜索。

1、2.8.在生产者消费者问题中,如果缺少了signal(full)或signal(empty),对执行结果将会有何影响?如果缺少了signal(full),那么表明从第一个生产者进程开始就没有对信号量full值改变,即使缓冲池存放的产品已满了,但full的值还是0,这样消费者进程在执行wait(full)时会认为缓冲池是空的而取不到产品,那么消费者进程则会一直处于等待状态。 如果缺少了signal(empty),例如在生产者进程向n个缓冲区投满产品后消费者进程才开始从中取产品,这时empty=0,full=n,那么每当消费者进程取走一个产品时empty并没有被改变,直到缓冲池中的产品都取走了,e

2、mpty的值也一直是0,即使目前缓冲池有n个空缓冲区,生产者进程要想再往缓冲池中投放产品会因申请不到空缓冲区而被阻塞。2.9在生产者消费者问题中,如果将两个wait操作即wait(full)和wait(mutex)互换位置,或者将signal(mutex)和signal(full)互换位置,结果会如何?在生产者消费者问题中,如果将两个wait操作,即wait(full)和wait(mutex)互换位置后,可能引起死锁。考虑系统中缓冲区全满时,若一生产者进程先执行了wait(mutex)操作并获得成功,则当再执行wait(empty)操作时,它将因失败而进入阻塞状态,它期待消费者进程执行sign

3、al(empty)来唤醒自己,在此之前,它不可能执行signal(mutex)操作,从而使试图通过执行wait(mutex)操作而进入自己的临界区的其他生产者和所有消费者进程全部进入阻塞状态,这样容易引起系统死锁。 若signal(mutex)和signal(full)互换位置后只是影响进程对临界资源的释放次序,而不会引起系统死锁,因此可以互换位置。2.10我们为某临界资源设置一把锁W,当W=1时表示关锁;当W=0时表示锁已打开,试写出开锁和关锁原语,并利用它们去实现互斥。 整型信号量:lock(W): while W=1 do no-op W:=1; unlock(W): W:=0; 记录型

4、信号量:lock(W): W:=W+1; if(W1) then block(W.L) unlock(W): W:=W-1; if(W0) then wakeup(W.L)例子: Var W:semaphore:=0; begin repeat lock(W); critical section unlock(W); remainder section until false; end2.11试修改下面生产者消费者问题解法中的错误:producer: begin repeat produce an item in nextp; wait(mutex); wait(full);buffer(in

5、):=nextp;signal(mutex); until false; end consumer:begin repeat wait(mutex); wait(empty); nextc:=buffer(out);out:=out+1;signal(mutex);consume item in nextc; until false; end2.12 试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法。三种解决方法中的任意一种即可(略)。P62答:Varchopstick:array0,4ofsemaphore;所有信号量均被初始化为1,第i位哲学家的活动可描述为:RepeatWai

6、t(chopsticki);Wait(.chopstick(i+1)mod5);Ea.tSignal(chopsticki);Signal(chopstick(i+1)mod5)Ea.tThink;Untilfalse;2.13 在测量控制系统中的数据采集任务时,把所采集的数据送往一单缓冲区;计算任务从该单缓冲区中取出数据进行计算。试写出利用信号量机制实现两任务共享单缓冲区的同步算法。a. Var mutex, empty, full: semaphore:=1, 1, 0; gather:begin repeat gather data in nextp; wait(empty); wait

7、(mutex);buffer:=nextp;signal(mutex);signal(full);until false; end compute:begin repeat wait(full); wait(mutex);nextc:=buffer;signal(mutex);signal(empty); compute data in nextc;until false; endb. Var empty, full: semaphore:=1, 0; gather:begin repeat gather data in nextp; wait(empty); buffer:=nextp;signal(full);until false; endcompute:begin repeat wait(full); nextc:=buffer;signal(empty); compute data in nextc;until false; end

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号