【操作系统经典问题】理发师问题

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

分析:
(1)设置理发师的资源信号量为barber,初值为初始状态可用的资源数,故设barber初值为0(因为没有顾客的时候理发师在睡觉呀)。
(2)设置顾客的资源信号量为customers,初值为0(刚开始没有顾客来)。
(3)用互斥信号量mutex实现进程互斥。
(4)用变量waiting来记录等待的顾客数,判断有没有空闲椅子。

伪代码如下:

semaphore barber,customers,mutex;
barber = customers = 0,mutex = 1;
int waiting = 0;
parbegin
process barber{
	while(true){
		wait(customers);//barber在等顾客喊他,没有顾客就睡觉
		wait(mutex);//只能被一个顾客叫醒
		waiting=waiting-1;//有顾客将得到服务,有等待区的椅子空出来
		signal(barber);//一个理发师资源被释放
		signal(mutex);
		cut_hair();//理发师在工作
	}	
}
process customers{
	wait(mutex);//一次只能有一个顾客进行以下操作,即访问椅子
	if(waiting<n){//来了个顾客在门口往店里看了看,如果有空闲的椅子
		waiting=waiting+1;//进店坐下了
		signal(customers);//顾客跟理发师打招呼说“我来了”
		signal(mutex);//访问椅子结束
		wait(barber);//等待理发师
		get_haircut();//得到服务
	}else{//看了看发现店里没有位置
		signal(mutex);//走了
	}	
}
parend

更新
最近在考研又看到这题,才发现评论区对于customers这个信号量的设置有很多疑问。首先,空闲椅子的有无影响了等待顾客的数量,而顾客的有无影响了理发师是否开始理发,所以要使用不同的信号量来处理。customers这个信号量的作用,和生产者消费者里面的full的作用差不多。

  • 22
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
Linux理发师问题是一个经典操作系统调度问题,也被称为理发店问题。题目的主要场景是一个理发店,有n个理发师和m个等待理发的客人。当客人进入理发店,如果有空闲的理发师,则客人会被指派给理发师理发,否则就会在等待区等待。当一个理发师完成一位客人的理发后,它会继续为下一个等待的客人服务。在这个问题中,我们需要设计一种合理的调度算法,使所有客人尽可能地得到服务,并且尽量减少等待间。 一种常见的解决方案是使用队列的数据结构来实现调度。我们可以将每个理发师看作一个处理器,每个客人看作一个任务。当客人到来,我们将其加入等待队列中。然后,我们可以使用一种调度算法(例如轮询、最短作业优先等)从队列中选择下一个任务,并将其分配给一个空闲的理发师处理。一旦任务完成,我们就将其从队列中删除,并将理发师标记为空闲状态,以便在下一个任务到来使用。 我们还可以进一步改进这个算法,使其更加高效。例如,我们可以在等待队列中维护客人的等待间,然后选择等待间最长的任务优先执行,以减少等待间。我们还可以使用并行处理技术,将任务划分为多个子任务,并将它们分配给不同的理发师处理,以提高处理速度。 总之,Linux理发师问题是一个实际的调度问题,需要结合实际场景和数据结构设计合理的调度算法,以提高效率和服务质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值