2016-11-20 6 views
1

私は、erlangベースのシステムを研究しており、システムで起こるイベントのシーケンスを分析しようとしています。 "spawn"が呼び出されるたびに、erlangランタイムまたはelang VMに新しいカーネルスレッドを作成させる方法がありますか?これにより、システムが遅くなりますが、研究がずっと楽になります。 + Sフラグを試して、すでにsmpを有効にしましたが、システムが複数のプロセスを1つのカーネルスレッドまたはerlangスケジューラにマッピングしていると思われます。入力/設定パラメータがありますか?Erlang - 新しい "erlang process"を新しいカーネルスレッドにマップする

+0

Erlangの「プロセス」は、オブジェクトが順次OOP言語でインスタンス化されるのとほぼ同じ規則性で生成されます。完璧な並行ではありませんが、そのようなことを考えるのが良いです。 [私はこれについて、ここにSOの記事を書いた](http://stackoverflow.com/questions/32294367/erlang-process-vs-java-thread)。パラダイムの違いは、多くの通常のプログラミング知識と知識を残すことです。 – zxq9

答えて

6

いいえ、Erlang VMの仕組みではありません。 BEAMはコアごとにスレッドを生成し、そこでスケジューラを実行します。各Erlangプロセスは任意のスケジューラ上で実行でき、スケジューラからスケジューラに移行することもできます。スケジューラはあるスレッドから別のスレッドに移行します。デフォルトでは、これらのスケジューラはCPUコアにバインドされていないため、コアからコアに移行することもできます。 -sbtスイッチを使用してバインドすることができます。 Erlangプロセスを特定のスケジューラにバインドすることもできます。これは文書化されておらず、推奨されていません。 Erlangからスレッドを生成することはできませんが、NIFまたはポートからスレッドを生成することはできませんが、このスレッドでErlangプロセスを実行することはできません。

+0

Erlangはカーネルスレッドを動的に作成できないのですか?ランタイムが開始されたときにのみ作成されますか? + 100:100の引数を渡すと、スケジューラ用の100個のカーネルスレッドが作成され、すべてのユーザスレッドがErlangスケジューラロジックによってこれらの100個のカーネルスレッドにシャッフルされます。 – mac93

+0

@ mac93はい、VM起動時に作成されます。ユーザスレッドは存在しません。スケジューラ間でシャッフルされたErlangプロセスがあり、それらはすべて独自のカーネルスレッドを持っています。 IO操作(IOバインドされたダーティNIF)にのみ使用されるIOスレッドもあり、CPUバインドダーティNIFに使用される実験的なダーティスレッドがあります。 –

関連する問題