Какие потоки ОС используются в абстрактной машине 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