永发信息网

操作系统中的信号量机制PV操作,理发店问题和生产者消费者问题有何区别

答案:1  悬赏:70  手机版
解决时间 2021-10-14 18:22
  • 提问者网友:富士山上尢
  • 2021-10-13 19:20
操作系统中的信号量机制PV操作,理发店问题和生产者消费者问题有何区别
最佳答案
  • 五星知识达人网友:西风乍起
  • 2021-10-13 19:35
没碰到过理发店问题,我看的书里没提这个问题,百度到了下面这个。不过如果是这个问题的话,跟生产者消费者完全没区别吧……理发师是消费者,顾客是生产者……要求描述理发师和顾客的行为,因此需要两类进程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); //顾客已满,离开}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯