Почему параллелизм без блокировки так важен (в Clojure)? - PullRequest
6 голосов
/ 01 сентября 2009

Мне сказали, что у Clojure есть параллельный параллельный доступ, и это важно.

Я использовал несколько языков, но не понимал, что они выполняют блокировки за кулисами.

Почему это преимущество в Clojure (или на любом языке, обладающем этой функцией)?

Ответы [ 7 ]

9 голосов
/ 01 сентября 2009

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

8 голосов
/ 01 сентября 2009

Я не могу говорить конкретно о Clojure, но ... это означает, что вам не нужно ждать, пока кто-то что-то сделает, прежде чем приступить к работе. Что здорово.

Обычно это достигается неизменяемыми типами. Если ничто не может быть изменено, вам не нужно ждать, пока кто-то еще не покончит с этим, прежде чем вы сможете получить к нему доступ.

5 голосов
/ 08 января 2011

Самая большая проблема заключается в том, что блокировки не составляют .

Хотя написать код с простой стратегией блокировки (например, поместить его в синхронизированный класс Java .....) тривиально, он значительно усложняется, когда вы начинаете блокировать несколько объектов и начинаете создавать сложные транзакции, которые объединить различные заблокированные операции. Могут возникать взаимные блокировки, снижается производительность, логика блокировки начинает делать код чрезвычайно запутанным, и в какой-то момент код начинает становиться неуправляемым.

Эти проблемы станут очевидными для любого, кто должен построить большую, сложную параллельную систему (и решение их было основной мотивацией для Rich Hickey при создании Clojure).

Второй вопрос - производительность .

И блокировка, и STM явно накладывают накладные расходы. Но в некоторых важных случаях издержки STM могут быть намного ниже.

В частности, одновременный доступ без блокировки (как в случае Clojure STM) обычно подразумевает, что читатели не пострадают от других потоков (включая писателей!), Если они получают доступ к данным вне транзакции. Это может быть огромным выигрышем в довольно распространенном случае, когда операции чтения не должны быть транзакционными и значительно превосходят количество записей (например, большинство веб-приложений .....). Нетранзакционные операции чтения ссылки STM в Clojure, по существу, не требуют дополнительных затрат.

5 голосов
/ 01 сентября 2009

тупики. Или, если быть более точным, их отсутствие.

Одной из самых больших проблем в большинстве языков является то, что вы сталкиваетесь с взаимоблокировками:

  1. Ад на земле для отладки.
  2. Трудно быть уверенным, что вы избавились.

Теперь без блокировок, очевидно, вы не столкнетесь с тупиками.

2 голосов
/ 26 сентября 2009

Пока вы пишете строго последовательные программы (делайте A, затем B, затем C; закончите!), У вас не будет проблем с параллелизмом, а механизмы параллелизма языка остаются неактуальными.

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

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

Случай: я недавно написал программу (для работы), которая собирает статистику из двух файлов журнала и записывает их в базу данных. Каждый файл занимает около 3 минут для обработки. Я переместил эти процессы в два потока, которые идут рядом, сократив общее время обработки с 6 минут до чуть более 3.

Case: Научное / инженерное программное обеспечение для моделирования. Существует множество проблем, которые решаются путем вычисления какого-либо эффекта (скажем, теплового потока) в каждой точке трехмерной сетки, представляющей вашего испытуемого (звездное ядро, ядерный взрыв, географическое распространение популяции насекомых ...). По сути, одни и те же вычисления выполняются в каждой точке и во многих точках, поэтому имеет смысл выполнять их параллельно.

Во всех этих случаях и во многих других случаях, когда два вычислительных процесса обращаются к одной и той же памяти (= переменным, если хотите) примерно в одно и то же время, существует вероятность того, что они будут мешать друг другу и мешать работе друг друга. Огромная ветвь информатики, которая занимается «параллельным программированием», занимается идеями о том, как решить эту проблему.

Достаточно полезное начальное обсуждение этой темы можно найти в Википедии .

1 голос
/ 01 сентября 2009

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

0 голосов
/ 08 ноября 2009

Такой «параллельный доступ без блокировки» на самом деле не является особенностью языка ; скорее это особенность платформы или среды выполнения, и мы можем быть тем языком, который не даст вам доступа к этим средствам.

Размышление о сделках между параллелизмом на основе блокировок и без блокировок аналогично проблеме метациркуляционного оценщика: можно реализовать блокировки в терминах атомарных операций (например, сравнить и заменить, или CAS), а можно реализовать атомарный операции с точки зрения замков. Что должно быть внизу?

...