操作系统-PV操作-理发师问题

操作系统—PV操作—理发师问题

前言

hello,大家好,使用pv操作来实现进程的同步和互斥是我们本科授课的重点,同时也是研究生入学考试的重点考察题型。今天给大家带来一道常见的pv操作的考题-理发师理发问题,这里的伪代码仅给大家提供一下思路

问题描述

理发店有一间工作室,有一名理发师,接待室内有n(n≥1)把椅子。如果没有顾客,理发师就去睡觉;如果理发师在睡觉;有顾客需要理发,则顾客会唤醒他;如果理发师在忙且接待室有空闲椅子,那么此顾客会坐在其中1把空闲的椅子上等待;如果来时所有椅子都有人,那么顾客离去。请采用信号量机制解决该理发师问题(用伪代码描述)

解决思路

题目中涉及到两个进程,一个理发师进程,一个顾客进程。在分析一下题目中的同步互斥关系:
理发师和顾客之间是同步关系,若理发师睡觉,顾客需要唤醒他,设置一个同步信号量;
设置一个int值,来代表屋子里的椅子数量
设置一个int值来代表人数。
为了实现对人数的增加和减少,设置一个互斥信号量,来对人数进行互斥访问。

伪代码

//理发师问题
int CHAIR=n,waiting=0	//椅子和人数
semaphore mutex=1		//人数的互斥访问
semaphore customer=0	//顾客信号量
semaphore service=0		//同步	

process 顾客:
while(1){
	p(mutex)			
		if(waiting<CHAIR:
			waiting++
			v(mutex)
			v(customer)
			P(service)		//等待被服务
		else:
		v(mutex)
		//离开

}
			
process 理发师:
while(1){
	p(customer)
	p(mutex)
		waiting--
	v(mutex)
	V(service)		//服务
	//理发
}

总结

这个问题与银行存款问题的解决思路高度一致,实际上就是同步和互斥问题的混合应用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值