Erlang の軽量プロセスについて読んだ後、私はそれらが「グリーン スレッド」であると確信しました。グリーンスレッドとErlangのプロセスには違いがあることを読むまで。しかし、私はそれを取得しません。
実際の違いは何ですか?
Erlang の軽量プロセスについて読んだ後、私はそれらが「グリーン スレッド」であると確信しました。グリーンスレッドとErlangのプロセスには違いがあることを読むまで。しかし、私はそれを取得しません。
実際の違いは何ですか?
グリーン スレッドは、データ メモリをそれらの間で直接共有できます (ただし、もちろん同期は必要です)。
Erlang は「グリーン スレッド」を使用するのではなく、むしろ「グリーン プロセス」に近いものを使用します。プロセスはデータ メモリを直接共有するのではなく、それを「コピー」することによって共有します (つまり、ソース データの独立したコピーを持つ)。
Erlangプロセスはデータメモリを直接共有できず、相互に値をコピーするだけであると言っても過言ではありません。それは、それがどのように実装されることができるか、そしてそれがどのように実装されているかのように見せかけることができるかについてのより多くの説明です。少なくともパフォーマンスの問題を除くすべての目的で。
Erlangは、プログラマーとしてできることに対していくつかのセマンティック制限を適用します。たとえば、値は不変です。つまり、作成後に値を変更することはできません。とにかく変更できないので、複数のErlangプロセスがメモリ内の同じ値にアクセスすることは完全に問題ないことに気づきます。そして、ロックは必要ありません。
これがErlang/OTPで行われる場合の注目すべき状況は次のとおりです。
erl -hybrid
メッセージで使用される場合、プロセスが最初にプロセスヒープから共有ヒープに値をコピーすることにより、プロセスヒープと共有ヒープを組み合わせる実験的な設定。ハイブリッドヒープに関するこのスレッドを見つけました。これは、概念に関するいくつかの問題についても説明しています。実行できるもう1つのトリックは、実際に値を変更することですが、値が表示されないようにすることです。これは、不変の値がセマンティックの制限であることをさらに説明するためです。
これらは、OTP/Erlangが実際に値を変更する場合のいくつかの例です。
これらの最適化は、 「木が森に落ちて、誰もそれを聞くことができない場合、それは本当に音を立てるのか」という理論の下にあります。。つまり、参照は、変更されるオブジェクトにエスケープされてはなりません。それからそれが変わったのを観察することができるからです。
そしてこれがErlangのセマンティクスの本質であり、他のプロセスが行っていることの副作用として物事が変わることはありません。私たちはそれを共有状態と呼びますが、それはまったく好きではありません。
行き過ぎたもう1つの単純化は、Erlangには副作用がないと言うことです。しかし、それが今までに尋ねられた場合、それは別の質問のためです。
人々が Erlang のプロセスを「グリーン スレッド」と呼ぶことに反対するとき、彼らは「グリーン」の部分に反対しているのではなく、「スレッド」の部分に反対しています。
スレッドとプロセスの違いは基本的に、スレッドには独自の命令ポインタしかなく、他のすべて (特に状態、メモリ、アドレス空間) を共有することです。プロセス OTOH は完全に分離されており、何も共有していません。
Erlang のプロセスは何も共有しないため、真のプロセスです。ただし、通常は「グリーン」な方法で実装されます。したがって、技術的には、それらは「グリーンプロセス」です。
通常、実装の軽量化を強調したい場合は「グリーン スレッド」と呼び、シェアード ナッシングセマンティクスを強調したい場合は「プロセス」と呼びます。そうすれば、「グリーン プロセス」の意味を説明する必要がなくなります。