操作系统中PV操作之顾客理发师问题

 
 

PV操作:对信号量进行相应操作

S:信号量

P:请求操作,相当于S=S-1;S>=0,进程继续进行

V:释放操作,相当于S=S+1,S>0,进程被唤醒

理发师问题 

一个理发师,一把理发椅,n把等候理发的顾客椅子,如果没有顾客则理发师便在理发椅上睡觉 ,当有一个顾客到达时,首先看理发师在干什么,如果理发师在睡觉,则唤醒理发师理发,如果理发师正在理发,则查看是否有空的顾客椅子可坐,  如果有,坐下等待,如果没有,则离开。 

定义信号量:wait=0:顾客信号量   barber=0:理发师信号量

                   custNum:当前顾客数量   mutex=1:互斥量

理发师操作:

Barber(){

while(1){

        P(wait);    //唤醒等待的一位顾客

        P(mutex);  //顾客被唤醒,准备理发,没有顾客,则睡觉

        custNum--;    //当前店里顾客数减1

         V(barber);   //有顾客来了,醒来理发

        V(mettux):   //释放互斥信号量

}

}

顾客操作:

Customer(){

while(1){

P(mutex);    //顾客想要理发

if(custNum<N){   //店里人没有满

     custNum++;

     V(wait);     //理发师睡觉的话,唤醒他理发

     V(mutex);    //释放互斥量,理发这一动作成功

     P(baber);    //理发师进行理发操作

}

else

{

       V(metux);    //释放互斥量,打消进店理发的举动

}

}

}

猜你喜欢

转载自blog.csdn.net/kuishao1314aa/article/details/79716352
今日推荐