Алгоритм Рикарта-Агравалы — различия между версиями

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

Текущая версия на 19:41, 4 сентября 2022

Алгоритм Рикарта-Агравалы — алгоритм взаимного исключения, являющийся оптимизацией алгоритма Лампорта.

Мы объединяем запросы rel и ok в один: вместо отправки ok сразу посылаем только если не хотим входить в критическую секцию или сразу как только выйдем из секции.

  1. Когда процесс [math]P_i[/math] хочет войти в критический участок, то рассылает всем сообщение req с текущей временной меткой.
  2. Когда процесс [math]P_k[/math] получает от [math]P_j[/math] запрос войти в критический участок:
    • если он сам не посылал запрос, то посылает отклик;
    • если он послал свой запрос, он сравнивает временные метки этих двух запросов и посылает отклик только если у его собственного запроса метка позже (на самом деле, при равенстве меток, нужно проверять, у кого больше номер, т.е. для отсутствия блокировок нужно ввести приоритет на потоках);
    • в остальных случаях процесс [math]P_k[/math] задерживает отправку отклика.
  3. Процесс может войти в критический участок только после получения откликов ото всех других узлов сети.
  4. После выхода из него он рассылает задержанные отклики на все ожидающие запросы.

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

Mutex-distributed-ricart.png

Алгоритм является starvation-free. Суммарно на каждую критическую секцию приходится [math]2 \cdot (N-1)[/math] сообщений.

Отказ любого узла приводит к зависанию. Решается проблема введением таймаутов.