为什么nif函数会阻止Erlang VM调度其他进程?

时间:2013-08-12 01:52:45

标签: erlang beam erlang-nif

当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");
        }

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

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

1 个答案:

答案 0 :(得分:6)

beam进程未直接映射到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://ninenines.eu/articles/erlang-scalability

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