操作系统笔记——理发师问题

4,498 阅读2分钟

理发师问题

1.问题描述

(1)理发店里有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子
(2)如果没有顾客,理发师便在理发椅上睡觉
(3)一个顾客到来时,它必须叫醒理发师
(4)如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开

2.算法设计

int waiting=0; //等候理发顾客数 
int CHAIRS=N; //为顾客准备的椅子数 
semaphore customers,barbers,mutex; 
customers=0;barbers=0;mutex=1; 

cobegin 
process barber( ) { 
while(true) { 
P(customers); //有顾客吗?若无顾客,理发师睡眠 
P(mutex); //若有顾客时,进入临界区 
waiting--; //等候顾客数少一个 
V(barbers); //理发师准备为顾客理发 
V(mutex); //退出临界区 
cut_hair(); //理发师正在理发(非临界区) 
} 
}

process customer_i( ) { 
P(mutex); //进入临界区 
if(waiting<CHAIRS) { //有空椅子吗 
waiting++; //等候顾客数加1 
V(customers); //唤醒理发师 
V(mutex); //退出临界区 
P(barbers); //理发师忙,顾客坐下等待 
get_haircut(); //否则顾客坐下理发 
} 
else 
V(mutex); //人满了,离开! 
} 
coend 

3.总结

理发师问题和生产者消费者问题在于
(1)当等候理发的凳子被坐满时候,顾客离开,即资源不满足的情况下,进程结束;当缓冲区满的时候,生产者出现等待事件,等到资源满足时往下执行,即资源不满足的情况下,进程等待。
(2)当资源用信号量表示,资源不满足的情况下进程等待,所以理发师问题中,椅子不因该用信号量表示而因该用变量表示,再加上一个互斥信号量。
(3)生产者消费者可以更改公共资源如缓冲区empty当前值,无论资源是否满足;而理发师问题中对于公共的资源椅子,资源条件不满足时,顾客是不能更改waiting的值。