Читайте также: |
|
Непротиворечивость FIFO требует, чтобы операции записи одною процесса отовсюду наблюдались в одном и том же порядке. Не все приложения нуждаются даже в том, чтобы наблюдать все операции записи, не говоря уже об их порядке. Рассмотрим случай, когда процесс внутри критической области заносит записи в реплицируемую базу данных. Хотя другие процессы даже не предполагают работать с новыми записями до выхода этого процесса из критической области, СУБД не имеет никаких средств, чтобы узнать, находится процесс в критической области или нет, и может распространить изменения на все копии базы данных.
Наилучшим решением в этом случае было бы позволить процессу покинуть критическую область и затем убедиться, что окончательные результаты разосланы туда, куда нужно, и не обращать внимания на то, разосланы всем копиям промежуточные результаты или нет. Это можно сделать, введя так называемую переменную синхронизации. Переменная синхронизация имеет только одну ассоциированную с ней операцию, synchronize(S), которая синхронизирует все локальные копии хранилища данных. Напомним, что процесс P осуществляет операции только с локальной копией хранилища. В ходе синхронизации хранилища данных все локальные операции записи процесса Р распространяются на остальные копии, а операции записи других процессов — на копию данных Р.
Модель слабой непротиворечивости имеет три свойства.
Доступ к переменным синхронизации, ассоциированным с хранилищем данных, производится на условиях последовательной непротиворечивости
С переменной синхронизации не может быть произведена ни одна операция до полного и повсеместного завершения предшествующих ей операций записи.
С элементами данных не может быть произведена ни одна операция до полного завершения всех операций с переменными синхронизации.
Первый пункт гласит, что все процессы могут наблюдать за всеми операциями над переменными синхронизации, которые с точки зрения этих процессов исходят в одинаковом порядке. Другими словами, если процесс Р1 вызывает операцию synchronize(Sl) в то же самое время, когда процесс Р2 вызывает операцию synchronize(S2), результат будет точно таким же, как если бы операция synchronize(Sl) была вызвана раньше операции synchronize(S2), или наоборот.
Второй пункт указывает на то, что синхронизация очищает конвейер. Она ускоряет выполнение всех операций чтения, которые в этот момент происходят, частично завершены или завершены в некоторых локальных копиях, и приводит их к повсеместному завершению. Когда синхронизация закапчивается, гарантировано заканчиваются все предшествовавшие ей операции записи. Производя синхронизацию после изменения совместно используемых данных, процесс переносит новые значения во все локальные копии хранилища.
Третий пункт поясняет, что при доступе к элементам данных (как для записи, так и для чтения) вес предшествующие синхронизации должны быть завершены. Производя перед чтением совместно используемых данных синхронизацию, процесс может быть уверен, что получит самые «свежие» значения.
В отличие от предыдущих моделей непротиворечивости, слабая непротиворечивость реализует непротиворечивость групп операций, а не отдельных операций чтения и записи. Эта модель наиболее широко используется, если отдельные процедуры доступа к общим данным редки, а большая часть операций доступа собрана в группы (много операций за короткий срок, а потом ничего в течение долгого времени).
В случае слабой непротиворечивости соблюдается последовательная непротиворечивость между группами операций, а не между отдельными операциями. Для выделения этих групп используются переменные синхронизации.
Рассмотрим пример. Процесс Р1 осуществляет две записи значений элементов данных, после чего синхронизируется (показано буквой S). Если Р2 и РЗ к этому моменту еще не были синхронизированы, мы не можем дать никаких гарантий но поводу того, что они увидят. Таким образом, последовательность событий (а) допустима.
Р1: W(x)a W(x)b S P1: W(x)a W(x)b S _
P2: R(x)a R(x)b S P2: S R(x)a
P3: R(x)b R(x)a S
а б
Ситуация на схеме (б) иная. Здесь процесс Р2 синхронизирован. Это означает актуальность его локальной копии хранилища данных. Когда он будет считывать значение х, он получит значение b. Получение а при слабой непротиворечивости невозможно.
Дата добавления: 2015-08-18; просмотров: 143 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Причинная непротиворечивость | | | Свободная непротиворечивость |