操作系统理发师睡觉问题

1. 问题描述

“理发师睡觉问题”:假设理发店由等待间(n个座位)和理发间(一个座位)构成。无顾客时,理发师睡觉。顾客先进等待间再进理发间,当顾客进入理发间发现理发师在睡觉时,则叫醒理发师。试写出模拟理发师和顾客的程序。

2. 问题分析

如果没有顾客,理发师便在理发间睡觉;当第一个顾客来的时候,叫醒理发师开始理发;如果理发师正在理发,有新顾客来,(1)有空座位,坐下等待;(2)没座位,离开。

理发师和顾客是同步关系,理发师等待顾客来,然后为顾客服务,顾客来了之后叫醒理发师,执行上是有先后顺序的,所以应该有两个同步信号量,且散在两个进程里;另一方面,顾客对椅子的操作又是互斥的,属于竞争关系,所以需要互斥信号量来保证座位的数量准确。

3. 伪代码

理发师的程序:

barber:
do{
	P(sleep); 
	while(customers != 0)//开始理发了,那么在顾客不为0时候,理发师将一直工作
	{
		P(mutex); 
		customers--;
		V(mutex);
		V(cut);
	}//如果顾客数量为0了,那么理发师将经过一个循环后,再次睡觉。
}while(1);

顾客的程序,每一个顾客都有一个程序:

customer

{

       P(mutex);

       if(customers < n)

       {

              customers++;

              V(mutex);

              if(customers == 1) {V(sleep);}//第一个顾客叫醒沉睡的理发师

              P(cut); //被剪头发或者等待剪头发

       }

       else

       {

              V(mutex);//人满了,走人

       }

}
int customers = 0;

semaphore sleep = 0, cut = 1, mutex = 1;

sleep初值为0,理发师开始时在理发间睡觉,直到被叫醒,mutex初值为1,互斥,用于保护customers的数量,cut初值为1,第一个顾客直接理发,后面的顾客要等待,直到理发师理完前面的顾客。

4. end

今天操作系统作业留的一道题,想了蛮久写出来的,发一篇blog记录一下。有问题请指正。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值