11

Erlang の軽量プロセスについて読んだ後、私はそれらが「グリーン スレッド」であると確信しました。グリーンスレッドとErlangのプロセスには違いがあることを読むまで。しかし、私はそれを取得しません。

実際の違いは何ですか?

4

3 に答える 3

13

グリーン スレッドは、データ メモリをそれらの間で直接共有できます (ただし、もちろん同期は必要です)。

Erlang は「グリーン スレッド」を使用するのではなく、むしろ「グリーン プロセス」に近いものを使用します。プロセスはデータ メモリを直接共有するのではなく、それを「コピー」することによって共有します (つまり、ソース データの独立したコピーを持つ)。

于 2009-12-22T15:47:03.333 に答える
10

Erlangプロセスはデータメモリを直接共有できず、相互に値をコピーするだけであると言っても過言ではありません。それは、それがどのように実装されることができるか、そしてそれがどのように実装されているかのように見せかけることができるかについてのより多くの説明です。少なくともパフォーマンスの問題を除くすべての目的で。

Erlangは、プログラマーとしてできることに対していくつかのセマンティック制限を適用します。たとえば、値は不変です。つまり、作成後に値を変更することはできません。とにかく変更できないので、複数のErlangプロセスがメモリ内の同じ値にアクセスすることは完全に問題ないことに気づきます。そして、ロックは必要ありません。

これがErlang/OTPで行われる場合の注目すべき状況は次のとおりです。

  • 大きなバイナリ(64バイトを超える)は、特別なバイナリヒープで参照カウントされ、このヒープへの参照はメッセージング時に渡されます。
  • リテラル値は特別なメモリ領域に配置され、それらを参照するすべてのプロセスは同じメモリ領域の値を参照します(ただし、値がメッセージで送信されるとすぐに、受信プロセスで複製が作成されます)。
  • 各ノードはグローバルアトムテーブルであり、アトム値は実際にはこのテーブルへの参照であるため、アトムの同等性テストが非常に効率的になります(文字列ではなくポインターを比較してください)。
  • erl -hybridメッセージで使用される場合、プロセスが最初にプロセスヒープから共有ヒープに値をコピーすることにより、プロセスヒープと共有ヒープを組み合わせる実験的な設定。ハイブリッドヒープに関するこのスレッドを見つけました。これは、概念に関するいくつかの問題についても説明しています。

実行できるもう1つのトリックは、実際に値を変更することですが、値が表示されないようにすることです。これは、不変の値がセマンティックの制限であることをさらに説明するためです。

これらは、OTP/Erlangが実際に値を変更する場合のいくつかの例です。

  • バイナリ構文の処理における「最近の」(R12)最適化により、バイナリの末尾に追加でき、実際には、新しいテールが追加された完全な新しいバイナリを構築できません。
  • すぐにset_elementを持つ新しく構築されたタプルは、コンパイラによって変換され、タプルの代わりに要素を実際に変更できると言われています。

これらの最適化は、 「木が森に落ちて、誰もそれを聞くことができない場合、それは本当に音を立てるのか」という理論の下にあります。。つまり、参照は、変更されるオブジェクトにエスケープされてはなりません。それからそれが変わったのを観察することができるからです。

そしてこれがErlangのセマンティクスの本質であり、他のプロセスが行っていることの副作用として物事が変わることはありません。私たちはそれを共有状態と呼びますが、それはまったく好きではありません。

行き過ぎたもう1つの単純化は、Erlangには副作用がないと言うことです。しかし、それが今までに尋ねられた場合、それは別の質問のためです。

于 2009-12-22T18:42:04.320 に答える
6

人々が Erlang のプロセスを「グリーン スレッド」と呼ぶことに反対するとき、彼らは「グリーン」の部分に反対しているのではなく、「スレッド」の部分に反対しています。

スレッドとプロセスの違いは基本的に、スレッドには独自の命令ポインタしかなく、他のすべて (特に状態、メモリ、アドレス空間) を共有することです。プロセス OTOH は完全に分離されており、何も共有していません。

Erlang のプロセスは何も共有しないため、真のプロセスです。ただし、通常は「グリーン」な方法で実装されます。したがって、技術的には、それらは「グリーンプロセス」です。

通常、実装の軽量化を強調したい場合は「グリーン スレッド」と呼び、シェアード ナッシングセマンティクスを強調したい場合は「プロセス」と呼びます。そうすれば、「グリーン プロセス」の意味を説明する必要がなくなります。

于 2009-12-22T21:09:58.300 に答える