3

当 Erlang VM Beam 运行一些用 C 编写的代码时,其他用 Erlang 编写的进程没有被调度。例如:

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

当你在 Erlang 中调用这个 C 函数时,其他进程没有正常调度。我想知道为什么?这是一个特性还是受实现的限制(即这是一个错误)?

上面代码的地址在:https ://github.com/davisp/sleepy

4

1 回答 1

6

束进程不直接映射到操作系统线程。每个核心通常有 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://ninenines.eu/articles/erlang-scalability

有关调度程序如何工作的全面信息,请参阅 http://jlouisramblings.blogspot.com.ar/2013/01/how-erlang-does-scheduling.html

于 2013-08-12T03:02:22.127 回答