欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

睡眠的理发师问题

程序员文章站 2022-07-05 08:04:24
...

前言

睡眠的理发师问题是操作系统中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