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_) не учитываются как сокращений.
Вопросы. После этой преамбулы вот что я хотел бы знать.
- Почему редукции используются для планирования между потоками, а не срезов времени?
- Почему только вышеуказанные команды продвигают счетчик уменьшения?
- Описание в (H'97) немного устарело, как современный Эрланг обрабатывает планирование?
(H'97) Б. Хаусман, The Erlang BEAM Virtual Machine Specification.
@ Лукас, спасибо. Это очень информативно. Интересно, есть ли способ написать (длинную, прямую линию) программы Erlang, которые запугают CPU, потому что они не связаны с кодом, который уменьшает счетчик сокращения. –
Да, но поскольку в Erlang нет циклов, кроме вызовов функций, это только теоретическая проблема. – Lukas
@ Лукас Правда, но даже если вы немного развернете функцию, скажем, 4 рекурсивных разговора, вы должны получить примерно в 4 раза больше времени на CPU по сравнению с исходной функцией. Не сказать, что это проблема на практике. –