睡眠的理发师问题
程序员文章站
2022-07-05 08:04:24
...
前言
睡眠的理发师问题是操作系统中P、V操作部分的经典问题
睡眠的理发师问题
1. 问题描述
理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子,要求:
- 如果没有顾客,理发师便在理发椅上睡觉
- 一个顾客到来时,它必须叫醒理发师
- 如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开
2. 问题分析
理发师和顾客是同步关系,理发师等待顾客来,然后为顾客服务,顾客来了之后叫醒理发师,执行上是有先后顺序的,所以应该有两个同步信号量,且散在两个进程里;另一方面,顾客对椅子的操作又是互斥的,属于竞争关系,所以需要互斥信号量来保证椅子的数量准确。
3. P、V操作
int waiting = 0; // 等候理发师 顾客坐的椅子数
int CHAIRS = N; // 为顾客准备的椅子数
semaphore customers = 0; // 等候的顾客数
semaphore barbers = 0; // 空闲的理发师数
semaphore mutex = 1; // 互斥信号量,保证waiting++操作完整进行
cobegin
process barber() { // 理发师
while(true) {
P(customers); // 有顾客吗?若无顾客,理发师睡眠
P(mutex); // 保证waiting--完整进行
// 若有顾客时,进入临界区
waiting--; // 等候区顾客数减一
V(barbers); // 理发师准备为顾客理发
V(mutex);
cut_hair(); // 理发师正在理发(非临界区)
}
}
process customer_i() { // 顾客
P(mutex); // 进入临界区
if(waiting < CHAIRS) { // 有空椅子
waiting++; // 等候顾客加一
V(customers); // 唤醒理发师
V(mutex); // 退出临界区
P(barbers); // 理发师忙,顾客坐下等待
get_haircut();// 否则顾客坐下理发
} else
V(mutex); // 没椅子,顾客走人
}
coend
d=====( ̄▽ ̄*)b