一些背景
我正在开发一种数字媒体编程语言,它应该支持并发,使用无共享消息传递和软实时(即尽最大努力计算音频/视频,不会丢失样本或帧,并具有恒定的吞吐量)。
事实证明,这两个特性结合起来非常困难,主要是因为一个特定的限制:实时代码不应该动态分配内存。
我的语言应该使实现以下内容变得容易:
- 一个线程根据参数计算音频样本。这些可以是合成器不同控件的值,例如。此线程“实时”运行。
- 一个线程从用户或另一台计算机接收输入以更改这些值。这可能是GUI线程,例如,响应用户用鼠标旋转旋钮。
我希望由用户设置的新值通过队列发送到合成器引擎。如果我只想发送浮点数和其他原子值,则问题不会有趣。实际上,我希望任何类型的数据都能够从一个线程流向另一个线程,甚至是复杂对象或数据结构,并且这对于任何线程和优先级配置都是可能的。在实时侧没有动态内存分配,这变得非常困难,而不会对程序员施加看似任意的限制。
Erlang通常被宣传为实时系统的良好选择。我的理解是,Erlang从不禁止内存分配。如果我也这样做,那么很多问题就会消失,但代价是在执行这些分配的代码中引入非确定性时间。
问题
那么,什么使Erlang如此适合?它是否实现了特殊技巧来规避内存分配引起的问题,还是完全忽略了该问题?它是否采用了另一种实时方法?
一个例子来说明问题
假设我们正在使用Erlang编写一个合成器,它必须每50毫秒产生64个样本,否则声音会出现噼啪声。假设当我在字符串上移动滑块时,GUI进程必须发送一个小对象(假设它是包含参数名称和新值的列表或元组)到音频进程,其中创建了一个副本。这将需要动态内存分配。Erlang如何帮助我确保此分配不会延迟我的音频计算?