Вы находитесь на странице: 1из 15

Задача об обедающ

философах
Содержание
1. Предыстория
2. Условие задачи
3. Проблемы
4. Варианты
решения
4.1. Официант
4.2. Иерархия
ресурсов
4.3. Решение на
основе монитора
4.4. Темпоральная
логика
Предыстория

В 1965 году Эдсгер Дейкстра не


захотел принимать стандартный

Эд
экзамен у своих студентов.

сге
Вместо этого он предложил им

рД
задачу доступа к ленточному

ей
кст
накопителю.

ра
(1
930
-
200
2)
Предыстория
Ри

Позже Ричард Хоар


чар

переформулировал задачу: теперь


дХ

это задача размышлений и доступа к


оар

бесконечной лапше.
(19
34

Сейчас задача об обедающих


-н.
д.)

философах — классический пример,


используемый в информатике для
иллюстрации проблем
синхронизации при разработке
параллельных алгоритмов и техник
решения этих проблем.
Условие задачи
• Пять безмолвных философов сидят
?
вокруг круглого стола, перед
каждым стоит тарелка спагетти.
Вилки лежат на столе между каждой
парой философов.

• Каждый философ может либо есть,


либо размышлять. Он может есть
только тогда, когда держит две
вилки.

• Философ может взять ближайшую


вилку (если она доступна) или
положить — если он уже держит её.

• Нужно разработать модель


поведения, при котором ни один из
философов не будет голодать, то
есть будет вечно чередовать приём
пищи и размышления.
Проблемы

Взаимная блокировка
является основной идеей
«Проблемы обедающих
философов». Ошибки
философов наглядно
демонстрируют те трудности,
которые возникают в
реальном
программировании, когда
нескольким программам
требуется исключительный
доступ к совместно
используемым ресурсам.
Проблемы

Проблема ресурсного
голодания может возникать
независимо от взаимной
блокировки, если один из
философов не может
завладеть левой и правой
вилкой из-за проблем
синхронизации.
Официант

Иера
Те

рхия
м
по
ра

ресу
ль
аян

рс
ло

ов
ги
ка

Варианты
ра
решения ов е м о ни т о
осн
задачи Реш
ен и е н а
Официант
Философы должны дожидаться
разрешения официанта перед тем,
как взять вилку. Поскольку
официант знает, сколько вилок
используется в данный момент, он
может принимать решения
относительно распределения
вилок и тем самым предотвращать
взаимную блокировку философов.

Предполагается, что философ всегда


пытается сначала взять левую вилку, а потом
— правую (или наоборот).
Официант
Официант работает, как семафор (примитив
синхронизации работы процессов и потоков,
в основе которого лежит счётчик, над
которым можно производить две операции:
увеличение и уменьшение значения на
единицу, при этом операция уменьшения
для нулевого значения счётчика является
блокирующейся).

Если, допустим, четыре философа


держат по одной вилке, то пятому
официант запретит брать вилку,
чтобы не заблокировать остальных.
Иерархия ресурсов
Пусть вилки будут пронумерованы от 1 до 5, и
каждый философ всегда берёт сначала вилку с
наименьшим номером, а потом вилку с наибольшим
номером из доступных. Далее, философ кладёт
сначала вилку с большим номером, потом — с
меньшим.
В этом случае, если четыре из пяти
философов одновременно возьмут
вилку с наименьшим номером, на столе
останется вилка с наибольшим
возможным номером. Только один
философ будет иметь доступ к вилке с
наибольшим номером, так что он
сможет есть двумя вилками. Когда он
закончит, он положит на стол вилку с
большим номером, потом — с
меньшим, позволив другому
приступить к еде.
Иерархия
ресурсов
В то время, как иерархия ресурсов
позволяет избежать взаимных
блокировок, данное решение не всегда
является практичным, в особенности
когда список необходимых ресурсов
неизвестен заранее.

Компьютерные программы, которые


работают с большим количеством записей
в базе данных, не смогут работать
эффективно, если им потребуется выпускать
все записи с верхними индексами прежде,
чем завладеть новой записью. Это делает
данный метод непрактичным.
Решение на
основе монитора
Философы могут есть, если ни один из их
соседей не ест.
Алгоритм монитора реализует схему
«проверить, взять и положить» и
совместно использует
взаимоисключающую блокировку.

Если монитор разрешает философу, желающему


есть, действовать, то философ снова завладевает
первой вилкой, прежде чем взять уже свободную
вторую, и по окончании текущего приёма пищи
оповещает монитора о том, что обе вилки свободны.
Чтобы философ не остался голодным, можно ещё
отслеживать, сколько раз голодный философ ел,
прежде чем он возьмёт первую вилку. Если
философ ел больше раз, чем другие, он тоже не
может приступить к еде.
Темпоральная логика

Ещё один способ решения подобных задач —


задать функции, зависящие от времени.

Для упрощения логических


рассуждений в XX веке была
предложены различные
темпоральные логики — разделы
логики, в которых учитывается
временной аспект. Темпоральные
логики являются частью
философии и широко
применяются в информатике для
решения самых разных задач.

Вам также может понравиться