Введение

Проблема, используемая для иллюстрации проблем синхронизации и методов их решения

В информатике проблема обедающих философов — это примерная задача, часто используемая при разработке параллельных алгоритмов для иллюстрации проблем синхронизации и способов их решения. Она была впервые сформулирована Эдсгером Дейкстрой в 1965 году в качестве студенческой экзаменационной работы, представленной в терминах компьютеров, конкурирующих за доступ к периферийным устройствам на магнитных лентах. Вскоре после этого Тони Хоар придал задаче её современную формулировку.

Заявление о проблеме

Пять философов обедают за одним столом. У каждого философа есть своя тарелка. Между каждой тарелкой лежит вилка. Подается блюдо – спагетти, которые нужно есть двумя вилками. Каждый философ может только попеременно думать и есть. Более того, философ может есть спагетти только тогда, когда у него есть и левая, и правая вилка. Таким образом, две вилки будут доступны только тогда, когда оба его ближайших соседа думают, а не едят. Когда философ заканчивает есть, он кладет обе вилки обратно. Задача состоит в том, чтобы разработать схему (параллельный алгоритм), гарантирующую, что ни один философ не останется голодным; то есть, каждый сможет бесконечно чередовать еду и размышления, при условии, что ни один философ не знает, когда другие захотят есть или думать (проблема неполной информации).

Решение арбитра

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

Ограничение количества гостей за столом

Решение, предложенное Уильямом Сталлингсом, состоит в том, чтобы допускать за стол не более чем n-1 философов одновременно. Последний философ должен будет ждать (например, используя семафор), пока кто-нибудь не закончит есть, прежде чем "садиться" и запрашивать доступ к вилке. Это гарантирует, что хотя бы один философ всегда сможет получить обе вилки, что позволит системе продвигаться вперед.

Раствор Чанди/Мисры

В 1984 году К. Мани Чанди и Дж. Мисра предложили иное решение проблемы обедающих философов, позволяющее произвольным агентам (с номерами P1, …, Pn) конкурировать за произвольное количество ресурсов, в отличие от решения Дайкстры. Оно также полностью распределено и не требует центрального органа после инициализации. Однако, оно нарушает требование, что "философы не общаются друг с другом" (из-за сообщений запроса). Для каждой пары философов, претендующих на ресурс, создается вилка и передается философу с меньшим идентификатором (n для агента Pn). Каждая вилка может быть чистой или грязной. Изначально все вилки грязные. Когда философ хочет использовать набор ресурсов (то есть, поесть), он должен получить вилки от своих соперничающих соседей. Для всех вилок, которых у философа нет, он отправляет запрос. Когда философ, владеющий вилкой, получает запрос, он оставляет вилку себе, если она чистая, но передает ее, если она грязная. Если философ передает вилку, он очищает ее перед этим. После того, как философ закончил есть, все его вилки становятся грязными. Если другой философ ранее запрашивал одну из вилок, философ, который только что закончил есть, очищает вилку и отправляет ее. Это решение также обеспечивает высокую степень параллелизма и может решить задачу произвольного размера. Оно также решает проблему "голодания". Метки "чистый/грязный" служат способом предоставления приоритета наиболее "голодным" процессам и снижения приоритета процессов, которые только что "поели". Их решение можно сравнить с ситуацией, когда философам не разрешается есть два раза подряд, не предоставляя другим возможность использовать вилки. Решение Чанди и Мисры более гибкое, но содержит элемент, направленный в этом же направлении. В своем анализе они выводят систему уровней приоритета на основе распределения вилок и их состояния (чистые/грязные). Они показывают, что эта система может быть представлена в виде ориентированного ациклического графа, и если это так, то операции в их протоколе не могут превратить этот граф в циклический. Это гарантирует отсутствие взаимоблокировки. Однако, если система инициализирована в полностью симметричное состояние, например, когда все философы держат вилки слева, то граф изначально цикличен, и их решение не может предотвратить взаимоблокировку. Инициализация системы таким образом, чтобы философы с меньшими идентификаторами имели грязные вилки, гарантирует, что граф изначально будет ациклическим.