3

Erlang VM ビームが C で記述されたコードを実行すると、Erlang で記述された他のプロセスがスケジュールされませんでした。例えば:

static ERL_NIF_TERM
        nifsleep(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        {
            sleep(10);
            return enif_make_atom(env, "ok");
        }

この C 関数を Erlang で呼び出すと、他のプロセスが正常にスケジューリングされませんでした。なぜ知りたいのですか?これは機能ですか、それとも実装によって制限されていますか (つまり、これはバグですか)?

上記のコードのアドレスはhttps://github.com/davisp/sleepyにあります。

4

1 に答える 1

6

ビーム プロセスは OS スレッドに直接マップされません。通常、コアごとに 1 つのスケジューラーがあります。への電話

睡眠 (10);

それを実行したスケジューラーをブロックしているため (予想どおり、そうでなければ、何らかの方法でその呼び出しをインターセプトして非ブロック化する必要があります)、そのため、スケジューラーは呼び出しが戻るまで他の erlang プロセスを実行できません。nif を長時間実行することは強くお勧めしません。多くの参照を見つけるには、簡単なグーグルで十分です。たとえば、 http://www.erlang.org/doc/man/erl_nif.html#lengthy_workを参照してください。

http://osdir.com/ml/erlang-questions-programming/2013-02/msg00275.html

http://ninnines.eu/articles/erlang-scalability

スケジューラーの動作に関する包括的な情報については、 http://jlouisramblings.blogspot.com.ar/2013/01/how-erlang-does-scheduling.htmlを参照してください。

于 2013-08-12T03:02:22.127 に答える