我正在致力于构建数字媒体编程的编程语言,它应该支持使用不共享消息传递和软实时的并发(即尽可能地计算音频/视频而不丢失样本或帧,并具有恒定的吞吐量) .
事实证明,这两个特征令人惊讶地难以组合,主要是因为一个特定的约束:实时代码不应该动态分配内存.
我的语言应该很容易实现这样的东西:
一线程根据参数计算音频样本.这些可以是例如合成器的不同控制的值.该线程“实时运行”.
>一个线程从用户或另一台计算机接收输入以更改这些值.这可以是GUI线程,例如,对用户用鼠标旋转旋钮做出反应.
我想让用户设置的新值通过队列发送到合成器引擎.现在如果我只想发送浮点数和其他原子值,问题就不会很有趣.实际上,我希望任何类型的数据能够从一个线程流向另一个线程,甚至是一个复杂的对象或数据结构,这对于线程和优先级的任何配置都是可行的.没有动态内存分配在实时方面,这变得非常困难,没有强加任何程序员的任意限制.
Erlang经常被广告为适合实时系统.我的理解是,Erlang从来不会禁止内存分配.如果我也是这样做的话,那么在执行这些分配的代码中引入非确定性的时间代价就会使很多问题消失.
问题
那么什么使Erlang如此适合?它是否实施特殊的技巧来规避内存分配引起的问题,还是完全忽略这个问题?是否需要另一种实时方法?
一个例子来说明这个问题
我们假设我们在Erlang中编写一个合成器,它必须每50毫秒生成64个样本,否则声音中会出现裂缝和声音.我们还假设当我在字符串上移动一些滑块时,一个小对象(假设它是一个列表或包含参数名称和新值的元组)必须从GUI进程发送到音频进程,其中副本创建.这将需要动态内存分配. Erlang如何帮助我确保这种分配不会延迟我的音频计算?
解决方法
在实时硬实时的情况下,动态内存处理将成为另外一个因素,在确定系统是否可以在分配时间内执行任务时,必须考虑这些因素.硬是最坏的情况.
在软实时中,通常足以检查动态内存处理将不会花费太多时间,并导致暂停时间过长.软是平均情况.
erlang系统对软实时应用程序来说相当不错,动态内存处理效率相当高,通常不会导致任何明显的暂停.虽然它可能会引入一些非确定性本身,这本身不应该有任何问题.我的意思是说,如果时间对你来说很重要,那么你应该是应用程序的时间安排,例如音频样本按时到达.
这是一个完全不同的问题,如果erlang是您的应用程序的正确语言.没有真正优化的一件事是数值计算.埃尔朗当然可以做到这一点,但是低级语言的速度却没有了.对于已经使用了erlang的应用程序,它们通常并不重要.但是又有一个Wings 3D,这是一个开源细分的建模者,灵感来自Izdor的Nendo和Mirai,它是用erlang写的.所以一切都没有希望. 原文链接:https://www.f2er.com/java/124230.html