3

Erlang - хорошо известный язык программирования, который известен (среди прочего) для легкой резьбы. Erlang обычно реализуется с помощью BEAM machine. Описание (H'97) машины Эрланга ЛУЧЕВОЙ говоритСокращения в машине Erlang BEAM

Для того, чтобы гарантировать справедливое планирование процесс приостанавливается по истечении определенного количества сокращений, а затем первый процесс из очереди является возобновлено.

Меня интересует это понятие сокращения. Согласно (H'97) только следующим командам ЛУЧЕВЫМ рассчитывать как уменьшение:

  • С/СО/RESC: вызовы локального/Resident функции Эрланга
  • CL: Отменить текущий кадр стека. Вызов локальной функции Erlang.
  • CEx/TrCEx: Вызов внешней функции Erlang (прослеживается или иным образом).
  • CExL/TrCExL: Отменить текущую фрейму штабеля и вызвать внешнюю Erduang fuction (прослеженную или иначе).
  • M_C_r: Загрузить регистр аргументов x (0). Вызвать резидентную функцию Erlang.
  • M_CL_r: Загрузить регистр аргументов x (0). Отменить текущий стек стека. Вызов локальной функции Erlang.

Все эти функции включают вызов функции. Напротив, вызовы C-функций (например, TrC/TrCO) и вызовы для встроенных функций (например, вызываемые Bif_0_) не учитываются как сокращений.

Вопросы. После этой преамбулы вот что я хотел бы знать.

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

(H'97) Б. Хаусман, The Erlang BEAM Virtual Machine Specification.

ответ

2

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

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

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

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

+0

@ Лукас, спасибо. Это очень информативно. Интересно, есть ли способ написать (длинную, прямую линию) программы Erlang, которые запугают CPU, потому что они не связаны с кодом, который уменьшает счетчик сокращения. –

+0

Да, но поскольку в Erlang нет циклов, кроме вызовов функций, это только теоретическая проблема. – Lukas

+0

@ Лукас Правда, но даже если вы немного развернете функцию, скажем, 4 рекурсивных разговора, вы должны получить примерно в 4 раза больше времени на CPU по сравнению с исходной функцией. Не сказать, что это проблема на практике. –

4

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

  1. Время ломтиков не всегда точны на всех платформах и операционных системах; использование сокращений обеспечивает единообразное поведение во всех средах.
+0

Спасибо. В каком смысле точность шагов сокращения? В конце концов, команды, которые считаются сокращениями, имеют разные длительности на разных платформах. –

+0

Они пропорционально эквивалентны как друг относительно друга, так и по стоимости. –

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

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