Последовательная согласованность требует, чтобы операции вступали в силу в том порядке, в котором они указаны в каждой программе. По сути, он обеспечивает порядок выполнения программ внутри каждого отдельного процесса и позволяет всем процессам предполагать, что они соблюдают один и тот же порядок операций. Допустим, у нас есть 2 процесса, ставящих в очередь и удаляющих из очереди элементы в очереди q
:
P1 -- q.enq(x) -----------------------------
P2 -------------- q.enq(y) ---- q.deq():y --
Это не ожидаемое поведение очереди FIFO. Мы ожидаем удалить x из очереди, потому что P1 ставит в очередь x
до того, как P2 ставит в очередь y
. Однако этот сценарий разрешен в модели последовательной согласованности, поскольку последовательная согласованность не требует, чтобы порядок, наблюдаемый всеми процессами, был правильным (порядок в реальном времени). Существует по крайней мере одно последовательное выполнение, которое может объяснить эти результаты, и одно из них:
P2:q.enq(y) P1:q.enq(x) P2:q.deq():y
В этом исполнении каждый процесс выполняет операции в порядке программы, что означает, что каждый процесс выполняет свои операции в том порядке, в котором они указаны в каждом процессе.
Постоянная согласованность требует, чтобы непересекающиеся операции выполнялись в порядке их реального времени, но перекрывающиеся операции могут быть переупорядочены. Таким образом, тот же сценарий не допускается в модели неактивной согласованности, поскольку мы ожидаем, что q.enq(x)
вступит в силу до q.enq(y)
, а q.deq()
вернет x
вместо y
. Также неизменная согласованность не обязательно сохраняет порядок программы. Если бы q.enq(x)
и q.enq(y)
были параллельными (перекрывающимися) операциями, их можно было бы переупорядочить, и q.deq():y
была бы непротиворечивой.
В основном, некоторые исполнения являются последовательно последовательными, но не непротиворечивыми в состоянии покоя, и наоборот.
person
Selim Ekizoglu
schedule
11.08.2016