私は Erlang について非常に限られた知識しか持っていませんが、理解している限り、非常に低コストで「プロセス」を生成できます。
では、舞台裏の「プロセス」とは何なのだろうか。
彼らは繊維ですか?スレッド?継続?
私は Erlang について非常に限られた知識しか持っていませんが、理解している限り、非常に低コストで「プロセス」を生成できます。
では、舞台裏の「プロセス」とは何なのだろうか。
彼らは繊維ですか?スレッド?継続?
それらは軽量プロセスです。
私の質問Technically why is processes in Erlang more effective than OS threadsも参照してください。
また、Erlang doc から:
Erlang プロセスは軽量 (動的に拡大および縮小) し、メモリ フットプリントが小さく、作成と終了が高速で、スケジューリング オーバーヘッドが低くなります。
ソース: http://www.erlang.org/doc/reference_manual/processes.html
これも見たいかもしれません:
http://www.defmacro.org/ramblings/concurrency.html
Erlang プロセスについて話すとき、次のように述べています。
Erlang プロセスは軽量スレッドです。それらは起動と破棄が非常に安価であり、ボンネットの下では単純に機能するため、切り替えが非常に高速です。最近のデスクトップ コンピューターで実行されている典型的な Erlang システムは、何万ものそのようなプロセスを切り替えることができます。数十回の関数呼び出しごとにプロセスが切り替えられるため、切り替えの粒度が低くなりますが、通常はコンテキストの切り替えに費やされる時間を大幅に節約できます。
決定的な情報源は見つかりませんでしたが、私が理解していることから:
どの OS スレッドでどの erlang プロセスを起動するかを決定するスケジューラ (たとえば、協調して動作する複数のスケジューラ) があります。
これらのプロセスには拡張可能なスタック (おそらく、必要に応じてスタックを割り当てる各関数のプリアンブル) があるため、必要でない限りメモリを消費しすぎません。
それらは、データを待機しているか、十分な時間実行されたかに応じて、スケジューラに戻ります (一部の関数のプリアンブル コードは、経過時間を確認するためにチェックする場合があります)。スレッドとは異なり、プリエンプトされませんか?
各プロセスは、異なるページまたは異なるアロケータからメモリを割り当てるため、メモリを共有することはできません (OS プロセスがメモリの共有を回避するのと同様の方法)。
おそらく、erlang プロセスごとに個別のアロケーターまたはページを使用することも、ガベージ コレクションに役立ちます。プロセスが終了した場合、ガベージ コレクションを行わなくてもページを返すことができます: http://prog21.dadgum.com/ 16.html
基本的にそれらはスレッドです;) それらのための 1 つのアドレス空間。