Рубрики
Без рубрики

Проблема Обедающего Философа

Проблема обедающего философа, придуманная Эдстером Дейкстером, является классической демонстрацией тупика…. С пометкой diningphilosophers, java, github.

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

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

Представьте, что все философы одновременно выбирают свою правую (одну и ту же) вилку, тогда у всех у них на руках будет только одна вилка. Они больше не смогут есть. Это то, что мы называем Мертвой блокировкой . Наша цель – найти решение, которое поможет философам достичь своей цели – есть и думать, не умирая с голоду.

Мы собираемся найти решение этой проблемы с помощью Семафор

Семафор:

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

Ожидание и сигнал , которые используются для процесса синхронизации .

В этом решении каждый из философов следует следующему протоколу:

В то время как (условия верны) {

  • Думать…
  • возьмите левую вилку () (Подумайте, пока не появится правая)
  • возьмите правую вилку ()
  • есть() в течение фиксированного промежутка времени
  • опустите правую вилку()
  • опустите левую вилку()
  • вернемся к размышлениям…

}

Реализация

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

Кроме того, существует еще один метод, который предписывает философу выполнить предпочитаемое им действие:

  • Ешь, думай, доставая вилки, чтобы поесть

Приказ о выполнении не приводится в исполнение только по времени.

Чтобы имитировать получение вилки, нам нужно заблокировать ее так, чтобы никакие два потока philosopher не получали ее одновременно. Мы используем ключевое слово synchronized для получения внутреннего монитора объекта fork и предотвращения того, чтобы другие потоки делали то же самое для достижения этой цели.

Это делается в методе run() в классе Philosopher.

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

Чтобы управлять всем процессом, мы пишем Main метод , который создает 5 философов (или любое количество философов) в виде потоков и запускает их все:

Результат этой программы:

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

Выход из тупика

Тупиковая ситуация – это ситуация, когда прогресс системы останавливается, поскольку каждый процесс ожидает получения ресурса, принадлежащего какому-либо другому процессу.

if(j == philosophers.length - 1){
    //The last philosopher picks up the right fork first
    philosophers[j] = new Philosopher(rightFrk, leftFork);
}else{
    philosophers[j] = new Philosopher(leftFork, rightFrk);
}

Приведенный выше код используется в методе Main , чтобы избежать взаимоблокировки. Мы упоминали, что такое тупик, в предыдущем абзаце этой статьи.

Запустив код несколько раз, можно убедиться, что система свободна от ситуации взаимоблокировки, которая возникала ранее.

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

Вы все можете клонировать и загружать мой код:

Вы все можете клонировать и загружать мой код:

Надеюсь, вам всем понравилось и вы чему-то научились на этом. Пожалуйста, дайте мне знать ваши комментарии, предложения и любые вопросы, которые у вас есть по поводу этого блога.

👉 Навестите меня – https://mihinduranasinghe.com/

Оригинал: “https://dev.to/mihinduranasinghe/dinning-philosopher-problem-fhd”