Эта страница требует существенной переработки. |
Предположительно, эта страница или раздел нарушает авторские права. |
Транзакционная память (англ. Transactional memory, TM) — технология синхронизации общей памяти для конкурирующих потоков, позволяющая им выполнять операции сохранения, которые воспринимаются другими потоками как атомарные[1]. Эта технология упрощает параллельное программирование, выделяя целые группы различных инструкций в атомарные транзакции. Конкурирующие потоки работают параллельно, пока не начинают модифицировать одну и ту же область памяти.
Подход к управлению конкурентностью с использованием транзакционной памяти называют оптимистичным[2]: предполагается, что потоки работают независимо друг от друга и в редких случаях меняют одни и те же данные. В таком случае большинство транзакций заканчивается успешно. В противоположность этому, подходы с использованием блокировок называют пессимистичными: предполагается, что потоки часто конфликтуют, и следовательно, им часто запрещается находиться в критической секции одновременно[3].
В случае конфликта данных, транзакция отменяется, это приводит к откату изменений, которые были выполнены потоком во время транзакции. После этого транзакцию можно либо перезапустить, либо вызвать заранее подготовленный альтернативный код.
В базах данных механизм транзакций известен вот уже несколько десятилетий. Изначально идея переноса транзакций из мира баз данных в мир параллельного программирования была высказана Давидом Лометом в 1977 году. А в 1993 году Морис Херли и Элиот Мосс предложили реализовать поддержку транзакционной памяти на аппаратном уровне[4].
Однако, лишь только в 2007 году была заявлена поддержка данной технологии в процессоре Rock[5][6]. Это была одна из первых попыток аппаратной реализации, но в 2010 году после ликвидации компании Sun Microsystems проект был свёрнут. Более менее коммерчески успешная реализация аппаратной транзакционной памяти была впервые представлена фирмой IBM для своих архитектур Power и System Z в 2012 году[7].
К преимуществам транзакционной памяти можно отнести
Впрочем, транзакционная память не является универсальным решением всех проблем параллельного программирования. Недостатками подхода являются
Вообще говоря, транзакции не получится эффективно применить для координации независимых задач, таких как «производитель-потребитель». А транзакционная память сама по себе не является заменой всех остальных видов синхронизации в параллельной программе. Кроме того, неизвестно, как должны вести себя вложенные транзакции, и не понятно, в какой момент нужно делать изменения, произведённые такими транзакциями, видимыми всем остальным[9].
Этот раздел должен быть полностью переписан. |
Эффекта транзакционной памяти можно добиться и с помощью различных программных решений. Такой механизм называется программной транзакционной памятью (англ. software transactional memory) или сокращённо STM.
Среди множества реализаций программной транзакционной памяти можно выделить четыре.
Ядро языка Clojure непосредственно поддерживает транзакционную память.
Подход к STM в Clojure называется управлением конкурентным доступом с помощью многоверсионности: сохраняются множественные логические версии данных, используемых в транзакциях. В течение транзакции поток наблюдает снимок данных на момент её начала. Существуют варианты использования конкурентности, при которых среде разрешается «расслабиться» для достижения дополнительной производительности[3][10].
Транзакционная память в Haskell содержится в библиотеке STM, которая входит в Haskell Platform. Некорректное использование транзакционных типов определяется на этапе компиляции программы.
Haskell обладает мощной системой типов. Язык разделяет функции с побочными эффектами и чистые функции. Для выполнения любого атомарного действия в Haskell, действие предваряется ключевым словом atomically
[3].
Реализация STM для Scala (ScalaSTM) разрабатывалась под впечатлением от реализаций в Haskell и Clojure. Кроме Scala, ScalaSTM вызывается из Java и Clojure. Реализация используется в популярном фреймворке для написания параллельных программ Akka[3].
Для реализации разделяемой структуры указатели на следующий и предыдущий узел делают потокобезопасными[11].
Начиная с версии 4.7, GCC поддерживает транзакционную память. Реализация представляет собой библиотеку времени выполнения libitm, для компиляции указывается флаг -fgnu-tm
(-mrtm
, -mhle
)[12]. Библиотека разрабатывалась с оглядкой на черновик транзакционных конструкций для C++ (предлагается включение в стандарт языка).
Большинство реализаций аппаратной транзакционной памяти используют принцип наибольшего усилия. Поэтому практические реализации используют объединение технологий аппаратной и программной транзакционной памяти. Такие системы называют системами «гибридной транзакционной памяти». К ним относится, в частности, реализация GCC[3].
Этот раздел статьи ещё не написан. |
Существуют аппаратные реализации в некоторых чипах Intel и IBM[13] [14].
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .