Войти  |  Регистрация
Авторизация

Транзакционная память



Транзакционная память (англ. Transactional memory, TM) — технология синхронизации общей памяти для конкурирующих потоков, позволяющая им выполнять операции сохранения, которые воспринимаются другими потоками как атомарные. Эта технология упрощает параллельное программирование, выделяя целые группы различных инструкций в атомарные транзакции. Конкурирующие потоки работают параллельно, пока не начинают модифицировать одну и ту же область памяти.

Подход к управлению конкурентностью с использованием транзакционной памяти называют оптимистичным: предполагается, что потоки работают независимо друг от друга и в редких случаях меняют одни и те же данные. В таком случае большинство транзакций заканчивается успешно. В противоположность этому, подходы с использованием блокировок называют пессимистичными: предполагается, что потоки часто конфликтуют, и следовательно, им часто запрещается находиться в критической секции одновременно.

В случае конфликта данных, транзакция отменяется, это приводит к откату изменений, которые были выполнены потоком во время транзакции. После этого транзакцию можно либо перезапустить, либо вызвать заранее подготовленный альтернативный код.

Появление технологии

В базах данных механизм транзакций известен вот уже несколько десятилетий. Изначально идея переноса транзакций из мира баз данных в мир параллельного программирования была высказана Давидом Лометом в 1977 году. А в 1993 году Морис Херли и Элиот Мосс предложили реализовать поддержку транзакционной памяти на аппаратном уровне.

Однако, лишь только в 2007 году была заявлена поддержка данной технологии в процессоре Rock. Это была одна из первых попыток аппаратной реализации, но в 2010 году после ликвидации компании Sun Microsystems проект был свёрнут. Более менее коммерчески успешная реализация аппаратной транзакционной памяти была впервые представлена фирмой IBM для своих архитектур Power и System Z в 2012 году.

Преимущества и недостатки

К преимуществам транзакционной памяти можно отнести

  • относительную простоту использования — в транзакцию можно заключить целый блок кода;
  • отсутствие необходимости ручной реализации блокировок;
  • возможность повторного использования потокобезопасного кода.

Впрочем, транзакционная память не является универсальным решением всех проблем параллельного программирования. Недостатками подхода являются

  • общее падение производительности — в большей степени справедливо для программных реализаций;
  • вероятность возникновения лайвлоков — в следствие слишком оптимистичного алгоритма блокировок может возникнуть ситуация обратная тупиковой;
  • трудности при использовании нового кода вместе с унаследованным, который не применяет транзакции для доступа к разделяемой памяти — такой код может нарушить согласованность транзакций;
  • ограниченность применения — можно выполнять только обратимые операции;
  • сложность отладки — внутри транзакции нельзя установить точку останова.

Вообще говоря, транзакции не получится эффективно применить для координации независимых задач, таких как «производитель-потребитель». А транзакционная память сама по себе не является заменой всех остальных видов синхронизации в параллельной программе. Кроме того, неизвестно, как должны вести себя вложенные транзакции, и не понятно, в какой момент нужно делать изменения, произведённые такими транзакциями, видимыми всем остальным.

Программные реализации

Эффекта транзакционной памяти можно добиться и с помощью различных программных решений. Такой механизм называется программной транзакционной памятью (англ. software transactional memory) или сокращённо STM.

Среди множества реализаций программной транзакционной памяти можно выделить четыре.

Clojure

Ядро языка Clojure непосредственно поддерживает транзакционную память.

Подход к STM в Clojure называется управлением конкурентным доступом с помощью многоверсионности: сохраняются множественные логические версии данных, используемых в транзакциях. В течение транзакции поток наблюдает снимок данных на момент её начала. Существуют варианты использования конкурентности, при которых среде разрешается «расслабиться» для достижения дополнительной производительности.

Haskell

Транзакционная память в Haskell содержится в библиотеке STM, которая входит в Haskell Platform. Некорректное использование транзакционных типов определяется на этапе компиляции программы.

Haskell обладает мощной системой типов. Язык разделяет функции с побочными эффектами и чистые функции. Для выполнения любого атомарного действия в Haskell, действие предваряется ключевым словом atomically.

Scala

Реализация STM для Scala (ScalaSTM) разрабатывалась под впечатлением от реализаций в Haskell и Clojure. Кроме Scala, ScalaSTM вызывается из Java и Clojure. Реализация используется в популярном фреймворке для написания параллельных программ Akka.

Для реализации разделяемой структуры указатели на следующий и предыдущий узел делают потокобезопасными.

C / C++

Начиная с версии 4.7, GCC поддерживает транзакционную память. Реализация представляет собой библиотеку времени выполнения libitm, для компиляции указывается флаг -fgnu-tm (-mrtm, -mhle). Библиотека разрабатывалась с оглядкой на черновик транзакционных конструкций для C++ (предлагается включение в стандарт языка).

Большинство реализаций аппаратной транзакционной памяти используют принцип наибольшего усилия. Поэтому практические реализации используют объединение технологий аппаратной и программной транзакционной памяти. Такие системы называют системами «гибридной транзакционной памяти». К ним относится, в частности, реализация GCC.

Аппаратные реализации

Существуют аппаратные реализации в некоторых чипах Intel и IBM .


Добавить комментарий
Ваше Имя:
Ваш E-Mail:
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent