例题以及习题pv操作3.docx

上传人:罗晋 文档编号:8630300 上传时间:2020-12-07 格式:DOCX 页数:4 大小:15.61KB
返回 下载 相关 举报
例题以及习题pv操作3.docx_第1页
第1页 / 共4页
例题以及习题pv操作3.docx_第2页
第2页 / 共4页
例题以及习题pv操作3.docx_第3页
第3页 / 共4页
例题以及习题pv操作3.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《例题以及习题pv操作3.docx》由会员分享,可在线阅读,更多相关《例题以及习题pv操作3.docx(4页珍藏版)》请在三一文库上搜索。

1、【实战 3】理发师问题理发店有一位理发师、一把理发椅及三把供等候理发的顾客坐的椅子。如果没有顾客,理发师就去睡觉。如果顾客来时所有的椅子都有人,那么顾客就离去。如果理发师在忙而有空闲的椅子,那么顾客就会坐在其中的一个空闲的椅子上。如果理发师在睡觉,顾客会唤醒他。请利用信号量 ( semaphores),写个程序来协调理发师和顾客进程。【浙江大学2007】int count=0;/记录理发店里的顾客数量semaphore mutex=1;/用于互斥访问count 变量所用的信号量semaphore barber_chair=0;/semaphore wait_chair=3;/顾客等待时可坐的椅

2、子semaphore ready=0;/坐在等候椅子上等待理发的顾客数量Barber()/ 理发师进程while(1)wait(ready);/是否有顾客在等待理发,没有则阻塞signal(barber_chair );/ 请等待时间最长的顾客坐到理发椅上signal(wait_chair );/坐到理发椅上的顾客让出一个等待时可坐的椅子barbering/给顾客理发Customer()/ 顾客进程 iwait(mutex);if(count=4) /如果理发店已经有四个顾客了 signal(mutex);leave /走人else/理发店里顾客不足 4 个 count+; /更新顾客人数 s

3、ignal(mutex);1wait(wait_chair);/先请求坐等待时坐的椅子signal(ready);/告诉理发师又有一位顾客准好了,等待理发wait(barber_chair);/再请求坐理发椅be barberedwait(mutex);count-;/更新店里的顾客人数signal(mutex);2【练习 1】 如图所示,有多个 PUT 操作同时向 BUFF1 放数据,有一个 MOVE 操作不断地将 BUFF1 的数据移到 BUFF2 ,有多个 GET 操作不断地从 BUFF2 中将数据取走。BUFF1 的容量为m, BUFF2 的容量是n, PUT 、 MOVE 、 GET

4、 每次操作一个数据,在操作的过程中要保证数据不丢失。试用P、 V 原语协调PUT 、 MOVE的操作,并说明每个信号量的含义和初值。PUTMOVEGETBuff1Buff2进程操作图【分析】 这里存在两个一般意义的“生产者 消费者” 问题, PUT(生产者) 与 MOVE(消费者)之间,需要设置三个信号量;MOVE (生产者)与GET (消费者)之间,需要设置三个信号量。PUT 进程套用生产者进程即可,MOVE进程只有在Buff1 有新数据且Buff2 有空闲区的时候才移动数据,GET 进程套用消费者进程即可。答案:设置 6 个信号量 full1、 empty1、 B-M1 、full2 、

5、empty2、 B-M2 ,它们的含义和初值如下:1) full1 表示 Buff1 是否有数据,初值为 0;2) empty1 表示 Buff1 有空间,初值为 m;3)B-M1 表示 Buff1 是否可操作,初值为1;4)Full2 表示 Buff2 是否有数据,初值为0;5) Empty2 表示 Buff2 有空间,初值为 n;6)B-M2 表示 Buff2 是否可操作,初值为1;repeatP(empty1) ;/* 判断 Buff1 是否有空间,没有则等待*/P(B-M1) ;/* 是否可操作 Buff1*/PUT ;V(B-M1) ;/* 设置 Buff1 可操作标志*/V(ful

6、l1) ;/* 设置 Buff1 有数据的标志*/until falserepeatP(full1) ;/* 判断 Buff1 是否有数据,没有则等待*/P(empty2) ;/* 判断 Buff2 是否有空间,没有则等待*/P(B-M1) ;/* 是否可操作 Buff1*/P(B-M2) ;/* 是否可操作 Buff2*/MOVE ;V(B-M1) ;/* 设置 Buff1 可操作标志 */V(B-M2) ;/* 设置 Buff2 可操作标志 */3V(empty1) ;/* 设置 Buff1 有空间标志 */V(full2) ;/* 设置 Buff2 有数据标志 */until falserepeatP(full2) ;/* 判断 Buff2 是否有数据,没有则等待*/P(B-M2) ;/* 是否可操作Buff2*/GET ;V(B-M2) ;/* 设置 Buff2 可操作标志*/V(empty2) ;/* 设置 Buff2 有空间的标志*/until false4

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

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1