
- •Кафедра информатики
- •Курсовая работа
- •По программированию
- •Задача об обедающих мудрецах
- •Оглавление
- •1. Постановка задачи
- •1.1. Задание Задача об обедающих мудрецах
- •1.2. Алгоритмическое решение задачи
- •1.2.1 Решение задачи
- •1.3. Контрольные примеры
- •1. Официант
- •2. Иерархия ресурсов
- •3. Монитор
- •2. Решение задачи
- •2.1. Выбор средств реализации
- •2.2. Описание основных классов
- •2.3 Интерфейс приложения
- •3. Тестирование приложения
- •3.1. Контрольный робот
- •3.2. Работа приложения на контрольных тестах
- •3.3. Результаты работы
1.3. Контрольные примеры
Протестируем различные возможные решения задачи:
1. Официант
Чтобы показать, как это решение работает, предположим, что философы обозначены от А до Д по часовой стрелке. Если философы А и В едят, то заняты четыре вилки. Философ Б сидит между А и В, так что ему недоступна ни одна из вилок. В то же время, философы Г и Д имеют доступ к одной неиспользуемой вилке между ними. Предположим, что философ Г хочет есть. Если он тут же берёт свободную вилку, то становится возможна взаимная блокировка философов. Если вместо этого он спрашивает разрешения у официанта, то тот просит его подождать — и можно быть уверенным в том, что как только пара вилок освободится, то по крайней мере один философ сможет взять две вилки. Таким образом, взаимная блокировка становится невозможной.
2. Иерархия ресурсов
Пусть ресурсы (вилки) будут пронумерованы от 1 до 5, и каждая рабочая единица (философ) всегда берёт сначала вилку с наименьшим номером, а потом вилку с наибольшим номером из двух доступных. Далее, философ кладёт сначала вилку с бо́льшим номером, потом — с меньшим. В этом случае, если четыре из пяти философов одновременно возьмут вилку с наименьшим номером, на столе останется вилка с наибольшим возможным номером. Таким образом, пятый философ не сможет взять ни одной вилки. Более того, только один философ будет иметь доступ к вилке с наибольшим номером, так что он сможет, есть двумя вилками. Когда он закончит использовать вилки, он в первую очередь положит на стол вилку с бо́льшим номером, потом — с меньшим, тем самым позволив другому философу взять недостающую вилку и приступить к еде.
3. Монитор
Про именуем философов латинскими буквами A – D. В отсутствии блокировок, связанных с вилками, философы должны обеспечивать то, что начало принятия пищи не основывается на старой информации о состоянии соседей. В реальной жизни, если философ B видит, что A не ест в данный момент времени, а потом поворачивается и смотрит на C, A мог начать есть, пока философ B смотрит на C, поэтому при реализации этого алгоритма необходимо использовать одну взаимоисключающую блокировку чтобы избежать этой проблемы. Например: философ B блокирует какой-то ресурс, показывая, что он собирается кушать (в данном случае представим, что он подтягивает тарелку к себе), после чего смотрит по сторонам на A и C и проверяет, не кушают ли они; в это время никто не может начать кушать, так как тарелка подвинута к B, и он её удерживает. После этого философ B может начать кушать (если A и C не кушали) и отпустить тарелку чтобы следующий проголодавшийся философ мог завладеть ею на момент проверки того кушают ли его соседи.
2. Решение задачи
Учитывая выбранный язык и его возможности, было принято решение использовать совмещённое решение, использующее лучшие идеи из вышеописанных классических решений.
Проанализировав задачу и определив, что блокировка выполняется только когда все философы действуют одинаково и практически одновременно берут сначала левую вилку, а потом пытаются завладеть правой (или наоборот) то лишь тогда мы можем получить deadlock потому что никто не может получить вторую вилку. Избежать эту ситуацию можно предположив, что философы люди умные и будут поступать разумно, поэтому в зависимости от номера философа (1 – 5) каждый из них будет брать первой либо левую вилку (если его номер число парное) либо правую (если его номер число не парное). Таким образом, мы избежим состояние взаимоблокировки, так как не может получиться такой ситуации, когда у всех философов по одной вилке и никто не может получить вторую, но остаётся проблема с возможным голоданием одного из философов. Чтобы решить проблему голодания мы установим очерёдность на использование вилки, так если один философ кушает, а второй запросил эту же вилку то он встанет в очередь, так что он точно её получит, когда придёт его очередь, даже если какой-то философ будет более быстрым (поток будет иметь повышенный приоритет) и попытается ухватить вилку как раз когда она только-только освободиться.