Как стать автором
Обновить

Что такое транзакционная память и чем она полезна

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


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

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

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

В настоящий момент существует достаточно большое количество библиотек (например, MultiVerse для Java), которые позволяют использовать данный подход в существующих языка программирования, а тажке некоторые языки (Fortress, Clojure), которые поддерживают транзакционную память напрямую.
Теги:
Хабы:
+38
Комментарии21

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн