Jump to content

Проблема со спящим парикмахером

В информатике проблема спящего парикмахера это классическая проблема межпроцессного взаимодействия и синхронизации , которая иллюстрирует сложности, возникающие при наличии нескольких операционной системы процессов . [1]

Первоначально задача была предложена в 1965 году пионером информатики Эдсгером Дейкстрой . [2] который использовал его, чтобы подчеркнуть, что общие семафоры часто бывают излишними. [3]

Постановка задачи [ править ]

Представьте себе гипотетическую парикмахерскую с одним парикмахером, одним парикмахерским креслом и залом ожидания с n стульями ( n может быть 0) для ожидающих клиентов. Применяются следующие правила: [4]

  • Если клиентов нет, парикмахер засыпает в кресле.
  • Клиент должен разбудить парикмахера, если он спит.
  • Если клиент приходит, пока парикмахер работает, клиент уходит, если все стулья заняты, и садится на пустой стул, если он доступен.
  • Когда парикмахер заканчивает стрижку, он осматривает зал ожидания, чтобы увидеть, есть ли ожидающие клиенты, и засыпает, если их нет. [3] [5]

Есть две основные сложности. Во-первых, существует риск возникновения состояния гонки , когда парикмахер спит, пока клиент ждет, пока парикмахер его пострижет, возникнет из-за того, что все действия — проверка зала ожидания, вход в магазин, взятие стула в зале ожидания — занять определенное время. В частности, клиент может прийти и обнаружить, что парикмахер стрижет волосы, и он возвращается в зал ожидания, чтобы занять место, но, возвращаясь в зал ожидания, парикмахер заканчивает стрижку и идет в зал ожидания, который оказывается пустым (потому что клиент медленно ходит или пошел в туалет) и поэтому засыпает в парикмахерском кресле. Во-вторых, другая проблема может возникнуть, когда два клиента приходят одновременно, когда в зале ожидания есть только одно свободное место и оба пытаются сесть на один стул; сесть сможет только тот, кто первым доберется до стула.

Проблема нескольких спящих парикмахеров имеет дополнительную сложность, связанную с координацией нескольких парикмахеров среди ожидающих клиентов. [6]

Решения [ править ]

Существует несколько возможных решений, но для всех решений требуется мьютекс , который гарантирует, что только один из участников может изменить состояние одновременно. Парикмахер должен получить мьютекс состояния комнаты перед проверкой наличия клиентов и освободить его, когда они начинают спать или стричься; покупатель должен приобрести его перед входом в магазин и отдать, когда он сидит в зале ожидания или в кресле парикмахера, а также когда он покидает магазин из-за отсутствия свободных мест. Это решит обе проблемы, упомянутые выше. ряд семафоров Для индикации состояния системы также требуется . Например, можно сохранить количество людей в зале ожидания.

Реализация [ править ]

Следующий псевдокод гарантирует синхронизацию между парикмахером и клиентом и не допускает взаимоблокировок , но может привести к истощению клиента. Проблему голодания можно решить с помощью «первым пришел – первым обслужен» (FIFO) очереди . Семафор : будет выполнять две функции wait() и signal(), что с точки зрения кода C будет соответствовать P() и V(), соответственно. [ нужна ссылка ]

# The first two are mutexes (only 0 or 1 possible)
Semaphore barberReady = 0
Semaphore accessWRSeats = 1     # if 1, the number of seats in the waiting room can be incremented or decremented
Semaphore custReady = 0         # the number of customers currently in the waiting room, ready to be served
int numberOfFreeWRSeats = N     # total number of seats in the waiting room

def Barber():
  while true:                   # Run in an infinite loop.
    wait(custReady)             # Try to acquire a customer - if none is available, go to sleep.
    wait(accessWRSeats)         # Awake - try to get access to modify # of available seats, otherwise sleep.
    numberOfFreeWRSeats += 1    # One waiting room chair becomes free.
    signal(barberReady)         # I am ready to cut.
    signal(accessWRSeats)       # Don't need the lock on the chairs anymore.
    # (Cut hair here.)

def Customer():
  while true:                   # Run in an infinite loop to simulate multiple customers.
    wait(accessWRSeats)         # Try to get access to the waiting room chairs.
    if numberOfFreeWRSeats > 0: # If there are any free seats:
      numberOfFreeWRSeats -= 1  #   sit down in a chair
      signal(custReady)         #   notify the barber, who's waiting until there is a customer
      signal(accessWRSeats)     #   don't need to lock the chairs anymore
      wait(barberReady)         #   wait until the barber is ready
      # (Have hair cut here.)
    else:                       # otherwise, there are no free seats; tough luck --
      signal(accessWRSeats)     #   but don't forget to release the lock on the seats!
      # (Leave without a haircut.)

См. также [ править ]

Ссылки [ править ]

  1. ^ Джон Х. Рейнольдс (декабрь 2002 г.). «Линда будит спящего парикмахера» (PDF) . Материалы зимней симуляционной конференции . Том. 2. Сан-Диего, Калифорния: IEEE. стр. 1804–1808. дои : 10.1109/WSC.2002.1166471 . ISBN  0-7803-7614-5 . S2CID   62584541 . Проверено 8 января 2022 г.
  2. ^ Аллен Б. Дауни (2016). Маленькая книга семафоров (PDF) (изд. 2.2.1). Пресс для зеленого чая. п. 121 . Проверено 8 января 2022 г.
  3. Перейти обратно: Перейти обратно: а б Эдсгер В. Дейкстра (1965). Технический отчет EWD-123: Взаимодействующие последовательные процессы . Эйндховен, Нидерланды: Технологический университет Эйндховена. п. 38 . Проверено 8 января 2022 г.
  4. ^ Эндрю С. Таненбаум (2001). Современные операционные системы (PDF) (2-е изд.). Река Аппер-Седл, Нью-Джерси: Пирсон. п. 129. ИСБН  9780130313584 . Архивировано из оригинала (PDF) 8 января 2022 года . Проверено 8 января 2022 г.
  5. ^ Сотрудничающие последовательные процессы Э. В. Дейкстры. Технический отчет EWD-123, 1965 г., Технологический университет Эйндховена, Нидерланды.
  6. ^ Фукуда, Мунехиро. «Программа 2: Проблема спящих парикмахеров» (PDF) . Университет Вашингтона . Проверено 8 января 2022 г.

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 017236b5ea1fd1f79d939c4b85c03983__1709272860
URL1:https://arc.ask3.ru/arc/aa/01/83/017236b5ea1fd1f79d939c4b85c03983.html
Заголовок, (Title) документа по адресу, URL1:
Sleeping barber problem - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)