Какие потоки ОС используются в абстрактной машине Erlangs, BEAM?
Ive начал изучать Erlang и обнаружил, что среда исполнения BEAM увлекательна. Обычно он утверждает, что в Erlang процессы относятся к языку, а не к ОС (что означает время выполнения, то есть BEAM в этом случае). Это легкие "зеленые процессы", которыми знаменит Эрланг. Далее он заявил (на странице 5 этот документ), что BEAM использует один (1) поток ОС для ядра процессора для планирования и другой поток ОС для i/о. Поэтому я задаюсь вопросом: из какого потока нужны циклы процессора для фактического выполнения кода Erlang?
Кроме того, если Im работает на двухъядерной машине, я ожидал бы - на основе того, что Ive читал до сих пор - увидеть три (3) потока, запущенные в процессе BEAM: два планировщика (по одному для каждого ядра) и один i/o thread. Но я вижу 10. Иногда 11. Иногда он начинается с 13 и, как высококачественные усилители, идет до 11.
Я смущен. Любое понимание будет оценено.
Ответы
Ответ 1
Следуя советам @user425720, я задал свой вопрос по erlang-questions LISTSERV. Он также доступен как Группа Google. Крестен Краб Торруп Трифорка ответил мне почти сразу. Огромное спасибо, что вышли к Крестону. Вот его ответ. (Parentheicals and emphasis are mine.)
Вот AFAIK, основной сценарий:
Код Erlang будет запущен как можно больше "зеленые нити", как есть процессы; предел процесса управляемый флагом + P (командной строки).
Зеленые нити отображаются на S потоки, где S - количество Ядра /CPU. Тот факт, что эти потоки также называются планировщикамиможет показаться несколько путают, но из точки VM они видны. От разработчика точки зрения, это потоки которые запускают ваш код erlang. число S можно контролировать с помощью параметр + S для командной строки erl.
Кроме того, существует ряд так называемых "асинхронных потоков". Это пул потоков, который используется при вводе-выводе процессы, называемые связанными в драйверах, с реагировать на выбор/опрос и т.д. количество асинхронных потоков является динамическим, но ограничен флагом + A.
Итак, 11 потоков, которые вы видите на двухъядерным может быть 2 планировщика, а 9 асинхронные потоки. Например.
Подробнее о флагах здесь.
Ответ 2
Процессы Erlang не являются "зелеными", поскольку потоки зеленые в java. Процессы Erlang - это структуры, которые не разделяют память, и они поддерживаются Erlang VM.
Это может показаться странным, но эта статья может быть "старой" (хотя биография с 2007 года). Все изменилось вокруг выпуска R13, когда мы получили новую обработку очередей времени выполнения (с динамическим балансированием и другими положительными эффектами). Вот о каком-то представлении Ульфа Вигера о нем http://ulf.wiger.net/weblog/2009/01/23/erlang-programming-for-multicore/
Подводя итог, процессы полностью прозрачны, и вы можете настроить количество очередей времени выполнения и планировщиков, но реализация ОС не является нетронутой. Я не хочу размышлять, почему есть 11 потоков.
EDIT: я немного ошибаюсь в ОС:
+S Schedulers:SchedulerOnline
Устанавливает количество потоков планировщика для создания и потоков планировщика для установки в сети, когда поддержка SMP включена.
Допустимый диапазон для обоих значений: 1-1024. Если система времени выполнения Erlang сможет определить количество сконфигурированных логических процессоров и доступных логических процессоров, планировщики по умолчанию настроят логические процессоры, а SchedulersOnline
по умолчанию будут доступны для доступных логических процессоров; в противном случае значения по умолчанию будут равны 1. Планировщики могут быть опущены, если :SchedulerOnline
нет и наоборот. Количество планировщиков онлайн может быть изменено во время выполнения через erlang:system_flag(schedulers_online, SchedulersOnline)
.
...
Этот флаг будет игнорироваться, если эмулятор не поддерживает поддержку SMP (см. -smp
).
отсюда: http://www.erlang.org/doc/man/erl.html
EDIT2: Интересная дискуссия по списку рассылки erlang-question по плюсам и минусам многих виртуальных машин и многих планировщиков. К сожалению, это также с 2008 года и может быть недействительным с огромными улучшениями в новых выпусках OTP. http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:38165:200809:nbihpkepgjcfnffkoobf