¿Qué hace que Erlang sea adecuado para aplicaciones suaves en tiempo real?

Algunos antecedentes

Estoy trabajando en la creación de un lenguaje de programación para la programación de medios digitales, que debería ser compatible con el uso simultáneo del paso de mensajes no compartidos y en tiempo real (es decir, hacer todo lo posible para calcular audio / video sin perder muestras o marcos y con un rendimiento constante) .

Resulta que estas dos características son sorprendentemente difíciles de combinar, principalmente debido a una restricción particular: el código en tiempo real no debe asignar memoria dinámicamente.

Mi lenguaje debería facilitar la implementación de algo como esto:

Un hilo computa muestras de audio basadas en parámetros. Estos pueden ser, por ejemplo, los valores de diferentes controles de un sintetizador. Este hilo se ejecuta "en tiempo real".Un hilo recibe información del usuario o de otra computadora para cambiar esos valores. Este podría ser el subproceso de la GUI, por ejemplo, reaccionando al usuario girando una perilla con el mouse.

Quiero que los nuevos valores establecidos por el usuario se envíen a través de una cola al motor del sintetizador. Ahora el problema no sería interesante si solo quisiera enviar flotadores y otros valores atómicos. En realidad quieroalguna tipo de datos para poder fluir de un hilo a otro, incluso un objeto complejo o una estructura de datos, y esto debería ser posible para cualquier configuración de hilos y prioridades. Sin la asignación de memoria dinámica en el lado en tiempo real, esto se vuelve muy difícil sin imponer lo que parecen ser restricciones arbitrarias en el programador.

Erlang se suele anunciar como un buen ajuste para sistemas en tiempo real. Mi entendimiento es que Erlang nunca, sin embargo, no permite la asignación de memoria. Si yo hiciera lo mismo, haría que desaparecieran muchos problemas, a costa de introducir una sincronización no determinista en el código que realiza esa asignación.

La pregunta

Entonces, ¿qué hace que Erlang encaja tan bien? ¿Implementa trucos especiales para sortear los problemas inducidos por la asignación de memoria, o ignora el problema por completo? ¿Toma otro enfoque al tiempo real?

Un ejemplo para ilustrar la pregunta.

Supongamos que estamos escribiendo un sintetizador en Erlang, que tiene que producir 64 muestras cada 50 milisegundos, de lo contrario hay grietas y saltos en el sonido. Supongamos también que cuando muevo un control deslizante en la cadena, se debe enviar un objeto pequeño (digamos que es una lista o una tupla que contiene el nombre del parámetro y el nuevo valor) desde el proceso de la GUI al proceso de audio, donde Se crea copia. Esto requeriría la asignación de memoria dinámica. ¿Cómo me ayudaría Erlang a asegurarse de que esta asignación no demore mi cálculo de audio?

Respuestas a la pregunta(4)

Su respuesta a la pregunta