Методы параллельного программирования, плюсы и минусы - PullRequest
20 голосов
/ 24 октября 2010

Существует как минимум три известных подхода для создания параллельных приложений:

  1. Многопоточность и синхронизация памяти через блокировку (.NET, Java).Программная транзакционная память ( текст ссылки ) - еще один подход к синхронизации.

  2. Асинхронная передача сообщений (Erlang).

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

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

Ответы [ 4 ]

8 голосов
/ 24 октября 2010

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

В основном подчеркивается:

  • Без блокировок, мультипараллельные приложения с несколькими потоками
  • Неизменяемые постоянные структуры данных
  • Изменения состояния, обрабатываемые программной транзакционной памятью

И рассказывает о том, как эти принципы повлияли на конструкцию Clojure язык.

5 голосов
/ 24 октября 2010

Чтение Трава Саттер Эффективный параллелизм , и вы тоже будете просветлены.

2 голосов
/ 24 октября 2010

С API параллелизма Java 5 параллельное программирование на Java не должно быть громоздким и сложным, если вы используете высокоуровневые утилиты и используете их правильно. Я нашел книгу Брайана Гетца «Параллелизм Java на практике» отличным чтением на эту тему. На своей последней работе я использовал методы из этой книги, чтобы масштабировать некоторые алгоритмы обработки изображений до нескольких процессоров и выполнять задачи, связанные с процессором и диском. Я нашел, что это был отличный опыт, и мы получили отличные результаты.

Или, если вы используете C ++, вы можете попробовать OpenMP, который использует директивы #pragma для параллельного создания циклов, хотя я никогда не использовал его сам.

1 голос
/ 28 декабря 2010

В Erlang и OTP в действии , авторы представляют четыре парадигмы взаимодействия процессов:

  • Совместно используемая память с замками

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

  • Программная транзакционная память

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

  • Фьючерсы, обещания и аналогичные

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

  • Передача сообщений

    Синхронный или асинхронный, в Эрланг .

...