Почему параллелизм без блокировки имеет такое большое значение (в Clojure)?

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

Вопрос

Мне сказали, что Clojure имеет параллелизм без блокировки и что это важно.

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

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

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

Решение

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

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

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

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

Тупики.Или, правильнее сказать, их отсутствие.

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

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

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

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

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

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

Вторая проблема заключается в следующем Производительность.

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

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

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

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

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

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

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

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

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

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

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

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

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