Редукции в машине Erlang BEAM

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_) не считаются сокращениями.

Вопросы. После преамбулы я хотел бы знать следующее.

  1. Почему для планирования между потоками используются сокращения, а не временные интервалы?
  2. Почему только вышеуказанные команды увеличивают счетчик сокращения?
  3. Описание в (H'97) немного устарело, как современный Erlang обрабатывает планирование?

(H'97) Б. Хаусман, Спецификация виртуальной машины Erlang BEAM.


person Martin Berger    schedule 31.07.2015    source источник


Ответы (2)


Постараюсь ответить на ваши вопросы.

1) Основная причина отказа от использования временных интервалов - это производительность и переносимость. Считывание монотонного значения времени из операционной системы довольно дорого, и если нам придется делать это для каждого вызова функции, накладные расходы становятся довольно большими. Стоимость также довольно сильно варьируется в зависимости от ОС. Механизм подсчета сокращений, однако, требует, чтобы машина только умела уменьшать целые числа, что и есть у большинства машин.

2) Они этого не делают. Этот список, как вы говорите, очень устарел. С тех пор большая часть работы виртуальной машины была переписана. Как общее практическое правило; вызов функции (не возврат) или все, что может занять неизвестное количество времени, учитывает сокращения. Это включает в себя bifs, nifs, gc, отправку / получение сообщений и, возможно, многое другое, о чем я не могу сейчас думать.

3) Планирование и упреждение - это разные вещи. Возможно, вы захотите посмотреть мой веб-семинар, который я провел пару лет назад о том, как выполняется планирование: https://www.youtube.com/watch?v=tBAM_N9qPno

person Lukas    schedule 04.08.2015
comment
@ Лукас, спасибо. Это очень информативно. Интересно, есть ли способ писать (длинные, прямые) программы на Erlang, которые нагружают процессор, потому что они не включают код, уменьшающий счетчик сокращения. - person Martin Berger; 04.08.2015
comment
Да, но поскольку в Erlang нет конструкций циклов, кроме вызовов функций, это только теоретическая проблема. - person Lukas; 05.08.2015
comment
@Lucas Верно, но даже если вы немного развернете функцию, скажем, 4 рекурсивных развертывания, вы должны получить примерно в 4 раза больше времени на процессоре по сравнению с исходной функцией. Я не говорю, что это проблема на практике. - person Martin Berger; 05.08.2015

Я знаю ответ только на первый вопрос:

  1. Срезы времени не обязательно точны на всех платформах и операционных системах; использование сокращений обеспечивает единообразное поведение во всех средах
person I GIVE TERRIBLE ADVICE    schedule 01.08.2015
comment
Спасибо. В каком смысле точны шаги редукции? В конце концов, команды, которые считаются сокращениями, имеют разную продолжительность на разных платформах. - person Martin Berger; 01.08.2015
comment
Они будут пропорционально эквивалентны друг другу и по стоимости. - person I GIVE TERRIBLE ADVICE; 01.08.2015