
6.2. Модели непротиворечивости, ориентированные на данные 349
данных, то ли наоборот начал чтение данных. Соответственно, оно может пред-
принять действия, необходимые в обоих случаях, например, убедиться, что завер-
шены (то есть распространены на все копии) все локально инициированные опе-
рации записи и что учтены все операции записи с других копий. Если хранилище
должно распознавать разницу между входом в критическую область и выходом
из нее, может потребоваться более эффективная реализация. Для предоставле-
ния этой информации необходимо два типа переменных или два типа операций
синхронизации, а не один.
Свободная непротиворечивость {release consistency)
предоставляет эти два ти-
па
[165].
Операция захвата {acquire) используется для сообщения хранилищу
данных о входе в критическую область, а операция
освобождения {release)
гово-
рит о том, что критическая область была покинута. Эти операции могут быть
реализованы одним из двух способов: во-первых, обычными операциями над
специальными переменными; во-вторых, специальными операциями. В любом
случае программист отвечает за вставку в программу соответствующего допол-
нительного кода, реализующего, например, вызов библиотечных процедур acquire
и release или процедур enter_cr1tical_reg1on и leave_crit1cal_reg1on.
В случае свободной непротиворечивости, кроме того, независимо от критиче-
ских областей можно использовать барьеры. Барьер {barrier) — это механизм
синхронизации, который предваряет любой процесс в начале фазы программы
под номером п+1 до того, как все процессы окончат фазу п. Когда процесс по-
дойдет к барьеру, он должен дождаться, пока к нему не «подтянутся» и все ос-
тальные процессы. Когда последний из процессов подойдет к барьеру, все совме-
стно используемые данные синхронизируются, и процессы продолжают свою
работу. Отправление от барьера выполняется по захвату, а приход к барьеру
—
по освобождению.
Вдобавок к этим операциям синхронизации также возможны чтение и запись
совместно используемых данных. Захват и освобождение не могут применяться
ко всем данным хранилища. Они могут охранять только отдельные совместно
используемые данные, в этом случае только эти данные остаются непротиворе-
чивыми. Совместно используемые данные, сохраняющие свою непротиворечи-
вость, называются
защищенными
{protected).
Хранилище данных со свободной непротиворечивостью гарантирует, что при
захвате процесса хранилище сделает так, что все локальные копии защищенных
данных при необходимости будут актуализированы и станут непротиворечи-
выми относительно своих удаленных копий. Когда произойдет освобождение,
измененные защищенные данные будут распространены на другие локальные
копии хранилища. Захват не гарантирует, что локальные изменения будут не-
медленно разосланы другим локальным копиям. Соответственно, освобождение
не обязательно приведет к импорту изменений из других копий.
На рис. 6.11 показана допустимая для свободной непротиворечивости после-
довательность событий. Процесс Р1 производит захват, дважды изменяет эле-
мент данных, а затем производит освобождение. Процесс Р2 производит захват
и
считывает элемент данных. Он гарантировано получает значение, которое эле-
мент данных имел в момент освобождения, а именно b (кроме случая, когда за-