Was macht Erlang für weiche Echtzeitanwendungen geeignet?

Etwas Hintergrund

Ich arbeite an der Entwicklung einer Programmiersprache für die Programmierung digitaler Medien, die die gleichzeitige Verwendung von No-Sharing-Nachrichtenübermittlung und weicher Echtzeit unterstützen soll (dh Sie bemühen sich, Audio / Video zu berechnen, ohne Samples oder Frames zu verlieren und mit einem konstanten Durchsatz). .

Es stellt sich heraus, dass beide Funktionen überraschend schwierig zu kombinieren sind, hauptsächlich aufgrund einer bestimmten Einschränkung: Echtzeitcode sollte Speicher nicht dynamisch zuweisen.

Meine Sprache sollte es einfach machen, so etwas zu implementieren:

Ein Thread berechnet Audio-Samples basierend auf Parametern. Dies können beispielsweise die Werte verschiedener Steuerungen eines Synthesizers sein. Dieser Thread läuft "in Echtzeit".Ein Thread erhält Eingaben vom Benutzer oder von einem anderen Computer, um diese Werte zu ändern. Dies kann beispielsweise der GUI-Thread sein, der darauf reagiert, dass der Benutzer einen Knopf mit der Maus dreht.

Ich möchte, dass die vom Benutzer festgelegten neuen Werte über eine Warteschlange an die Synthesizer-Engine gesendet werden. Jetzt wäre das Problem nicht interessant, wenn ich nur Schwimmer und andere Atomwerte senden wollte. Eigentlich will ichirgendein Art von Daten, die von einem Thread zu einem anderen fließen können, auch ein komplexes Objekt oder eine Datenstruktur, und dies sollte für jede Konfiguration von Threads und Prioritäten möglich sein. Ohne dynamische Speicherzuweisung auf der Echtzeitseite wird dies sehr schwierig, ohne dem Programmierer scheinbar willkürliche Einschränkungen aufzuerlegen.

Erlang wird oft als geeignet für Echtzeitsysteme beworben. Meines Wissens nach verbietet Erlang jedoch niemals die Speicherzuweisung. Wenn ich dasselbe tun würde, würden viele Probleme wegfallen, und zwar auf Kosten der Einführung eines nicht deterministischen Timings in den Code, der diese Zuweisung durchführt.

Die Frage

Was macht Erlang so gut? Implementiert es spezielle Tricks, um die durch die Speicherzuweisung verursachten Probleme zu umgehen, oder ignoriert es das Problem vollständig? Geht man in Echtzeit anders vor?

Ein Beispiel zur Veranschaulichung der Frage

Nehmen wir an, wir schreiben einen Synthesizer in Erlang, der alle 50 Millisekunden 64 Samples produzieren muss, da sonst Risse und Knackgeräusche im Sound auftreten. Angenommen, wenn ich einen Schieberegler in der Zeichenfolge bewege, muss ein kleines Objekt (z. B. eine Liste oder ein Tupel mit dem Namen des Parameters und dem neuen Wert) vom GUI-Prozess an den Audioprozess gesendet werden Kopie wird erstellt. Dies würde eine dynamische Speicherzuordnung erfordern. Wie würde Erlang mir helfen, sicherzustellen, dass diese Zuordnung meine Audiorechnung nicht verzögert?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage