Хм, если я не ошибаюсь, в LiveLock процессы просто делают бесполезную работу, я имел ввиду что каждый просто будет стоять на месте и ждать, пока пройдет другой.
>> В следующий раз (с моей стороны) – алгоритм топологической сортировки, который, в том числе, может быть применен при компиляции и анализе цепи активаций нейронов в нейросети.
Какие-нибудь бы попроще примеры на первый раз — например, определение порядка, в котором строить артефакты при помощи make-файла :)
В том же примере с java2me, виртуальная машина могла бы определить deadlock, и запустить запрос разрешения у пользователя в отдельном потоке.
Главная практическая польза — реализация алгоритма на уровне ОС.
Это, прежде всего, представляет интерес для разработчиков, упрощая решение каких-либо проблем.
Плюс для конечного пользователя такой же как от использования рекурсии или ООП, т.е. слабо поддаётся оценке.
Алгоритм поиска в глубину является вспомогательным в других более практических алгоритмах: тут. Думаю, потом эти алгоритмы появятся в след. статьях, с указанием практического применения.
И так просто вспомнилось, когда мне нужно было C# загрузить файлы по некоторой маске (*.pdf) в БД из некоторой директории (в которой есть поддиректории), то я незадумываясь писал рекурсивную процедуру обхода директорий. Порядок в котором они обходились — и есть Поиск в глубину. В первую попавшуюся до упора, чуть назад в следующую… и.т.д.
Как раз вчера столкнулся с необходимостью поиска в глубину во время решения одной олимпиадной задачи. Тоже первым делом написал рекурсивную процедуру, но по быстродействию не проходило.
Посмотрел у другого участника его реализацию — вместо рекурсии используется очередь. То есть вместо вызова новой функции новое состояние ставится в очередь на обработку и по одному последовательно обрабатывается. Разница в быстродействии оказалась в 3-4 раза в пользу очереди. Количество состояний было ~50к, глубина рекурсии около 20 шагов.
Да. Согласен, что быстродействие и прожорливость по памяти ощутимо улучшается. =)
Позволю себе подправить Вашу опечатку, чтоб других не смущало: не «очередь», а «стэк» (рекурсия создает стэк вызовов функций).
Если там будет очередь, то получится BFS (поиск в ширину). =)
Спасибо, за поправку. Я тонкостей таких не знал. Вообще использование коллекции для хранения будущих обрабатываемых состояний увидел вчера впервые. Со стеком намного понятней осознать принцип алгоритма :)
Ой, рано отправил.
«По сути deadlock – это взаимоблокировка, в результате которой система, или какие-то отдельные процессы начинают конкурировать за один ресурс» — не совсем верно. Для взаимной блокировки нужна минимум пара ресурсов. Взаимной блокировки при споре об одном ресурсе быть не может. Пример: процесс A требует ресурс X и использует ресурс Y, а процесс B требует ресурс Y и использует ресурс X.
В примере с людьми в проходе тоже есть два ресурса — входы в этот проход с двух сторон. «Петя» стоит на входе в проход и ему нужен чтоб был свободен и выход чтоб пройти. Та же ситуация у «Васи» с другой стороны двери.
Алгоритмы на графах — Часть 1: Поиск в глубину и проблема взаимоблокировок