Erlang - широко известный язык программирования, который знаменит (среди прочего) своими легкая резьба. Erlang обычно реализуется с помощью BEAM-машины . В описании (H'97) машины Erlang BEAM говорится:
Чтобы гарантировать справедливое планирование, процесс приостанавливается после фиксированного числа сокращений, а затем возобновляется первый процесс из очереди.
Меня интересует понятие редукции. Согласно (H'97) только следующие команды BEAM считаются сокращением:
- C / CO / ResC: вызывает локальную / резидентную функцию Erlang.
- CL: отменить текущий кадр стека. Вызов локальной функции Erlang.
- CEx / TrCEx: вызов внешней функции Erlang (отслеживаемой или иначе).
- CExL / TrCExL: отбросить текущий кадр стека и вызвать внешнюю функцию Erlang (отслеживаемую или иначе).
- M_C_r: загрузить регистр аргументов x (0). Вызов резидентной функции Erlang.
- M_CL_r: загрузить регистр аргументов x (0). Отменить текущий кадр стека. Вызов локальной функции Erlang.
Все это связано с вызовом функции. Напротив, вызовы C-функций (например, TrC / TrCO) и вызовы встроенных функций (например, вызываемые Bif_0_) не считаются сокращениями.
Вопросы. После преамбулы я хотел бы знать следующее.
- Почему для планирования между потоками используются сокращения, а не временные интервалы?
- Почему только вышеуказанные команды увеличивают счетчик сокращения?
- Описание в (H'97) немного устарело, как современный Erlang обрабатывает планирование?
(H'97) Б. Хаусман, Спецификация виртуальной машины Erlang BEAM.