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