Изменения

Перейти к: навигация, поиск

Алгоритм для причинно-согласованного порядка

1255 байт добавлено, 19:19, 4 сентября 2022
м
rollbackEdits.php mass rollback
[[Категория: Параллельное программирование]]
Этот алгоритм берёт систему с асинхронным порядком и начинает гарантировать в ней [[Иерархия порядков сообщений#Причинно-согласованный порядок|причинно-согласованный порядок]].
Как и в алгоритме для FIFO, тут очередь принятых, но не обработанных сообщений может раздуваться бесконечно.
Но тут нам сложнее обрабатывать сообщения в очереди: в FIFO это было независимо по процессам и можно было сложить их в очередь с приоритетом, а тут сообщение от одного процесса может вызвать лавину сообщений от остальных, надо перебирать.
== Псевдокод алгоритма для причинно-согласованного порядка. Вместе с сообщением отправляем матрицу M: M[i, j] — количество сообщений, отправленных процессом i процессу j.==
'''var'''
M:array[l..N, 1..N] of integer initially 0;
'''enabled if''' W[j,i] = M [j,i] + 1 <tex>\land</tex> <tex> \forall k \neq j</tex> <tex>M[k, i] \geqslant W[k, i]</tex>
M := max(M, W)
 
== Пример ==
Пусть есть три процесса: $P$, $Q$, $R$ (пронумерованных так же) и они отправили друг другу сообщения. Процесс $R$ только что получил сообщение:
 
[[Файл:distributed-order-cc-algo-1.png|400px]]
 
Так как у процесса $R$ матрица $M$ нулевая, а $W_{23}=1$, то FIFO-порядок не нарушен. Однако в столбце 3 (сообщения, посланные процессу $R$) в строчке 1 (от процесса $P$) есть единица, что больше, чем ноль. То есть $P$ послал сообщение $R$, $Q$ про это знает, но $R$ ещё это сообщение не получил. Тогда надо ждать сообщения, матрицу пока не обновляем.
 
[[Файл:distributed-order-cc-algo-2.png|400px]]
 
Тут как раз получили это сообщение. Столбец 3 совпадает, а в строчке 1 у нас на единицу больше, т.е. FIFO между $P$ и $Q$ не нарушен. Можно обработать сообщение и обновить матрицу $M$. Теперь можно обработать то сообщение, которое было получено первым:
 
[[Файл:distributed-order-cc-algo-3.png|400px]]
1632
правки

Навигация