Передача сообщений против блокировки - PullRequest
8 голосов
/ 21 августа 2011

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

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

Ответы [ 5 ]

9 голосов
/ 22 августа 2011

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

Так же, как, скажем, мета-круговой оценщик, неясно, какие здесь настоящие примитивы.Например, для реализации передачи сообщений вам, вероятно, понадобится атомарная CAS и определенная семантика видимости памяти, или, возможно, некоторое состояние блокировки и общего доступа.Можно реализовать атомарные операции в терминах блокировок, или можно реализовать блокировки в терминах атомарных операций (как это делает Java в ее java.util.concurrent.locks типах).

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

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

Нет абсолютногоответ.Разница здесь будет заключаться в уровне квалификации программистов, а не в инструментах, которыми они могут владеть.

4 голосов
/ 22 августа 2011

ИМХО, передача сообщений, вероятно, не совсем схема параллелизма.По сути, это форма межпроцессного взаимодействия (IPC), альтернатива общим объектам.Эрланг просто одобряет передачу сообщений в общие объекты.

Минусы общих объектов (Pros od Message Passing):

  • Состояние изменяемых / общих объектов сложнее рассуждать в контекстегде несколько потоков работают одновременно.
  • Синхронизация на общих объектах привела бы к алгоритмам, которые по своей природе не wait free или не lock free.
  • В многопроцессорной системе общий объект может дублироваться в кэшах процессора,Даже при использовании алгоритмов сравнения и свопинга, которые не требуют синхронизации, возможно, что на отправку сообщений когерентности кэша каждому из процессоров будет потрачено много циклов процессора.
  • Система, построенная на основе MessageПроходная семантика по своей природе более масштабируема.Поскольку передача сообщений подразумевает, что сообщения отправляются асинхронно, отправителю не требуется блокировать, пока получатель не обработает сообщение.

Плюсы общих объектов (минусы передачи сообщений):

  • Некоторые алгоритмы, как правило, намного проще.
  • Система передачи сообщений, требующая ресурсовбыть заблокированным в конечном итоге выродится в общие объектные системы.Это иногда проявляется в Erlang, когда программисты начинают использовать таблицы ets и т. Д. Для хранения общего состояния.
  • Если алгоритмы не требуют ожидания, вы увидите улучшение производительности и уменьшение объема используемой памяти, поскольку вФорма новых сообщений.
2 голосов
/ 22 августа 2011

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

Что касается производительности, то лучше ее измерять самостоятельно.Каждая система отличается - каковы характеристики рабочей нагрузки, зависят ли операции от результатов других операций, или они полностью или в основном независимы (что может привести к массовому параллелизму), важнее время ожидания или пропускная способность, количество машин и т. Д. Блокировкаможет быть быстрее, или затем снова может передаваться сообщение, или что-то совершенно другое.Если тот же подход, что и в LMAX , подходит к рассматриваемой проблеме, возможно, это может быть(Я бы классифицировал архитектуру LMAX как передачу сообщений, хотя она сильно отличается от передачи сообщений на основе акторов.)

2 голосов
/ 21 августа 2011

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

0 голосов
/ 16 февраля 2015

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

...