睡眠的理发师问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Albert_1000/article/details/84648436

前言

睡眠的理发师问题是操作系统中P、V操作部分的经典问题


睡眠的理发师问题

1. 问题描述

理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子,要求:

  1. 如果没有顾客,理发师便在理发椅上睡觉
  2. 一个顾客到来时,它必须叫醒理发师
  3. 如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开

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

猜你喜欢

转载自blog.csdn.net/Albert_1000/article/details/84648436