操作系统-PV操作题-银行存款问题

问题描述

在操作系统中,进程的同步和互斥是我们进程管理的重点和难点。不仅是本科学习阶段的重点,同时在历年研究生入学考试(408和自主命题)中,用pv操作来实现进程同步和互斥,也经常是一道大题。今天跟大家带来的是一道常规的PV操作-银行存款问题,其实这道题和理发师的思路非常相似。本篇文章跟大家提供两种解题思路。下面请看问题描述:
某银行提供1个服务窗口和10个供客户等待的座位,客户到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位客户使用,当营业员空闲时,通过叫号选取一位客户,并为其服务。

思路一:利用生产消费者

这里可以利用典型的生产者消费者模型,同时增加一个互斥信号量,表示对取号机的互斥使用,在增加一个同步量,表示客户与职员的同步关系。

semaphore empty=10	//空椅子数量
semaphore full=0	//人数
semaphore mutex=1	//互斥信号量,取号机的互斥使用
semaphore service=0	//互斥信号量,取号机的互斥使用

process 客户:
while(1){
	p(empty)		//判断是否有椅子
	p(mutex)
		//取号
	v(mutex)
	v(full)		//人数+1
	P(service)		//等待被服务
}
			
process 职员:
while(1){
	p(full)
	v(empty)
	v(service)
	//服务
}

思路二:现实问题

请大家思考这样一个问题,如果一个客户到来,发现已经没有座位了,可是他还有急事,那么他可以离开吗?按照上面的解决方案,很明显,他需要等着。我们重新修改一下我们的问题——当客户到来,发现没有空座位,则立即离开。
那么我们的解决方案如下:

int chairs=10	//空椅子数量
int count=0	//人数
semaphore mutexPeople=1	//互斥信号量,人数互斥
semaphore customer=0	//人数
semaphore mutex=1	//互斥信号量,取号机的互斥使用
semaphore service=0	//服务

process 客户:
while(1){
	p(mutexPeople)			
		if(wait<chairs):
			waiting++
			v(mutexPeople)
			p(mutex)
				//取号
			v(mutex)
			v(customer)
			P(service)		//等待被服务
		else:
		v(mutexPeople)
		//离开		
}
			
process 职员:
while(1){
	p(customer)
	p(mutexPeople)
		waiting--
	v(mutexPeople)
	V(service)		//服务
}

变种问题:

如果,银行考虑到窗口仅有一个,想提高顾客满意度,增加到三个服务窗口。只需要调整一下信号量,将service改为-3,下面仅给出信号量定义:

int chairs=10	//空椅子数量
int count=0	//人数
semaphore mutexPeople=1	//互斥信号量,人数互斥
semaphore customer=0	//人数
semaphore mutex=1	//互斥信号量,取号机的互斥使用
semaphore service=-3	//服务

总结:

对于银行存款问题,其实是一个理发师问题的变种。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值