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