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记录一下。有问题请指正。