java取水_本科操作系统课练习2(和尚取水问题-信号量)

参考资料:

https://zhidao.baidu.com/question/1836190443679119980.html

https://blog.csdn.net/weixin_42664622/article/details/100899073

P操作和V操作的意思:

简单来说,P(S)表示S自减1,V(S)表示S自增1

具体而言

P操作顺序执行下述两个动作:

①信号量的值减1,即S=S-1;

②如果S≥0,则该进程继续执行;

如果S<0,则把该进程的状态置为阻塞态,把相应的PCB连入该信号量队列的末尾,并放弃处理机,进行等待(直至其它进程在S上执行V操作,把它释放出来为止)。

V操作顺序执行下述两个动作:

①S值加1,即S=S+1;

②如果S>0,则该进程继续运行;

如果S≤0,则释放信号量队列上的第一个PCB(即信号量指量指针项所指向的PCB)所对应的进程(把阻塞态改为就绪态),执行V操作的进程继续运行。

和尚取水问题

某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可以同时进行。试用P、V操作给出小和尚、老和尚动作的算法描述。

题目解析

n个小和尚从井里面提水进程之间互斥,用 mutex1 来表示;

n个小和尚将水倒在缸里、n个老和尚从缸里面取水,这些进程互斥,用 mutex2 来表示;

不管是谁要使用水桶都要确认空闲水桶的数量,用 amount 来表示;

用 full 来表示水缸里面有几桶水,用 empty 来表示水缸里面还能放几桶水;

代码(伪)

semaphore mutex1=1,mutex2=1;

semaphore amount=3,empty=10,full=0;

void XiaoHeShangX()//X=1,2,3,,,n

{

while(TRUE)

{

P(empty);

p(amount);

P(mutex1);

从井里打水;

V(mutex1);

P(mutex2);

往缸里面倒水;

V(mutex2);

V(amount);

V(full);

}

}

void LaoHeShangX()//X=1,2,3,,,n

{

while(TRUE)

{

P(full);

P(amount);

P(mutex2);

从缸里面取水使用;

V(mutex2);

V(amount);

V(empty);

}

}

void mian()

{

cobegin

XiaoHeShangX();//X=1,2,3,,,n

LaoHeShangX();//X=1,2,3,,,n

coend

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值