Мы просим слишком много транзакционной памяти? - PullRequest
3 голосов
/ 22 мая 2009

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

  • Вы не можете сделать ввод / вывод
  • Вы должны написать свои атомарные секции, чтобы они могли запускаться несколько раз (будьте осторожны с локальными переменными!)
  • Программная транзакционная память обеспечивает низкую производительность
  • [Вставьте здесь свою любимую мозоль]

Я понимаю эти проблемы: чаще всего вы найдете статьи о STM, которые работают только на каком-то конкретном оборудовании, которое поддерживает некоторые действительно изящные атомарные операции (например, LL / SC ), или это должно быть поддерживается неким воображаемым компилятором или требует, чтобы all обращений к памяти был транзакционным, он вводит ограничения типов в монадном стиле и т. д. И самое главное: это реальные проблемы.

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

Ответы [ 3 ]

1 голос
/ 18 мая 2010

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

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

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

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

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

1 голос
/ 22 мая 2009

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

Вас также может заинтересовать этот подкаст о программной транзакционной памяти , который также представляет STM с использованием аналогии, основанной на сборке мусора:

Бумага - это аналогия между сборкой мусора и транзакционной памятью. В дополнение к рассмотрению красоты аналогии, обсуждение также служит хорошим введение в транзакционную память (которая упоминалась в эпизоде ​​Гетца / Холмса) и - в некоторой степени - для сбора мусора.

0 голосов
/ 22 мая 2009

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

Итак, вы могли бы ограничить влияние ТМ только теми частями кода, которые содержат блокировки, верно? В этом сценарии каждый фрагмент кода, который можно вызвать во время удерживаемой блокировки, должен поддерживать TM. Какая часть вашей программы не удерживает блокировки и никогда не вызывается кодом, который удерживает блокировки?

...