【和尚挑水问题】P\V原语,信号量

1.问题描述
某寺庙,有小和尚、老和尚若干.庙内有一水缸,由小和尚提水入缸,供老和尚饮用。水缸可容纳 10 桶水,每次入水、取水仅为1 桶,不可同时进行。水取自同一井中,水井径窄,每次只能容纳一个水桶取水。设水桶个数为3 个,试用信号量和PV 操作给出老和尚和小和尚的同步算法。
2.问题分析(包括涉及的知识点、制约关系分析、问题的解决思路等)
2.1知识点:
互斥、信号量、P、V原语、同步;
2.2制约关系分析:
水井:小和尚之间互斥;
水缸:小和尚、老和尚之间互斥;
水桶:小和尚、老和尚之间互斥。
2.3信号量设计:
信号量m:
binarysem m=1,代表小和尚从水井提水存在的互斥;
信号量n:
binarysem n=1,代表老和尚从水缸取水、小和尚往水缸倒水;
信号量num:
semaphore num=3,空闲桶的数量;
信号量empty:
semaphore empty=10,代表水缸中还能放几桶水;
信号量full:
semaphore full=0,代表水缸里有几桶水。
2.4问题的解决思路:
大致可以划分成两个进程
2.4.1进程1:小和尚打水倒水
① 若水缸中还能继续入水,则选择空闲的水桶,由于水井径窄,每次只能容纳一个水桶取;所以,当水井无人使用时,从水井里打水。
② 打完水之后,释放水井这个资源,由于水缸每次入水、取水仅为1 桶,且不可同时进行,所以小和尚需要抢占水缸这个资源来倒水,之后释放水缸这个资源,水桶资源也释放,水缸有水。
2.4.2进程2:老和尚喝水
① 若水缸中有水,则选择空闲的水桶,由于水缸每次入水、取水仅为1 桶,且不可同时进行,所以老和尚需要抢占水缸这个资源来取水。
② 老和尚从水缸取完水之后,释放水缸这个资源,水桶资源也释放,empty加1。
3.解决方案(包括所用工具介绍、方案流程图、方案伪代码等)
3.1工具介绍:
jBACI是是一个支持程序并发运行平台。在这个平台上,可以实现操作系统中进程并发、同步等模拟程序的并发执行。jBACI包括了BACI的所有运行程序、C和Pascal编译器、反汇编器、打包工具等核心程序,并可以提供GUI和命令行两种界面来执行程序的并发及其结果的展示,并提供了代码的分部执行功能。
3.2方案流程图:

3.3方案伪代码:
semaphore empty=10,full=0,num=3;
binarysem m=1,n=1;
void young( )
{
while(1)
{
p(empty);
p(num);
p(m);
cout<<“get”<<endl;
v(m);
p(n);
cout<<“put”<<endl;
v(n);
v(num);
v(full);
}
}
void old( )
{
while(1)
{
p(full);
p(num);
p(n);
cout<<“drink”<<endl;
v(n);
v(num);
v(empty);
}
}
void main()
{
cobegin
{
young( );
old( );
}
}
4.实验结果分析(包括结果展示、结果原因刨析等)
4.1结果展示:
在这里插入图片描述

4.2结果原因刨析:
经过测试,程序正常运行、结果正确;
通过运用信号量、P、V原语等知识,解决互斥问

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值