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

本文探讨了操作系统中进程同步的经典案例——银行存款问题。利用PV操作和两种解题思路,详细阐述了如何解决银行存款问题,包括利用生产消费者模型和针对现实场景的改进方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在操作系统中,进程的同步和互斥是我们进程管理的重点和难点。不仅是本科学习阶段的重点,同时在历年研究生入学考试(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	//服务

总结:

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值