9

いくつかの背景

私は、デジタル メディア プログラミング用のプログラミング言語の構築に取り組んでいます。これは、非共有メッセージ パッシングとソフト リアルタイムを使用して同時実行をサポートする必要があります (つまり、サンプルやフレームを失うことなく、一定のスループットでオーディオ/ビデオを計算するために最善を尽くします)。 .

これらの機能を組み合わせるのは驚くほど難しいことがわかりました。これは主に、リアルタイム コードが動的にメモリを割り当ててはならないという 1 つの特定の制約が原因です。

私の言語は、次のようなものを簡単に実装できるようにする必要があります。

  • 1 つのスレッドは、パラメーターに基づいてオーディオ サンプルを計算します。これらは、たとえば、シンセサイザーのさまざまなコントロールの値である可能性があります。このスレッドは「リアルタイム」で実行されます。
  • 1 つのスレッドが、ユーザーまたは別のコンピューターから入力を受け取り、これらの値を変更します。これは、たとえば、ユーザーがマウスでノブを回したことに反応する GUI スレッドである可能性があります。

ユーザーが設定した新しい値を、キューを介してシンセサイザー エンジンに送信したいと考えています。フロートやその他の原子値のみを送信したい場合、問題は面白くありません。実際には、複雑なオブジェクトやデータ構造であっても、あらゆる種類のデータをあるスレッドから別のスレッドに流すことができるようにしたいと考えています。これは、スレッドと優先順位のあらゆる構成で可能になるはずです。リアルタイム側での動的メモリ割り当てがなければ、プログラマーに恣意的な制限のように見えるものを課すことなく、これは非常に困難になります。

Erlang は、リアルタイム システムに適していると宣伝されることがよくあります。私の理解では、Erlang は決してメモリ割り当てを禁止しません。私が同じことをしたら、それらの割り当てを実行するコードに非決定論的なタイミングが導入されるという犠牲を払って、多くの問題が解消されます。

質問

では、Erlang がこれほど適している理由は何でしょうか? メモリ割り当てによって引き起こされる問題を回避するための特別なトリックを実装していますか、それとも問題を完全に無視していますか? リアルタイムへの別のアプローチはありますか?

質問を説明する例

Erlang で 50 ミリ秒ごとに 64 のサンプルを生成する必要があるシンセサイザーを作成していると仮定しましょう。また、文字列上でスライダーを動かしたときに、小さなオブジェクト (パラメーターの名前と新しい値を含むリストまたはタプルとしましょう) を GUI プロセスからオーディオ プロセスに送信する必要があるとします。コピーが作成されます。これには、動的メモリ割り当てが必要です。この割り当てが音声計算を遅らせないようにするために、Erlang はどのように役立ちますか?

4

4 に答える 4

11

リアルタイム コードはメモリを動的に割り当てることができますが、それにはもっと注意する必要があります。

実際のハードリアルタイムでは、動的メモリ処理は、システムが割り当てられた時間内に必要なことを実行できるかどうかを判断する際に考慮しなければならない要因の 1 つになります。ハードは最悪のケースです。

ソフトリアルタイムでは、通常、動的メモリ処理に時間がかかりすぎず、一時停止が長くなりすぎないことを確認するだけで十分です。ソフトは平均的なケースです。

erlang システムは、ソフト リアルタイム アプリに非常に適しています。動的メモリ処理は適度に効率的で、通常は目立った一時停止は発生しません。そして、それはおそらくいくつかの非決定論を導入するでしょうが、これ自体は何の問題もありません. つまり、時間が重要な場合は、たとえばオーディオ サンプルが時間どおりに「到着」するように、とにかくアプリのタイミングを調整する必要があります。

erlang がアプリに適した言語であるかどうかは、まったく別の問題です。実際に最適化されていないことの 1 つは、数値計算です。もちろん、Erlang はそれらを行うことができますが、低水準言語の速度にはどこにも及びません。それらは一般的に、erlang が使用されている種類のアプリにとって重要ではありませんでした。しかし、ここでもまた、Izware の Nendo と Mirai にインスパイアされたオープン ソースのサブディビジョン モデラーである Wings 3D があり、erlang で記述されています。ですから、すべてが絶望的ではありません。:-)

それを知る唯一の方法は、小さなテストを書いて試してみることです。もう 1 つの質問は、James が言及したことですが、どのタイプの言語を使用したいですか?

于 2009-10-15T00:29:21.427 に答える
4

Erlang は、Ericcson Communications が電気通信で使用するために作成したものであるため、高速でスケーラブルであることは重要な考慮事項です。

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 はすべての状況に最適な言語ではないため、問題が FP でうまく機能するかどうかを確認する必要があります。

于 2009-10-14T21:25:04.550 に答える
1

私は本当にその質問に同意しません。求めすぎです。

「...これには動的なメモリ割り当てが必要です。Erlang は、この割り当てによってオーディオの計算が遅れないようにするのにどのように役立ちますか?」.

事前にこの保証を提供するツールが (Erlang またはその他の言語で) 存在する可能性は低いです。

常に使用されてきた方法は、タイミング テストまたはベンチマークです。

コードがオーディオ計算を遅らせないことを証明したい場合は、おそらくこの証明を自分で作成する必要があります。ただし、証明の手順は、以前のタイミング テストに依存している可能性があります。

于 2011-01-06T00:53:05.037 に答える
1

最後の第 1 章、Cesarini / Thompson の本は素晴らしいです。コード SLOC と C++ テレコム アプリの違いについて説明しています。C++ コードの 85% は防御コーディング、メモリ管理、高レベル通信であり、これらはほとんど不要です。機能的に同等のアーランコードで。

書店にいる場合や誰かから借りることができる場合は、見てみてください。

ハードリアルタイムアプリの研究についても読む

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

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

于 2009-10-15T02:28:34.493 に答える