Выбор модели согласованности для языка параллельного программирования - PullRequest
7 голосов
/ 09 мая 2009

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

Есть два важных критерия:

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

Моими двумя кандидатами сейчас являются неблокирующая программная транзакционная память на одной стороне и копирование семантики передачи сообщений без совместного использования a la Erlang.

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

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

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

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

Что вы рекомендуете?

  • Неблокирующая программная транзакционная память?
  • Параллельность в стиле Эрланга с трудностями ограничений в реальном времени?
  • Что-то еще, что я не учел?

Ответы [ 2 ]

2 голосов
/ 09 мая 2009

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

Если ваш язык будет широко распространен, я бы сказал, что стиль Эрланга - это, по крайней мере, то, что я могу обернуть без особых усилий. Я предполагаю, что другие смогут изучить и применить такую ​​модель легче, чем метод STM.

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

1 голос
/ 18 мая 2010

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

Вы также можете взглянуть на исчисление соединения ( JoCaml , Boost.Join ), которое можно рассматривать как вариант интерфейса передачи сообщений.

...