Транзакционная память
Транзакционная память (англ. 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 . |