Каким значимым образом Erlang предотвращает условия гонки в параллельном программировании?

11

Чтение о параллелизме в Erlang напоминает мне инструментарий Akk для параллелизма . Оба дают вам инструменты для предотвращения или ограничения условий гонки . Но вы можете отправлять ссылки на изменяемые данные другим процессам, используя инструментарий Akka, который по-прежнему небезопасен. Я считаю Akka полезным инструментом, но он не обеспечивает защиту от неупорядоченного доступа к объектам и данным, что приводит к гоночным условиям, тупику и / или голоду. Это не мешает вам писать небезопасный код, так как Java или C # защищают вас от написания большинства утечек памяти, которые вы можете писать в C ++ (вы все равно можете создавать утечки памяти в Java, обманывая сборщик мусора, но это меньше проблемы, чем необходимость помнить, чтобы освободить каждый байт, который вы выделяете).

Гарантирует ли Erlang степень правильности, производительности и надежности в параллельном программировании? Я думаю, что операционные системы обеспечивают защиту при доступе к системным ресурсам (при условии, что авторы драйверов хорошо выполнили свою работу). Базы данных ACID обеспечивают защиту для чтения и обновления. Так что, похоже, это решаемая проблема. Или универсальное безопасное решение стерло бы прирост производительности, который обеспечивает параллелизм? Другие языки или наборы инструментов обеспечивают параллельную безопасность, которую Эрланг делает (или не делает)?

Это дополнительный вопрос к комментарию @ Malfist к ответу @ user1249 на Какой язык программирования генерирует наименьшее количество труднодоступных ошибок? ,

GlenPeterson
источник

Ответы:

19

Есть несколько вещей, которые Эрланг делает, чтобы помочь с этим.

  • Данные являются неизменяемыми, поэтому нет данных гонки
  • OTP gen_servers и gen_fsm обеспечивают очень хорошо протестированный шаблон для серверов
  • Супервайзеры позволяют восстанавливаться после сбоев
  • процессы небольшие и дешевые
  • Память выделяется для каждого процесса (без зависаний GC)
  • Erlang VM оптимизирован для работы при очень высоких нагрузках
  • Программное обеспечение может быть обновлено на лету, поэтому не нужно обновлять простои

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

Захари К
источник
12
@JarrodRoberson: На самом деле, главное - нет общего изменяемого состояния . Совместное использование состояния не проблема, если вы не изменяете его. Изменяемое состояние не проблема, если вы не делитесь им.
Йорг Миттаг
1
Существует также новый инструмент Concuerror youtube.com/watch?v=FpkjKN9wTKg, который позволяет запускать ваши тесты со всеми возможными порядками событий
Zachary K