客户在等待困理发师理发期间的信号量值?

问题描述 投票:0回答:1

我正在研究昏昏欲睡的理发师问题中的信号量值。我正在想象一个场景,其中有一个客户已经在理发店里,然后有4个其他客户进入理发店。候诊室可容纳三个座位。我想知道这种情况下理发师已被占用的信号量值。

[我知道,当理发店开张时顾客第一次来时,我最终得到了这些信号量值:

barber = 0
customer = 0
mutex = 1

这是我针对此问题的伪代码:

/* Counting semaphores - the integer value represents the initial count for the semaphores */

Semaphore customer = 0; /* Number of customer waiting for service */
Semaphore barber = 0; /* Number of barber waiting for students */
Semaphore mutex = 1; /* Mutual exclusion when accessing the waiting room */

int waiting = 0; /* Students waiting for turn with professor */

Barber() {
  while (TRUE) {
    wait (customer); /* Go to sleep if no customers */
    wait (mutex); /* Get access to waiting room */
    waiting--; /* Decrement number of waiting customers */
    signal (barber); /* Barber is ready */
    signal (mutex); /* Releasing waiting room */
    #GiveHaircut;
  }
}

Customer() {
  wait (mutex); /* Enter critical section, which is the waiting room */
  if (waiting < 3) { /* If there are free chairs in the waiting room */
    waiting++;
    signal (customer); /* Wake up barber if necessary */
    signal (mutex); /* Release access to count of waiting customers */
    wait (barber); /* Wait for barber if not available */
    #GetHaircut;
  } else {
    signal (mutex); /* Waiting area is full, leave without waiting */
  }
}

[当我尝试跟踪此代码并且理发师已被占用时,我一直在获取barber = -1

我不确定这是否可以作为一个值,只是感到非常困惑,如果有人可以在这种情况下帮助我跟踪伪代码以找到信号量值,我将不胜感激。我只看到有客户进来的示例,但没有其他在线案例。谢谢。

java operating-system deadlock semaphore starvation
1个回答
0
投票

我不确定您的场景中是否有一个或多个理发师,所以我会为您提供两种情况的简短伪代码草稿。在这两种情况下,我们都假设您有一个3座位的候诊室-这意味着您的信号量最大为3,当顾客进来时他们等待一个免费地点,轮到他们理发时,他们会发出信号现在有一个空位。对于席位“资源”,我们将有一个名为seatAvailable的信号灯。理发师唯一的“担心”是他有客户,因此我们将为他介绍一个名为customersAvailable的信号灯。

因此,当您只有一个理发师时,所有客户都在使用与单个理发师相同的“资源”-因此,您需要互斥量信号灯,我们将其称为barberMutex。

一个理发师场景

Semaphore barberMutex = 1
Semaphore customersAvailable = 0
Semaphore seatsAvailable = 3

Barber:
wait(customersAvailable) // wait for customers to show up
# doHaircut...
signal(barberMutex) // after one customer has been served, barber is free

Customer:
wait(seatsAvailable) // wait for an available seat
signal(customersAvailable) // once you've sat signal to you barber that there's customers waiting
wait(barberMutex) // wait if the barber is not free
signal(seatsAvailable) // once it's your turn, you go to barber and there is an open seat
# getHaircut

多个理发师场景在这种情况下,我们有多个理发师,因此我们将没有互斥锁,而是一个信号量,其值为val,其中n是该商店中工作的理发师的数量(在我们的示例中,假设为3,并将其称为信号量barbersAvailable)。

Semaphore barbersAvailable = 3
Semaphore customersAvailable = 0
Semaphore seatsAvailable = 3

Barber:
wait(customersAvailable)
#doHaircut
*signal(barbersAvailable)*

Customer:
wait(seatsAvailable) // wait for an available seat
signal(customersAvailable) // once you've sat signal to you barber that there's customers waiting
*wait(barberAvailable)* // wait for one of the barbers to be free
signal(seatsAvailable) // once it's your turn, you go to barber and there is an open seat
# getHaircut

我一直假设wait忙于等待该资源,在获得资源后,它会降低该信号灯的val,同时signal也会增加该信号灯的val。

© www.soinside.com 2019 - 2024. All rights reserved.