操作系统-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 //服务
总结:
对于银行存款问题,其实是一个理发师问题的变种。