Pull to refresh

Comments 21

а тажке некоторые языки (Fortress, Closure), которые поддерживают транзакционную память напрямую


Как можно было не упомянуть среди них такого монстра, как Haskell?
Haskell это чистый функциональный язык, и STM там реализовано по типу монады state, что не совсем, то, что хочется в типичной программе.
Чего-то я так и не понял что такое транзакционная память? Это метод работы с RAM с помощью неких библиотек? Это функционал, реализуемый операционкой? Языком программирования? Процессором? Можно каких-нибудь примеров что ли хоть на каком-нибудь языке?

Происходит ли операция копирования участка памяти перед попыткой записи (что должно замедлить этот процесс), либо же память остается на месте, но тогда два потока совершенно спокойно могут туда писать во время транзации?

Как тот, кто управляет тр.пам-ю (что я так и не понял — операционка, библиотека, процессор, язык?) узнает не было ли доступа из другого потока к этой памяти? Как реализуется запись операций над этой памятью (для повторения)? Какова эффективность этого метода по сравнению с блокировками?
Все это особенности реализации бывают на уровне софта, бывает хардверная реализация памяти. Например, multiverse реализует транзакционную память при помощи инструментирования байт код, фактически все чтения/записи транзакционных полей перехватываются.

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

Вообще, для дальнейшего изучения рекомендую библиография по транзакционной памяти: www.cs.wisc.edu/trans-memory/biblio/index.html и изучение документации/исходников существующих библиотек.
следует ли считать, что concurent stack приведенный тут
code.google.com/p/multiverse/
будет работать быстрее, чем просто synchronized stack?

Это будет зависеть от того, в каком месте программы он используется и от реализации транзакционной памяти. При простой синхронизации, через synchronized, не может быть двух параллельных чтений, что может не позволить нам на 100% использовать процессор. При синхронизации через хорошо реализованную транзакционную память, с этим все будет хорошо, тк может быть много паралельных чтений.
ок, спрошу другими словами.
1. теоретически, код с использованием транзакционной памяти должен работать быстрее чем правильный код с блокировками?

2. цель стоит ускорить выполнение или упростить разработку?
1. В теории правильный код с _правильными_ блокировками не уступает транзакционной памяти (ТП). На практике этого добиться крайне сложно — как по причине трудоемкости задачи, так и по причине таких возникающих проблем, как дефекты, внесенные разработчиком — дедлоки, избыточные простои, барьеры.

2. Цель — упростить разработку, избегая целый класса проблем, связанный с управлением доступом к общему ресурсу «память».
Часто транзакционную память для написания параллельных программ сравнивают со сборщиком мусора и задачей явного освобождения памяти. Основное преимущество, это упрощение разработки.

Вообще, есть такая штука как lock free data structures, про них можно начать например отсюда: en.wikipedia.org/wiki/Non-blocking_synchronization Они позволяют достичь большего, чем просто структуры с блокировками, но сложность того, как все это работает, конечно, возрастает на порядок.
UFO just landed and posted this here
UFO just landed and posted this here
Осмысленных тестов я не проводил, пробовал писать несложные примеры, и изучал как это реализовано. К тому же, написать осмысленный тест это большая работа. Вообще, понятно, что транзакционная память будет работать медленнее чем блокировки, поскольку накладные расходы намного выше. Главное преимущество тут от того, что не нужно постоянно думать о политике синхронизации, и то, что не нужно бояться того, что кто нибудь случайно сделает ошибку, и в программе появится дедлок, или рейс кондишин.
UFO just landed and posted this here
Исправьте, пожалуйста, ошибки: «в транзакционных блокак» (предпоследний абзац, вторая снизу строчка), «у нас имеетс я»(лишний пробел, 3 по счету абзац, примерно середина), ну и если я что-то недосмотрел во время прочтения — прогоните на всякий случай спеллчеком, а то в глаза бросается и сбивает с мысли). Спасибо за статью, она интересна и полезна.
Вы уж меня извините, но вы как-то очень обзорно написали, не объяснив толком что это такое и как это использовать.
Вот тут http://www.citforum.ru/programming/digest/transactional_memory/ более понятно и подробно расписано, в том числе и про реализацию.

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

Sign up to leave a comment.

Articles