Не слишком ли много мы требуем от транзакционной памяти?

StackOverflow https://stackoverflow.com/questions/895289

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top