Алгоритм Рикарта-Агравалы — различия между версиями
| Yeputons (обсуждение | вклад)  | |||
| Строка 1: | Строка 1: | ||
| [[Категория: Параллельное программирование]] | [[Категория: Параллельное программирование]] | ||
| − | '''Алгоритм Рикарта-Агравалы'''  | + | '''Алгоритм Рикарта-Агравалы''' — алгоритм взаимного исключения, являющийся оптимизацией [Алгоритм Лампорта взаимного исключения|алгоритма Лампорта]. | 
| − | # Когда процесс <tex>P_i</tex> хочет войти в критический участок, то рассылает всем сообщение  | + | Мы объединяем запросы rel и ok в один: вместо отправки ok сразу посылаем только если не хотим входить в критическую секцию или сразу как только выйдем из секции. | 
| + | |||
| + | # Когда процесс <tex>P_i</tex> хочет войти в критический участок, то рассылает всем сообщение req с текущей временной меткой. | ||
| # Когда процесс <tex>P_k</tex> получает от <tex>P_j</tex> запрос войти в критический участок: | # Когда процесс <tex>P_k</tex> получает от <tex>P_j</tex> запрос войти в критический участок: | ||
| #* если он сам не посылал запрос, то посылает отклик; | #* если он сам не посылал запрос, то посылает отклик; | ||
| Строка 10: | Строка 12: | ||
| # После выхода из него он рассылает задержанные отклики на все ожидающие запросы. | # После выхода из него он рассылает задержанные отклики на все ожидающие запросы. | ||
| − | Алгоритм  | + | В отличие от алгоритма Лапрота, нам не требуется ни третьего сообщения, ни хранить очередь запросов в каждом процессе. | 
| + | |||
| + | [[Файл:mutex-distributed-ricart.png|400px]] | ||
| + | |||
| + | Алгоритм является starvation-free. Суммарно на каждую критическую секцию приходится <tex>2 \cdot (N-1)</tex> сообщений.   | ||
| Отказ любого узла приводит к зависанию. Решается проблема введением таймаутов. | Отказ любого узла приводит к зависанию. Решается проблема введением таймаутов. | ||
Версия 18:41, 2 июня 2019
Алгоритм Рикарта-Агравалы — алгоритм взаимного исключения, являющийся оптимизацией [Алгоритм Лампорта взаимного исключения|алгоритма Лампорта].
Мы объединяем запросы rel и ok в один: вместо отправки ok сразу посылаем только если не хотим входить в критическую секцию или сразу как только выйдем из секции.
- Когда процесс хочет войти в критический участок, то рассылает всем сообщение req с текущей временной меткой.
-  Когда процесс  получает от  запрос войти в критический участок:
- если он сам не посылал запрос, то посылает отклик;
- если он послал свой запрос, он сравнивает временные метки этих двух запросов и посылает отклик только если у его собственного запроса метка позже (на самом деле, при равенстве меток, нужно проверять, у кого больше номер, т.е. для отсутствия блокировок нужно ввести приоритет на потоках);
- в остальных случаях процесс задерживает отправку отклика.
 
- Процесс может войти в критический участок только после получения откликов ото всех других узлов сети.
- После выхода из него он рассылает задержанные отклики на все ожидающие запросы.
В отличие от алгоритма Лапрота, нам не требуется ни третьего сообщения, ни хранить очередь запросов в каждом процессе.
Алгоритм является starvation-free. Суммарно на каждую критическую секцию приходится сообщений.
Отказ любого узла приводит к зависанию. Решается проблема введением таймаутов.

