【问题标题】:What makes Erlang suitable for soft real-time applications? [closed]是什么让 Erlang 适合软实时应用程序? [关闭]
【发布时间】:2010-12-06 20:14:46
【问题描述】:

一些背景

我正在为数字媒体编程构建一种编程语言,它应该支持使用非共享消息传递和软实时的并发性(即尽最大努力在不丢失样本或帧的情况下计算音频/视频,并使用恒定吞吐量)。

事实证明,这两个特性很难结合起来,主要是因为一个特殊的限制:实时代码不应该动态分配内存。

我的语言应该可以很容易地实现这样的东西:

  • 一个线程根据参数计算音频样本。例如,这些可以是合成器的不同控件的值。此线程“实时”运行。
  • 一个线程从用户或另一台计算机接收输入以更改这些值。这可能是 GUI 线程,例如,对用户用鼠标转动旋钮做出反应。

我希望将用户设置的新值通过队列发送到合成器引擎。现在,如果我只想发送浮点数和其他原子值,问题就不会有趣了。实际上,我希望 任何 种数据能够从一个线程流向另一个线程,甚至是复杂的对象或数据结构,这对于线程和优先级的任何配置都应该是可能的。如果没有实时方面的动态内存分配,如果不对程序员施加看似任意的限制,这将变得非常困难。

Erlang 经常被宣传为非常适合实时系统。然而,我的理解是 Erlang 永远不会禁止内存分配。如果我也这样做,就会解决很多问题,但代价是在执行这些分配的代码中引入了不确定的时间。

问题

那么是什么让 Erlang 如此适合?它是否实施了特殊技巧来规避内存分配引起的问题,还是完全忽略了这个问题?是否采用另一种实时方法?

举例说明问题

假设我们正在用 Erlang 编写一个合成器,它必须每 50 毫秒产生 64 个样本,否则声音中会出现破裂和爆裂声。我们还假设当我在字符串上移动一些滑块时,必须将一个小对象(假设它是一个列表或包含参数名称和新值的元组)从 GUI 进程发送到音频进程,其中一个副本被创建。这将需要动态内存分配。 Erlang 如何帮助我确保这种分配不会延迟我的音频计算?

【问题讨论】:

    标签: concurrency erlang real-time message-passing


    【解决方案1】:

    我真的不同意这个问题。要求太高了。

    “...这需要动态内存分配。Erlang 如何帮助我确保这种分配不会延迟我的音频计算?”。

    不太可能存在工具(以 Erlang 或任何其他语言)来提前为您提供这种保证。

    一直使用的方法是计时测试或基准测试。

    如果您想证明您的代码不会延迟您的音频计算,您可能需要自己构建这个证明。但证明中的步骤可能依赖于之前的时序测试。

    【讨论】:

      【解决方案2】:

      在 Cesarini / Thompson 的书第 1 章结尾,非常棒,它讨论了代码 SLOC 与 C++ 电信应用程序的区别:85% 的 C++ 代码是防御性编码、内存管理、高级通信,它们是在功能类似的 erlang 代码中几乎没有必要。

      看看您是否在书店或可以向某人借阅。

      还阅读了有关硬实时应用程序的研究

      http://lambda-the-ultimate.org/node/2954

      http://www.scribd.com/doc/415282/05nicosi

      【讨论】:

        【解决方案3】:

        实时代码可以动态分配内存,只是需要更加小心。

        在真正的hard实时中,动态内存处理将成为另一个在确定系统是否可以及时完成任务时必须考虑的因素分配。困难是最坏的情况。

        实时中,检查动态内存处理不会花费太多时间并导致停顿时间过长通常就足够了。软是一般情况。

        erlang 系统非常适合软实时应用程序,动态内存处理相当高效,通常不会导致任何明显的暂停。虽然它可能会引入 一些 非确定性,但它本身不应该有任何问题。我的意思是,如果时间对您很重要,那么您无论如何都应该为应用计时,例如,以便音频样本按时“到达”。

        如果 erlang 是您的应用程序的正确语言,那是一个完全不同的问题。尚未真正优化的一件事是数值计算。 Erlang 当然可以做到,但它没有低级语言的速度。它们通常对使用 erlang 的应用程序类型并不重要。但是还有 Wings 3D,这是一个开源细分建模器,灵感来自 Izware 的 Nendo 和 Mirai,它是用 erlang 编写的。所以一切都不是没有希望的。 :-)

        真正找出答案的唯一方法是编写一个小测试并尝试一下。另一个问题是 James 提到的,您更喜欢使用哪种类型的语言?

        【讨论】:

        • @nvidring,感谢您的回答。其实我已经明白你的意思了。我想知道的是:由于 Erlang 显然确实引入了非确定性,它做了什么仍然使它适合软实时应用程序。我知道浮点计算不是它的强项,但是假设我们在 Erlang 中构建了一个合成器,当样本由于一些内存分配而无法按时到达时,我们如何防止这种不确定性导致音频丢失?比平时长一点?
        【解决方案4】:

        由于 Erlang 是由爱立信通信创建的用于电信的,因此快速和可扩展性是一个重要的考虑因素。

        你可能想看看这篇关于尝试让 Erlang 为硬实时应用程序做好准备的文章,看看他们需要克服哪些问题。 http://lambda-the-ultimate.org/node/2954

        您可能会发现一些仍然存在的问题也可能会阻碍您的应用程序。

        您可能也会对此感兴趣,因为 FP 与 OOP 不同,因此您在 OOP 中遇到的一些问题在 FP 域中会有所不同。 http://blog.ribomation.com/2009/06/28/the-ups-and-downs-of-erlang/

        在函数式编程中,一旦你设置了一个变量,它通常是不可变的,所以你不会创建很多新对象。通过递归你会发现你会有更少的变量,所以垃圾回收变得更加重要,这可能有助于解决你遇到的内存问题。

        但是,您需要看看您的问题在 FP 中是否能很好地解决,因为它不是适用于所有情况的最佳语言。

        【讨论】:

        • 嗨,詹姆斯,感谢您的指点。我不明白一点:当对象是不可变的时,您必须创建很多对象,实际上每个新值创建一个新实例。我的经验是,当它们不可变时,你会创建更多的对象。我错了吗?
        • 确实如此,但语言已为此进行了优化。这就是我的观点,你不能从 OOP 中获取 converns 并将其应用于 FP,因为优化会非常不同。 Erlang 有一个非常好的垃圾收集器。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 2012-06-28
        • 2021-04-26
        • 2010-11-11
        • 2012-08-01
        • 2010-11-03
        相关资源
        最近更新 更多