Fork me on GitHub

睡眠的理发师问题

前言

睡眠的理发师问题是操作系统中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
posted @   克拉默与矩阵  阅读(1543)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示