gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:52:00 27 4
gpt4 key购买 nike

当 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

最佳答案

beam 进程不直接映射到 OS 线程。每个核心通常有 1 个调度程序。您的来电

sleep(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

关于erlang - 为什么 nif 函数会阻止 Erlang VM 调度其他进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com