
- •Кафедра информатики
- •Курсовая работа
- •По программированию
- •Задача об обедающих мудрецах
- •Оглавление
- •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. Результаты работы
УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ГОРНЫЙ УНИВЕРСИТЕТ
Кафедра информатики
Курсовая работа
По программированию
Задача об обедающих мудрецах
Студентка: Красникова А.А.
гр. ИНФ-11
Преподаватель: Дружинина Е.А.
Екатеринбург 2013
Оглавление
Задача об обедающих мудрецах 1
1. Постановка задачи 3
1.1. Задание 3
1.2. Алгоритмическое решение задачи 4
1.2.1 Решение задачи 6
1.3. Контрольные примеры 8
2. Решение задачи 10
2.1. Выбор средств реализации 11
2.2. Описание основных классов 13
2.3 Интерфейс приложения 22
3. Тестирование приложения 23
3.1. Контрольный робот 23
3.2. Работа приложения на контрольных тестах 25
3.3. Результаты работы 26
1. Постановка задачи
1.1. Задание Задача об обедающих мудрецах
За круглым столом расставлены пять стульев, на каждом из которых сидит определенный философ. В центре стола – большое блюдо спагетти, а на столе лежат пять вилок – каждая между двумя соседними тарелками. Каждый философ может находиться только в двух состояниях: либо он размышляет, либо ест спагетти. Начать думать философу ничто не мешает. Но чтобы начать есть, философу нужны две вилки: одна в правой руке, другая в левой. Закончив еду, философ кладет вилки слева и справа от своей тарелки и опять начинает размышлять до тех пор, пока снова не проголодается.
Постановка задачи
Решить задачу условной синхронизации при помощи приемов многопоточного программирования.
1.2. Алгоритмическое решение задачи
Задание относится к задачам многопоточного программирования. Задача сформулирована таким образом, чтобы иллюстрировать проблему избежания взаимной блокировки (deadlock) — состояния системы, при котором прогресс невозможен. Например, можно посоветовать каждому философу выполнять следующий алгоритм:
Размышлять, пока не освободится левая вилка. Когда вилка освободится — взять её.
Размышлять, пока не освободится правая вилка. Когда вилка освободится — взять её.
Есть
Положить левую вилку
Положить правую вилку
Повторить алгоритм сначала
Это решение задачи некорректно: оно позволяет системе достичь состояния взаимной блокировки, когда каждый философ взял вилку слева и ждёт, когда вилка справа освободится.
Логично, что к такому же состоянию взаимоблокировки мы придем, если поменяем пункты 1 и 2, а также 4 и 5 местами.
Задача также затрагивает проблему ресурсного голодания (resource starvation), которая может возникать независимо от взаимной блокировки, если один из философов не может завладеть левой и правой вилкой из-за проблем синхронизации. Например, может быть предложено правило, согласно которому философы должны класть вилку обратно на стол после пятиминутного ожидания доступности другой вилки, и ждать ещё пять минут перед следующей попыткой завладеть вилками. Эта схема устраняет возможность блокировки (так как система всегда может перейти в другое состояние), но по-прежнему существует возможность «зацикливания» системы (livelock), при котором состояние системы меняется, но она не совершает никакой полезной работы. Например, если все пять философов появятся в столовой одновременно, и каждый возьмёт левую вилку в одно и то же время, то философы будут ждать пять минут в надежде завладеть правой вилкой, потом положат левую вилку и будут ждать ещё пять минут прежде, чем попытаться завладеть вилками снова.
Взаимное исключение (англ. mutual exclusion) является основной идеей «Проблемы обедающих философов». Эта проблема представляет собой общий, абстрактный сценарий, позволяющий объяснить проблемы этого типа. Ошибки философов наглядно демонстрируют те трудности, которые возникают в реальном программировании, когда нескольким программам требуется исключительный доступ к разделяемым ресурсам. Эти вопросы изучаются в области параллельных вычислений.
Цель формулирования «проблемы обедающих философов» заключается в первую очередь в демонстрации возможных проблем при работе с внешними устройствами компьютера, например, ленточными накопителями. Тем не менее, область применения данной задачи простирается гораздо дальше и сложности, рассматриваемые в задаче, чаще возникают, когда несколько процессов пытаются получить доступ к набору данных, который обновляется.
Системы, которые должны иметь дело с большим количеством параллельных процессов (например, ядра операционных систем), используют тысячи блокировок и точек синхронизации. Это требует строгого соблюдения методик и протоколов, если необходимо избегать взаимных блокировок, голодания и повреждения данных.