操作系统中的信号量机制PV操作,理发店问题和生产者消费者问题有何区别
展开全部
没碰到过理发店问题,我看的书里没提这个问题,百度到了下面这个。
不过如果是这个问题的话,跟生产者消费者完全没区别吧……理发师是消费者,顾客是生产者……
要求描述理发师和顾客的行为,因此需要两类进程Barber ()和Customer()分别描述理发师和顾客的行为。理发师和顾客之间是同步的关系,理发师和椅子是临界资源,所以顾客之间是互斥的关系。
引入3个信号量和一个控制变量:
1) 控制变量waiting也用于记录等候的顾客数,实际上是customers的一份拷贝。之所以使用waiting是因为无法读取信号量的当前值,初值均为0。
2)信号量customers用来记录等候理发的顾客数(不包括正在理发的顾客),并用作阻塞理发师进程,初值为0。
3)信号量barbers用来记录正在等候顾客的理发师数(为0或1),并用作阻塞顾客进程,初值为0。
4)信号量mutex用于互斥,初值为1。
进入理发店的顾客必须先看等候的顾客数,如果少于椅子数(n),他坐下来等,否则他就离开。
PV操作代码如下
int waiting=0 ; //等候理发的顾客数(还没理发的), 0~n
semaphore customers=0, barbers=0, mutex=1;
barber() {
while(TRUE) //理完一人,还有顾客吗?
{ P(customers); //若无顾客,理发师睡眠
P(mutex); //进程互斥
waiting := waiting – 1; //等候顾客数少一个
V(barbers); //理发师去为一个顾客理发
V(mutex); //开放临界区
cut-hair( ); //正在理发(非临界区操作)
}
}
customer() { //顾客进入理发店
P(mutex); //进程互斥
if (waiting < n)
{ //还有空位
waiting := waiting+1; //等候顾客数加1
V(customers); //有顾客了,如果理发师在睡则唤醒
V(mutex); //开放临界区
P(barbers); //无理发师, 顾客坐着养神
get-haircut( ); //一个顾客坐下等待理发/
}
else V(mutex); //顾客已满,离开
}
不过如果是这个问题的话,跟生产者消费者完全没区别吧……理发师是消费者,顾客是生产者……
要求描述理发师和顾客的行为,因此需要两类进程Barber ()和Customer()分别描述理发师和顾客的行为。理发师和顾客之间是同步的关系,理发师和椅子是临界资源,所以顾客之间是互斥的关系。
引入3个信号量和一个控制变量:
1) 控制变量waiting也用于记录等候的顾客数,实际上是customers的一份拷贝。之所以使用waiting是因为无法读取信号量的当前值,初值均为0。
2)信号量customers用来记录等候理发的顾客数(不包括正在理发的顾客),并用作阻塞理发师进程,初值为0。
3)信号量barbers用来记录正在等候顾客的理发师数(为0或1),并用作阻塞顾客进程,初值为0。
4)信号量mutex用于互斥,初值为1。
进入理发店的顾客必须先看等候的顾客数,如果少于椅子数(n),他坐下来等,否则他就离开。
PV操作代码如下
int waiting=0 ; //等候理发的顾客数(还没理发的), 0~n
semaphore customers=0, barbers=0, mutex=1;
barber() {
while(TRUE) //理完一人,还有顾客吗?
{ P(customers); //若无顾客,理发师睡眠
P(mutex); //进程互斥
waiting := waiting – 1; //等候顾客数少一个
V(barbers); //理发师去为一个顾客理发
V(mutex); //开放临界区
cut-hair( ); //正在理发(非临界区操作)
}
}
customer() { //顾客进入理发店
P(mutex); //进程互斥
if (waiting < n)
{ //还有空位
waiting := waiting+1; //等候顾客数加1
V(customers); //有顾客了,如果理发师在睡则唤醒
V(mutex); //开放临界区
P(barbers); //无理发师, 顾客坐着养神
get-haircut( ); //一个顾客坐下等待理发/
}
else V(mutex); //顾客已满,离开
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询