Что делает Erlang подходящим для приложений в режиме реального времени?

Некоторый фон

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

Оказывается, что обе эти функции удивительно сложно комбинировать, главным образом из-за одного конкретного ограничения: код в реальном времени не должен динамически выделять память.

Мой язык должен упростить реализацию чего-то вроде этого:

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

Я хочу, чтобы новые значения, установленные пользователем, отправлялись через очередь в механизм синтезатора. Теперь проблема была бы не интересной, если бы я только хотел отправить float и другие атомные значения. Фактически, я хочу, чтобы любые данные могли перетекать из одного потока в другой, даже сложный объект или структуру данных, и это должно быть возможным для любой конфигурации потоков и приоритетов. Без динамического распределения памяти в режиме реального времени это становится очень трудным, не налагая на себя каких-либо произвольных ограничений для программиста.

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

Вопрос

Итак, что делает Эрланг такой хорошей формой? Использует ли он специальные трюки, чтобы обойти проблемы, вызванные распределением памяти, или полностью игнорирует проблему? Требуется ли еще один подход к реальному времени?

Пример, иллюстрирующий вопрос

Предположим, что мы пишем синтезатор в Erlang, который должен производить 64 сэмпла каждые 50 миллисекунд, в противном случае трещины и попсы в звуке. Предположим также, что когда я перемещаю какой-нибудь слайдер вокруг строки, маленький объект (пусть говорят, это список или кортеж, содержащий имя параметра и новое значение), должен быть отправлен из процесса GUI в аудиопроцесс, где создается копия. Это потребовало бы динамического распределения памяти. Как Erlang поможет мне удостовериться, что это распределение не задерживает мои вычисления звука?

Ответ 1

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

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

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

Система erlang просто неплохая работа для приложений в режиме реального времени, динамическая обработка памяти достаточно эффективна и обычно не вызывает заметных пауз. И хотя это, вероятно, приведет к некоторому недетерминированности, это само по себе не должно вас беспокоить. Я имею в виду, что если время для вас важно, то вы должны в любом случае синхронизировать приложение, например, чтобы образцы звука "прибывали" вовремя.

Это совершенно другой вопрос, если erlang - правильный язык для вашего приложения. Одна вещь, которая не была оптимизирована, - это числовые вычисления. Разумеется, Erlang может их выполнять, но в нем нет нигде скорости низкоуровневых языков. Они, как правило, не критично относятся к типам приложений, для которых использовался erlang. Но опять же есть Wings 3D, модельер с открытым исходным кодом, вдохновленный Nendo и Mirai из Izware, который написан в erlang. Так что все не безнадежно.: -)

Действительно единственный способ узнать - написать небольшой тест и попробовать его. Другой вопрос, что сказал Джеймс, какой язык вы предпочитаете использовать?

Ответ 2

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

Возможно, вам захочется взглянуть на эту статью, пытаясь заставить Erlang подготовиться к жестким приложениям реального времени, чтобы выяснить, какие проблемы им нужно преодолеть для этого. http://lambda-the-ultimate.org/node/2954

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

Вы также можете найти это, поскольку FP будет отличаться от OOP, поэтому некоторые проблемы, с которыми вы сталкиваетесь в ООП, будут разными в домене FP. http://blog.ribomation.com/2009/06/28/the-ups-and-downs-of-erlang/

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

Но вам нужно будет увидеть, будет ли ваша проблема работать хорошо в FP, поскольку это не лучший язык для всех ситуаций.

Ответ 3

В конце Chap 1, Чезарините/Томпсон Книга, которая является превосходной, это говорит о разнице SLOC кода по сравнению с С++ Telecomm приложение: 85% коды C++ оборонительного кодирования, управление памятью, высокий уровень связь, которые являются в значительной степени ненужным в функционально сопоставимом коде erlang.

Взгляните, если вы в книжном магазине или можете заимствовать у кого-то.

также читал об исследованиях в жестких приложениях реального времени

http://lambda-the-ultimate.org/node/2954

http://www.scribd.com/doc/415282/05nicosi

Ответ 4

Я действительно не согласен с этим вопросом. Он просит слишком много.

"... Это потребует динамического выделения памяти. Как Erlang поможет мне удостовериться, что это распределение не задерживает мои вычисления звука?".

Маловероятно, чтобы инструменты существовали (в Эрланге или на любом другом языке), чтобы дать вам эту гарантию заранее.

Метод, который всегда использовался, - это временные тесты или тесты.

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