УДК 004.45, 004.272
МЕТОД ДЛЯ СОГЛАСОВАННОГО ВЫПОЛНЕНИЯ СЕМЕЙСТВА РАСПРЕДЕЛЕННЫХ АСИНХРОННО ВЗАИМОСВЯЗАННЫХ ТРАНЗАКЦИЙ
И.Г. Данилов
В работе предлагается метод обнаружения RW-конфликтов по разделяемым данным, возникающих во время конкурентного выполнения набора распределенных транзакций, который предназначен для предотвращения связанных с таким типом конфликтов аномалий выполнения.
Ключевые слова: распределенная транзакционная память, разделенное глобальное адресное пространство.
1. Введение
В 90-х годах прошлого века M. Herlihy и J. E. B. Moss описали оригинальную аппаратную реализацию [1] синхронизации доступа нескольких процессоров к разделяемой памяти: конкурентные операции чтения/записи разделяемой памяти процессора могут объединяться в некоторый атомарный (неделимый) набор действий — транзакцию — и выполняться совершенно независимо от операций других процессоров. Предложенный механизм синхронизации, который в настоящее время является объектом активных научных исследований, был назван транзакционной памятью, ТП (англ. transactional memory, TM). Однако можно отметить, что сама идея не так уж и нова: впервые применять подобный механизм синхронизации для любых вычислительных процессов вообще, а не только для управления доступом к данным в базах данных (БД), предложил D. B. Lomet. В своей работе [2] Lomet описал концепцию атомарных действий (англ. atomic actions), позже реализованную Liskov и Scheifler в языке распределенного программирования Argus [3]. Появление идеи транзакционной памяти стало результатом обработки и осмысления многолетних исследований в области традиционной синхронизации вычислительных процессов и моделей согласованности памяти с одной стороны: схожие принципы и соответствующие конструкции можно встретить у Хоара — концепция мониторов [4], и с другой стороны — в области теории транзакционной обработки данных в базах данных.
В настоящее время актуальными являются исследования возможностей и преимуществ применения механизмов транзакционной памяти для масштабируемых вычислительных систем с распределенной памятью, в первую очередь для кластерных вычислительных систем. В силу своих особенностей ТП может оказаться более эффективным и масштабируемым по сравнению с традиционными решениями на основе алгоритмов распределенного взаимного исключения подходом к синхронизации в таких системах, что уже подтверждает ряд имеющихся исследований [5-7].
2. Обзор работ по тематике исследования
2.1. Свойства алгоритмов ТП
Свойством живости [8] для алгоритмов транзакционной обработки данных является критерий согласованного выполнения транзакций или просто критерий согласованности.
Примером может служить классический критерий сериализуемости транзакций БД [9]. Однако, из-за существующих различий между транзакциями в БД и транзакциями памяти, прежде всего из-за большей автономности последних, традиционного критерия сериализуемости, который является основополагающим для транзакций БД, не хватает для определения корректности выполнения набора транзакций памяти. В нем рассматриваются лишь зафиксированные транзакции и не затрагивается вопрос корректности выполнения “живых”, еще не зафиксированных транзакций. При использовании оптимистичных методов синхронизации такой критерий подходит только для полностью контролируемых сред или песочниц, какой является для транзакций СУБД, и не является удовлетворительным для транзакций памяти. Действительно, при конкурентном выполнении набора транзакций возможны ситуации гонок и, как следствие, несогласованные чтения: как из-за чередования конкурентных операций, так и, возможно, из-за несогласованного состояния памяти в случае использования клонирования (кэширования) данных, либо механизма откатов (см. классические проблемы конкурентного выполнения транзакций [10]), а валидация (обнаружение конфликтов по данным) происходит только перед самой фиксацией транзакции. Транзакции, выполняемые в еще не обнаруженном состоянии гонок, называются транзакциями-зомби [11] или обреченными (англ. doomed).
С целью избежания подобных ситуаций для алгоритмов ТП был предложен более строгий в плане корректности выполнения критерий, который является вариантом строгой сери-ализуемости, названный критерием скрытности (англ. opacity) [12]. Он предполагает, что:
а) все операции, выполненные каждой зафиксированной транзакцией, представляются так, как если бы они были выполнены в одной неделимой точке жизненного цикла транзакции;
б) ни одна операция любой прерванной транзакции не должна быть видна другим, в том числе выполняющимся транзакциям; в) каждая транзакция в любой момент времени наблюдает согласованное состояние системы (невозможны несогласованные чтения). Можно сказать, что критерий скрытности последовательно упорядочивает не только зафиксированные, но и прерванные транзакции, без наблюдения результатов их выполнения другими транзакциями набора. Таким образом, при возникновении конфликт должен быть сразу обнаружен (например, с помощью проверки на наличие изменений версий прочитанных ранее значений), и одна из конфликтующих транзакций прервана и перевыполнена заново.
2.2. Обнаружение конфликтов конкурентного выполнения распределенных транзакций
Одним из самых важных вопросов помимо выбора стратегии обнаружения и разрешения конфликтов конкурентного выполнения набора транзакций является реализация метода обнаружения конфликтов. При использовании отложенной стратегии обновления данных существует необходимость в обнаружении только RW-конфликтов, т.к. для записи используется промежуточный буфер (WR-конфликты невозможны), а сама память изменяется только в момент фиксации транзакции. Возникающие при этом “отложенные” WW-конфликты зачастую разрешаются на основе правила “первая фиксация побеждает” (англ. first committer wins, FCW): в момент фиксации транзакция проверяет перезаписываемые ею данные на наличие обновлений, сделанных конкурентными транзакциями, и, при обнаружении таких обновлений, откатывается. Для оптимистичных механизмов синхронизации [13] основной процедурой методов обнаружения конфликтов является валидация (проверка) множества считанных транзакцией значений Rset. Но то, как и когда данную
процедуру использовать, зависит от реализуемого для отслеживания конкурентных обновлений разделяемых данных метода обнаружения конфликтов. Подходы, которые применяются в алгоритмах для мультипроцессорных систем, нельзя напрямую использовать для мультикомпьютерной или распределенной транзакционной памяти, РТП (англ. distributed software transactional memory, DSTM).
В работе [6] был предложен метод обнаружения RW-конфликтов с использованием версий для данных и валидации множества Rset путем отслеживания причинно-следственного порядка между операцией чтения транзакции и операциями записи остальных транзакций системы. Для этого авторы предложили специального вида логические часы [14], которые реализованы в виде целочисленного счетчика и подчиняются следующим правилам:
1. если a — успешное событие фиксации транзакции Tj £ T, выполняемой на узле системы Nk, то часы
Ck(a) ^ Ck ^ Ck + 1 (1)
2. пусть a — событие приема на узле системы Nk сообщения q, с назначенной меткой времени, равной значению часов узла системы Nm в момент события b отправления сообщения q: tq = Cm(b); тогда после события a часы Ck устанавливаются в значение большее среди текущего значения часов Ck и метки tq:
Ck ^ max(Ck, tq) (2)
Сам метод обнаружения конфликтов, названный методом продвижения транзакции (англ. transaction forwarding) заключается в следующем:
• при старте транзакция Tj, выполняемая на узле Nk считывает текущее значение часов Ck и сохраняет его в переменной wv;
• транзакция Tj продвигает свое стартовое время wv до значения wv; > wv, т.е. делает присваивание wv = wv;, только в случае успешной валидации Rset: для всех объектов в Rset их текущая версия сравнивается с wv и, если версия какого-либо объекта превышает wv, то валидация заканчивается неуспешно, а транзакция откатывается;
• для чтения удаленного объекта транзакция Tj посылает сообщение-запрос на узел
расположения объекта Nm; при получении ответного сообщения q к посланному ранее сообщению-запросу с текущей версией объекта транзакции необходимо продвинуть
свое стартовое время wv до значения tq в случае, если wv < tq (см. выражение 2 для
логических часов); если же wv > tq, то объект может быть считан безопасно;
• при чтении локального объекта, расположенного на узле выполнения транзакции, его версия проверяется и, если она больше, чем wv, то транзакция откатывается;
• в момент фиксации транзакция наращивает часы Ck (см. выражение 1) и назначает новую версию для всех перезаписываемых объектов равную новому значению часов
Ck.
На базе предложенного метода авторами разработан алгоритм TFA, который по производительности превосходит все существующие конкурентные решения [6] и, как заявлено авторами, соответствуют критерию скрытности транзакций. Однако это не совсем так. Представим ситуацию, иллюстрация к которой изображена на рисунке. В системе из четырех узлов: (Ni, N2, N3, N4) выполняются две транзакции Ti и T2. При этом транзакция T2 перезаписывает между Ri(z) и Ri(v) считанный ранее Ti объект у, но в момент чтения Ri(v) продвижения транзакции и, следовательно валидации Rset не происходит, в силу того, что wvi = C4. В результате чтение Ri(v) получается несогласованным.
Ci=wVi = l Т1
Ci = wVi = 3
«Л*) Й!
---Є--------
сз=3
с2=з
W2(v) ---*---
W2(y) С4-С4 + 1-2 С4-3
А
С2=1
wv2-C4 — 1
Ситуация несогласованного чтения при использовании метода продвижения транзакции
Кроме этого, недостатком предложенного подхода является его ориентированность на распределенные протоколы когерентности кэша (например Relay [15]), которые плохо масштабируются, и предоставление всего одной перезаписываемой копии объекта транзакциями системы. В работе [7] авторами был предложен подход и ряд принципов для эффективной реализации программно-организуемой транзакционной памяти на основе модели PGAS и односторонних коммуникаций. Предложенный подход был реализован в системе Cluster-STM, хорошо масштабируемой на кластерной системе с сотнями вычислительных узлов. Основной недостаток Cluster-STM — отсутствие поддержки динамического параллелизма на уровне потоков, ограничение “один процессор, одна транзакция” — был устранен в системе GTM [16], также построенной на основе модели PGAS и SPMD-подхода, но вместе с этим предоставляющей поддержку динамического параллелизма на уровне потоков и удаленного вызова процедур. Недостатком обоих систем является предоставление только лишь гарантии сериализуемости; вопрос возможного возникновения гонок и, как следствие некорректное выполнение программы, не рассматривается.
Кроме вышерассмотренных существует ряд подходов, основанных на репликации и мно-говерсионности данных и предоставляющих более слабые по сравнению со скрытностью гарантии согласованности: GMU [17], SCORe [18] и др. Репликация позволяет только читающим транзакциям выполняться локально, без генерации сетевого трафика и валидации удаленных данных. В GMU применяется многоверсионная схема данных, векторные логические часы [19] для отслеживания причинно-следственной связи между событиями, а также частичная истинная схема репликации данных. GMU предоставляет слабый критерий согласованности EUS (англ. extended update-serializability), согласно которому различные только читающие транзакции могут видеть результат обновления неконфликтующих пищущих транзакций в различном порядке. Улучшенная версия протокола частичной истинной репликации данных, который назван SCORe, гарантирует более строгий критерий выполнимой сериализуемости одной копии (англ. executing one-copy serializability, 1CS) [18]. Протокол SCORe достаточно хорошо масштабируем и эффективен за счет использования локальной мультиверсионной схемы данных, позволяющей только читающим транзакциям всегда выполняться без отката, и за счет масштабируемой схемы синхронизации логических часов, в которой связанные транзакции обмениваются лишь одним скалярным числом — меткой часов.
Таким образом, можно сделать вывод, что в настоящий момент не разработано методов и алгоритмов РТП, гарантирующих выполнение критерия скрытности. Разработанные ал-
горитмы, дающие более слабые гарантии, реализуются на основе динамических, интерпретируемых языков, таких как Java, которые позволяют обнаружить и, возможно, устранить исключительные ситуации, возникающие из-за несогласованных чтений. Для более популярных в области выскопроизводительных вычислений не динамических языков, таких как C/C++ представлено всего несколько программных средств: Cluster-STM и DMV [20], гарантирующие сериализуемость, и HyflowCPP [21] — программный фреймворк, реализующий алгоритм TFA, который как было показано выше не предоставляет гарантию выполнения критерия скрытности.
3. Разработка метода обнаружения RW-конфликтов по данным в распределенной системе
3.1. Модель системы
Пусть N = [ni,U2,... ,un} — множество узлов распределенной асинхронной вычислительной системы без сбоев [8], а T = {Т1,Т2,...,Тм} — множество распределенных в системе транзакций. Кроме транзакций система также включает в себя память с последовательной моделью согласованности, с помощью которой транзакции взаимодействуют. Будем подразделять память на два вида:
1. Plmk — приватная, доступная только транзакции Tk е T, k = 1,M и относящаяся к или выделенная на узле выполнения Тk: Uj е N, j = 1,N память. Множество L представляет собой совокупность всей локальной памяти в системе: L = Plmi U Plm2 U ... U PlmM;
2. G — разделяемая, доступная всем транзакциям системы память такая, что G = Pgml U Pgm2 U ... U Pgmn, где Pgmj — часть разделяемой памяти, выделенная на узле Uj е N, j = 1, N.
Будем считать, что сами транзакции неподвижны и выполняются на том же самом узле, где были инициированы, а удаленные данные при этом могут перемещаться и кэшироваться на узле выполнения транзакции. Подобная модель, которая была предложена в работе [22], называется моделью с потоком данных. Также будем считать, что транзакции используют отложенную стратегию обновления данных.
Память представляет из себя множество специальных объектов — ячеек. Каждой ячейке памяти x соответствует некоторое определенное значение, задаваемое отображением V(x). Обозначим символом V множество всех возможных значений, которые могут принимать ячейки памяти. Совокупность всех ячеек системы будем обозначать символом M : M = L U G. Будем говорить, что множество ячеек Mi равно множеству М2, когда:
|Ml| = |М2| Л (Vx е Ml Elly е М2 : x = у Л V(x) = V(y))
Для описания системы взаимодействующих распределенных транзакций воспользуемся по аналогии рядом базирующихся на понятии машины состояний определений, предложенных в [8], и адаптируем их для распределенной системы:
Определение 3.1. Локальным алгоритмом транзакции будем называть пятерку (Z, I, Р, К, \~w), в которой Z — множество состояний, I — это некоторое подмножества множества Z, Р — отношение на множестве Z х Z, Р — отношение на множестве Z х M х Z, \~w — отношение на множестве Z х M х V х Z. Двуместное отношение Ь на
множестве Z определяется соотношением:
в Ь й (в, й) е Ьг V Зх е Ы((в, х, й) е Ьг) V Зх е Ж, Зу е V((в, х, у, й) е Ьад)
Отношение Ьг представляет собой переход между состояниями, связанный с внутренними событиями транзакции Тк е Т, отношение Ьг — событиями чтения значения из ячейки памяти, а — событиями записи значения в ячейку памяти. Транзакция Тк е Т может выполняться на любом узле пз е N вычислительной системы (ВС). Выполнение транзакции Тк — выполнение системы переходов ^к,1к, Ьк, Ьк, Ь^). Состояние транзакции Бтк описывается собственно состоянием транзакции втк и состоянием или слепком доступной ей локальной памяти Р1т,к: Бтк = (втк, Р1тк). Внутренние события и события чтения, которые описываются с помощью отношений Ьк, Ьк соответственно, могут изменять собственно состояние транзакции, а события записи в том числе и состояние доступной ей памяти: как локальной, так и глобальной.
Для описания распределенной системы в целом введем понятие распределенного алгоритма, составленного из соответствующих компонент транзакций, и системы переходов, которую данный алгоритм порождает:
Определение 3.2. Распределенным алгоритмом семейства транзакций Т = {Т\,Т2,... ,Тм} будем называть совокупность локальных алгоритмов, каждый из которых соответствует в точности одной транзакции из Т.
Состояние семейства транзакций Т будем называть конфигурацией. Каждая конфигурация системы определяется состояниями всех транзакций и состоянием разделяемой памяти
а.
Поведение распределенного алгоритма семейства транзакций Т описывается с помощью системы переходов, определяемой следующим образом:
Определение 3.3. Пусть задано семейство транзакций Т = {Т\,Т2,... ,Тм},
а локальный алгоритм каждой транзакции Тк представлен пятеркой ^тк, 1тк, ЬгТк, ЬТк, Ь?рк). Будем говорить, что система переходов Б = (С, —, I) порождена распределенным алгоритмом для семейства асинхронно взаимосвязанных транзакций Т, если выполнены следующие соотношения:
1. С = {(Бт,,. ..,Бтм ,а):(УТ е Т : Бт е Zт) Л (Ух е Ь, Уу е а : V (х), V (у) е V)}, где С -множество конфигураций семейства транзакций;
2. —= (итет ——т), где символом —т обозначаются переходы, которые соответствуют изменениям состояния транзакции Т, т.е. — т — множество всех пар вида
(Бт, ,...,БТк ,...,Бтм а), (БТ1,..., Б'тк ,...,Бтм ,а2), таких, что выполняется одно из следующих условий:
• (Бтк, Б^) еЬгТк и Ы\ = Ы2;
• для некоторой ячейки х е Ы\ имеется событие чтения (Бтк ,х, Б^к) е ЬТк и Ы\ = Ы2;
• для некоторой ячейки х е Ы\ и значения у е V имеется событие записи (БТк,х,у,Б^к) еЬ|!к так, что \Ы\\ = |Ы2| и 3!у е Ы2 : х = у Л V(у) = у;
3. I = {(Бт,.. .,БТм ,а) : к(УТ е Т : Бт е 1т)
Л (Ух е Ь, У у е а : V (х) = Уо (х)^ (у) = Уо(у)^ (х)^ (у) е V)} , где I — множество начальных конфигураций семейства транзакций, а V0(x) : Ух е Ь и а — задает начальные значения ячеек памяти.
Соответственно выполнением распределенного алгоритма называется всякое выполнение системы переходов, которая порождена этим алгоритмом. Конкретное выполнение Е задается в видет последовательности конфигураций, через которые система проходит в данном выполнении: Е = (^о,^1, ■■■). Выполнение может быть либо конечным, если для него имеется заключительная конфигурация, т.е. такая конфигурация 7 е С : $5 \ 7 — 5, либо бесконечным, если для него заключительной конфигурации не существует. С выполнением Е связана последовательность событий Е = (е0,е\,...), где ег — некоторое допустимое событие, обозначающее преобразование конфигурации 7г в 7г+\: ег (7г) = 7г+ь
Очевидно, что если два последовательных события в выполнении влияют на не пересекающиеся подмножества конфигураций, то эти события независимы и могут “выполняться” в другом порядке. В противном случае, если события нельзя поменять местами, то между ними существует причинно-следственная зависимость. Для любой последовательности событий Е, связанной с некоторым выполнением Е выделим три вида такой зависимости.
Определение 3.4. Будем говорить, что между двумя событиями ег, ез е Е существует:
1. истинная зависимость: ег <шг е^ событие ег — событие записи в некоторую
ячейку х е Ы значения у е V, а событие е^ — последующее после ег событие чтения из ячейки х значения у;
2. выходная зависимость: ег е^ событие ег — событие записи в некоторую
ячейку х е Ы значения у\ е V, а событие е^ — последующее после ег событие записи в эту же ячейку х значения у2 е V;
3. антизависимость: ег <гт е^ событие ег — событие чтения из некоторой ячейки х е Ы значения у\ е V, а событие е^ — последующее после ег событие записи в эту же ячейку значения у2 е V.
По аналогии с отношением причинно-следственного порядка, которое Лэмпорт ввел для систем с асинхронным обменом сообщениями [14], зададим такое же отношение для описанной выше асинхронной системы с распределенной общей памятью.
Определение 3.5. Причинно-следственное отношение частичного порядка -< на множестве событий системы Е выполнения Е — это такое наименьшее отношение, удовлетворяющее следующим трем условиям:
1. если е и f — два события одной транзакции и е произошло раньше, чем f, тогда е < f;
2. пусть е и f два разных события, тогда если е <шг f V е <ш'т f V е f, то е < f;
3. отношение -< транзитивно, то есть если е < д и д -< f, то е < f.
Определим два вида специальных событий, допустимых при выполнении распределенного алгоритма семейства транзакций. Первый вид событий — событие отката Ак: такое допустимое событие в последовательности событий транзакции Тк
ЕТк = (е0,... ,ег, Ак ,е'0,...) \ ЕТк С Е, представленное парой Ак = (БТ ,БТ ) еЬгт , что Ак (7г+г) = То, где т'о = (Бт, ,...,Б'Тк,..., Бтм, а') : Б'Тк е 1тк Л (Ух е Р1тк : V (х) = Ц,(х) е V). Второй вид специальных событий — событие фиксации Ск транзакции Тк: такое допустимое событие в последовательности событий Етк = (ео,... ,ег,Ск), представленное парой С к = (Бтк, Бтк) е ЬТк, что Б^к — заключительное состояние Тк в выполнении Е.
3.2. Метод обнаружения RW-конфликтов по данным в распределенной системе
Будем считать, что с каждой ячейкой х : х е а связана некоторая версия или метка е ТБзеЬ, присвоенная х транзакцией Тк. Определим на множестве ТБзеЬ функцию ТБ такую, что:
ТБ : ТБзеЬ — {{и, Ьзп) : и е Ъ+, Ьзп е Ъ^0} ,
где и — целое положительное число, номер узла ВС п^ е N, а Ьзп — целое неотрицательное число, которое является отметкой времени часов узла п.
Определим, аналогично тому, как это сделано в работе [6], логические часы СЬКт для узла ВС пт е N
1. если Ск — успешное событие фиксации транзакции Тк е Т, выполняемой на узле системы пт, то
СЬКт(Ск) ^ СЬКт ^ СЬКт + 1 (3)
2. пусть е — событие чтения ячейки х е а транзакцией Тк е Т, выполняемой на узле системы пт; при этом если ячейке назначена версия Ьзх : ТБ(Ьзх) = {и Ьзп), тогда после события е часы СЬКт устанавливаются в значение большее среди текущего значения часов СЬКт и отметки Ьзп версии Ьзх:
СЬКт ^ тах(СЬКт,Ьзп) (4)
Установим следующие соотношения для всех возможных значений версий ячеек Ьзг е ТБзеЬ. Пусть У18\,1з2 е ТБзеЬ : ТБ(Ьз\) = {]1,1зп\) Л ТБ(Ьз2) = {.]2,Ьзп2), тогда выполяня-ется:
Ьз\ =, <, > Ьз2 Ьзщ =, <, > Ьзп2,
гзх <, > Ьз2 Ьзп\ <, > Ьзп2,
(5)
Ьз\ = Ьз2 Ьзп\ = Ьзп2 Л = ]2,
Ъз1 ^, ^ Ьз2 Ьз\ <, > гз2 V Ьз\ = Ьз2
Определим множество прочитанных ячеек транзакции Тк как: ЯзеЬк = {х \ х е а Л Зе : е е Етк Л е — событие чтения ячейки х }. На множестве ЯзеЬк зададим функцию
ЯБк : ЯзеЬк — {Ьз \ Ьз е ТБзеЬ} — версия ячейки, которой соответствует некоторое значение
у е V. Таким образом ЯБк(х) = Ьзх.
Определим для каждой транзакции Тк вектор VCk : ^Ск\ = \N\ = N так, что и —й элемент вектора равен VCk [Я = Ьзп — некоторой отметке времени логических часов узла с номером равным и Предлагаемый метод обнаружения БЖ-конфликтов в распределенной системе предполагает использование отложенной стратегия обновления данных и заключается в следующем:
• при старте транзакции Тк, выполняемой на узле пт, вектор VCk инициализируется нулевыми значениями: VCkИ ^ 0, У* = 1^;
• при чтении значения ячейки х е а с соответствующей версией Ьзх е ТБзеЬ : ТБ(Ьзх) = {],Ьзп) проверяется, если VCkЦ] < Ьзп, то производится валидация объектов ЯзеЬк и присваивание VCk[и] ^ Ьзп, а также изменяются часы СЬКт (см. выражение 4 для логических часов); конфликты отсутствуют и объект может быть считан безопасно только в случае успешной валидации после чего в ЯзеЬк добавляется х: ЯБк(х) = Ьзх;
• при записи ячейки х е а производится определение ее текущей версии и при необходимости изменяются часы СЬКт согласно выражению 4, а новое значение у' сохраняется в буфере для последующей записи во время фиксации (отложенная стратегия обновления данных);
• валидация производится для всех объектов х чьи версии сохранены ранее в ЯзеЬк путем сравнения текущей версии объекта Ьз'х относительно сохраненной в ЯзеЬк версии Ьзх: ЯБк(х) = Ьзх и если Ьз'х > Ьзх, то валидация заканчивается неуспешно;
• в момент события Ск фиксации транзакции Тк, выполняемой на узле пт, наращиваются часы СЬКт (см. выражение 3), а все объекты атомарно перезаписываются новым значением у' с новой версией равной Ьзх = {т,СЬКт(Ск)).
Сформулируем и докажем следующее утверждение:
Теорема 3.1. Предложенный метод при условии атомарной перезаписи новыми значениями ячеек памяти во время фиксации транзакций позволяет гарантированно обнаруживать во время выполнения распределенного семейства асинхронно взаимосвязанных транзакций ЯШ-конфликты по данным, которые могут привести к ситуации несогласованного чтения.
Доказательство. Допустим, что это не так. Тогда для некоторой транзакции Тк узла ВС пт в выполнении Е распределенного алгоритма, реализующего предложенный метод, существует событие несогласованного чтения е'' ячейки у е а с версией Ьзу е ТБзеЬ : ТБ(Ьзу) =
и,Ь8пв) и VCk[з] > Ьзпя, т.о. после е'' валидация ЯзеЬк не производится. При этом в выполнении Е для Тк есть также предшествующее событие чтения е' ячейки х е а с версией, созданной транзакцией Тг, Ьзх е ТБзеЬ : ТБ(Ьзх) = {г,Ьзпг) такое, что е' < е''.
Существование события несогласованного чтения е'' ячейки у е а означает то, что З два события записи f' и f'' транзакции Т3 узла п: f' — событие записи ячейки х е а, а f'' — событие записи ячейки у е а с соответствующими версиями Ьзх,Ьзу е ТБзеЬ : ТБ (Ьзх) = ТБ(Ьзу) = и,Ьзп3) Л Ьзх > Ьзгх. Причем при условии атомарности перезаписи новыми значениями ячеек памяти во время фиксации транзакций выполняется: 1) е' f', е'' f'', либо 2) е' f', f'' <шг е''. При этом f' -< f'' V f'' -< f'. В первом случае событие е'' не является событием несогласованного чтения, что противоречит первоначальному условию.
Во втором случае, так как после события чтения е'' выполняется соотношение VCk 3] > Ьзпя, то для транзакции Тк должно 3 событие чтения д ячейки г е а с версией Ьзчх е ТБзеЬ : ТБ(Ьз1) = {],Ьзпя) Л VCk3] = Ьзпя > Ьзпя. Т.е. Ьз1 произведена некоторой транзакцией Тя. Тогда, если Ьзпд = Ьзпя, то Тд — это и есть транзакция Т3, поэтому при чтении ячейки г е а валидация ЯзеЬк должна отследить изменение версии ячейки х е а и дальнейшее событие несогласованного чтения е'' невозможно: т.о. приходим к противоречию. Если Ьзпд > Ьзпя, то Тд и Т3 разные транзакции одного узла ВС пз, но Тд завершилась позже Т3, следовательно, валидация ЯзеЬк после события чтения д также должна отследить изменение версии и ячейки х е а, следовательно дальнейшее событие несогласованного чтения ее' невозможно. Опять приходим к противоречию. □
Стоит отметить, что условие атомарной перезаписи ячеек памяти при фиксации транзакции обычно выполняется в силу использования специальных протоколов фиксации, таких как двухфазный протокол фиксации (2РС).
4. Программная реализация предложенного метода
На основе разработанного метода предложены алгоритмы и создана программная система распределенной транзакционной памяти DSTM_P1 [23, 24]. Данная система реализована на языке C++ и предназначена для запуска и контроля над выполнением многопоточных приложений, написанных на языке Си с использованием метода синхронизации на основе распределенной кэшируемой программно-организуемой транзакционной памяти, на кластерных вычислительных системах под управлением операционной системы Linux.
DSTM_P1 можно условно разделить на две основные части: среду выполнения приложений и прикладной программный интерфейс (API), доступный для написания многопоточных приложений. Среда выполнения является своего рода программной “песочницей" для приложений пользователя и, по выбору пользователя. API системы DSTM_P1 подразделяется на:
• интерфейс для работы с распределенной разделяемой памятью Idstm_malloc;
• интерфейс для запуска и управления выполнением распределенных потоков Idstm_pthread;
• интерфейс для барьерной синхронизации распределенных потоков Idstm_barrier.
Общая схема работы DSTM_P1 может быть описана следующим образом: (1) пользователь системы загружает исходные коды многопоточного приложения, написанного на языке C с использованием библиотеки Pthread и применением атомарных конструкций
(_tm_atomic) в местах доступа к разделяемым данным; (2) приложение компилируется с
помощью DTMC [8] в язык промежуточного представления; (3) далее полученное представление трансформируется в представление, содержащее соответствующие вызовы функций библиотеки транзакционной памяти для всех инструкций доступа к памяти атомарного блока; (4) представление, полученное на предыдущем шаге линкуется с необходимыми библиотеками (транзакционной памяти, «обертками» системных библиотек pthread и malloc); (5) на лету компилируется и исполняется main-функция приложения; (6) все вызовы функций библиотеки pthread и malloc переадресуются в соответствующие вызовы функций библиотек «оберток». Во время исполнения main-функции при вызове pthread_create определяется код функции потока, который распределяется в системе с помощью модуля балансировки нагрузки и исполняется в отдельном потоке на менее загруженном узле кластера.
С предварительными результатами экспериментальных исследований можно ознакомиться в [24].
5. Заключение
В работе представлено описание метода, который может быть использован для разработки алгоритмов синхронизации конкурентного выполнения набора распределенных асинхронно взаимосвязанных транзакций. Отличительной особенностью метода является его соответствие строгому критерию согласованности транзакций: критерию скрытности.
Литература
1. Herlihy M., Moss J. E. B. Transactional memory: architectural support for lock-free data structures // SIGARCH Comput. Archit. News. 1993. Vol. 21, No. 2. P. 289-300.
2. Lomet D. B. Process structuring, synchronization, and recovery using atomic actions // SIGOPS Oper. Syst. Rev. 1977. Vol. 11, No. 2. P. 128-137.
3. Liskov B., Scheifler R. Guardians and Actions: Linguistic Support for Robust, Distributed Programs // ACM Trans. Program. Lang. Syst. 1983. Vol. 5, No. 3. P. 381-404.
4. Hoare C. A. R. Monitors: an operating system structuring concept // Commun. ACM. 1974. Vol. 17, No. 10. P. 549-557.
5. Saad M. M., Ravindran B. HyFlow: a high performance distributed software transactional memory framework // Proceedings of the 20th international symposium on High performance distributed computing. HPDC ’11. 2011. P. 265-266.
6. Saad M. M., Ravindran B. Transactional Forwarding Algorithm: Tech. rep.: ECE Dept., Virginia Tech, 2011.
7. Bocchino R. L., Adve V. S., Chamberlain B. L. Software transactional memory for large scale clusters // Proceedings of the 13th ACM SIGPLAN Symposium on Principles and practice of parallel programming. PPoPP ’08. 2008. P. 247-258.
8. Тель Ж. Введение в распределенные алгоритмы. М.: Изд-во МЦНМО, 2009. 616 с.
9. Eswaran K. P., Gray J. N., Lorie R. A., Traiger I. L. The notions of consistency and predicate locks in a database system // Commun. ACM. 1976. Vol. 19, No. 11. P. 624-633.
10. Bernstein P. A., Goodman N. Concurrency Control in Distributed Database Systems // ACM Comput. Surv. 1981. Vol. 13, No. 2. P. 185-221.
11. Dice D., Shalev O., Shavit N. Transactional locking II // Proceedings of the 20th international conference on Distributed Computing. DISC’06. 2006. P. 194-208.
12. Guerraoui R., Kapalka M. On the correctness of transactional memory // Proceedings of the 13th ACM SIGPLAN Symposium on Principles and practice of parallel programming. PPoPP ’08. 2008. P. 175-184.
13. Kung H. T., Robinson J. T. On optimistic methods for concurrency control // ACM Trans. Database Syst. 1981. Vol. 6, No. 2. P. 213-226.
14. Lamport L. Time, clocks, and the ordering of events in a distributed system // Commun. ACM. 1978. Vol. 21, No. 7. P. 558-565.
15. Zhang B., Ravindran B. Brief Announcement: Relay: A Cache-Coherence Protocol for Distributed Transactional Memory // Proceedings of the 13th International Conference on Principles of Distributed Systems. OPODIS ’09. 2009. P. 48-53.
16. Sridharan S., Vetter J. S., Kogge P. M. Scalable Software Transactional Memory for Global Address Space Architectures: Tech. Rep. FTGTR-2009-04: Future Technologies Group, Oak Ridge National Lab, 2009.
17. Peluso S., Ruivo P., Romano P. et al. When Scalability Meets Consistency: Genuine Multiversion Update-Serializable Partial Data Replication // Distributed Computing Systems (ICDCS), 2012 IEEE 32nd International Conference. 2012. P. 455-465.
18. Peluso S., Romano P., Quaglia F. SCORe: a scalable one-copy serializable partial replication protocol // Proceedings of the 13th International Middleware Conference. Middleware ’12. 2012. P. 456-475.
19. Mattern F. Virtual Time and Global States of Distributed Systems // Proc. Workshop on Parallel and Distributed Algorithms / Ed. by C. M. et al. North-Holland / Elsevier: 1989. P. 215-226.
20. Manassiev K., Mihailescu M., Amza C. Exploiting distributed version concurrency in a transactional memory cluster // Proceedings of the eleventh ACM SIGPLAN symposium on Principles and practice of parallel programming. PPoPP ’06. 2006. P. 198-208.
21. Mishra S., Turcu A., Palmieri R., Ravindran B. HyflowCPP: A Distributed Transactional Memory Framework for C++ // 12th IEEE International Symposium on Network Computing and Applications. NCA 2013. Boston, USA: IEEE Computer Society, 2013.
22. Herlihy M., Sun Y. Distributed transactional memory for metric-space networks // Proceedings of the 19th international conference on Distributed Computing. DISC’05. 2005. P. 324-338.
23. Данилов И.Г. Прототип распределенной программной транзакционной памяти DSTM_P1 // Высокопроизводительные параллельные вычисления на кластерных системах. Материалы XI Всероссийской конференции (Н. Новгород, 2-3 ноября 2011 г.) / Под ред. проф. В.П. Гергеля. - Нижний Новгород: Изд-во Нижегородского госуниверси-тета.- 2011. - С. 102-107.
24. Данилов И.Г. Об одном подходе к реализации программной транзакционной памяти для распределённых вычислений // Известия ЮФУ. Технические науки. Тематический выпуск «Проблемы математического моделирования, супервычислений и информационных технологий». - Таганрог: Изд-во ТТИ ЮФУ, 2012. - № 6 (131), С. 91-95.
Данилов Игорь Геннадьевич, программист, Научно-исследовательский центр суперЭВМ и нейрокомпьютеров (Таганрог, Российская Федерация), vainamon@gmail.com.
Поступила в редакцию 4 августа 2014 г.
Bulletin of the South Ural State University Series “Computational Mathematics and Software Engineering”
2014, vol. 3, no. 3, pp. 37-50
METHOD FOR DISTRIBUTED AND CONSISTENT TRANSACTIONS EXECUTION
I.G. Danilov, Supercomputers and Neurocomputers Research Center (Taganrog, Russia)
This paper proposes a method for detecting RW shared data conflicts, which encountered during execution of competitive set of distributed transactions. This method is designed to prevent runtime anomalies associated with this type of conflicts in distributed transactional memory systems.
Keywords: distributed transactional memory, partitioned global address space.
References
1. Herlihy M., Moss J. E. B. Transactional memory: architectural support for lock-free data structures // SIGARCH Comput. Archit. News. 1993. Vol. 21, No. 2. P. 289-300.
2. Lomet D. B. Process structuring, synchronization, and recovery using atomic actions // SIGOPS Oper. Syst. Rev. 1977. Vol. 11, No. 2. P. 128-137.
3. Liskov B., Scheifler R. Guardians and Actions: Linguistic Support for Robust, Distributed Programs // ACM Trans. Program. Lang. Syst. 1983. Vol. 5, No. 3. P. 381-404.
4. Hoare C. A. R. Monitors: an operating system structuring concept // Commun. ACM. 1974. Vol. 17, No. 10. P. 549-557.
5. Saad M. M., Ravindran B. HyFlow: a high performance distributed software transactional memory framework // Proceedings of the 20th international symposium on High performance distributed computing. HPDC ’11. 2011. P. 265-266.
6. Saad M. M., Ravindran B. Transactional Forwarding Algorithm: Tech. rep.: ECE Dept., Virginia Tech, 2011.
7. Bocchino R. L., Adve V. S., Chamberlain B. L. Software transactional memory for large scale clusters // Proceedings of the 13th ACM SIGPLAN Symposium on Principles and practice of parallel programming. PPoPP ’08. 2008. P. 247-258.
8. Tel G. Introduction to Distributed Algorithms. MCCME, Moscow. 2009.
9. Eswaran K. P., Gray J. N., Lorie R. A., Traiger I. L. The notions of consistency and predicate locks in a database system // Commun. ACM. 1976. Vol. 19, No. 11. P. 624-633.
10. Bernstein P. A., Goodman N. Concurrency Control in Distributed Database Systems // ACM Comput. Surv. 1981. Vol. 13, No. 2. P. 185-221.
11. Dice D., Shalev O., Shavit N. Transactional locking II // Proceedings of the 20th international conference on Distributed Computing. DISC’06. 2006. P. 194-208.
12. Guerraoui R., Kapalka M. On the correctness of transactional memory // Proceedings of the 13th ACM SIGPLAN Symposium on Principles and practice of parallel programming. PPoPP ’08. 2008. P. 175-184.
13. Kung H. T., Robinson J. T. On optimistic methods for concurrency control // ACM Trans. Database Syst. 1981. Vol. 6, No. 2. P. 213-226.
14. Lamport L. Time, clocks, and the ordering of events in a distributed system // Commun. ACM. 1978. Vol. 21, No. 7. P. 558-565.
15. Zhang B., Ravindran B. Brief Announcement: Relay: A Cache-Coherence Protocol for Distributed Transactional Memory // Proceedings of the 13th International Conference on Principles of Distributed Systems. OPODIS ’09. 2009. P. 48-53.
16. Sridharan S., Vetter J. S., Kogge P. M. Scalable Software Transactional Memory for Global Address Space Architectures: Tech. Rep. FTGTR-2009-04: Future Technologies Group, Oak Ridge National Lab, 2009.
17. Peluso S., Ruivo P., Romano P. et al. When Scalability Meets Consistency: Genuine Multiversion Update-Serializable Partial Data Replication // Distributed Computing Systems (ICDCS), 2012 IEEE 32nd International Conference. 2012. P. 455-465.
18. Peluso S., Romano P., Quaglia F. SCORe: a scalable one-copy serializable partial replication protocol // Proceedings of the 13th International Middleware Conference. Middleware ’12. 2012. P. 456-475.
19. Mattern F. Virtual Time and Global States of Distributed Systems // Proc. Workshop on Parallel and Distributed Algorithms / Ed. by C. M. et al. North-Holland / Elsevier: 1989. P. 215-226.
20. Manassiev K., Mihailescu M., Amza C. Exploiting distributed version concurrency in a transactional memory cluster // Proceedings of the eleventh ACM SIGPLAN symposium on Principles and practice of parallel programming. PPoPP ’06. 2006. P. 198-208.
21. Mishra S., Turcu A., Palmieri R., Ravindran B. HyflowCPP: A Distributed Transactional Memory Framework for C++ // 12th IEEE International Symposium on Network Computing and Applications. NCA 2013. Boston, USA: IEEE Computer Society, 2013.
22. Herlihy M., Sun Y. Distributed transactional memory for metric-space networks // Proceedings of the 19th international conference on Distributed Computing. DISC’05. 2005. P. 324-338.
23. Danilov I.G. DSTM_P1: Distributed transactional memory prototype // 11th Conference on high performance computing. HPC 2011. Nizhni Novgorod, Russia, 2011. P. 102-107.
24. Danilov I.G. On one approach to implement software transactional memory for distributed computing. IZVESTIYA SFedU. Series: Engineering sciences. 2012. No. 6(131). P. 91-95.
Received 4 August 2014-