2013-08-12 4 views
3

Когда луч Erlang VM запускает некоторый код, написанный на C, другие процессы, написанные в Erlang, не были запланированы. Например:Почему функция nif блокирует работу Erlang VM от планирования других процессов?

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

при вызове этой функции C в Erlang, другие процессы не schedulling нормально. Я хочу знать почему? Является ли это функцией или ограничено реализацией (т. Е. Это ошибка)?

Адрес кода выше в: https://github.com/davisp/sleepy

ответ

6

процессы пучка не отображаются на тему ОС напрямую. Обычно имеется 1 планировщик на ядро. Ваш звонок по адресу

sleep (10);

блокирует планировщик, который выполнил его (как и следовало ожидать, в противном случае она должна была бы перехватить этот призыв как-то сделать это без блокировки), и поэтому планировщик не может выполнить любой другой процесс Erlang до возвращения вызова , Длинные нифы сильно не рекомендуется. Быстрый Google достаточно, чтобы найти много ссылок, смотри, например 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

 Смежные вопросы

  • Нет связанных вопросов^_^