запускается в ОС один процесс беам виртуальной машины? Или по одному процессу на одно ядро? Или один процесс с количеством тредов равным количеству ядер?
И внутри виртуальной машины: каждый отдельный процесс (например запущенный супервизор и три ген сервера) они же не пораждают в системе отдельный треды? Они крутятся только внутри вм и система их не видит как отдельные процессы и/или треды? То есть мы оперируем понятием процесса не на уровне ос, а абстракцией процесса внутри вм. Верно мыслю?
P.S. Готовлюсь к собесу, очень не хочу обосраться )
http://www.unlimitednovelty.com/2009/01/cutting-edge-of-vm-design.html?m=1
> один процесс с количеством тредов равным количеству ядер Так
Ты верно мыслишь, но давай уточним некоторые моменты. 1. BEAM и процессы ОС: Да, при запуске приложения на Erlang или Elixir, виртуальная машина BEAM запускается как один процесс в операционной системе. 2. Потоки в BEAM: BEAM использует потоки для некоторых задач, таких как асинхронный ввод/вывод, но основное выполнение кода обычно происходит в одном потоке. В новых версиях Erlang/OTP BEAM может использовать несколько потоков для выполнения кода, соответствующих числу ядер вашего процессора, что делает его многозадачным на уровне ОС. Но это регулируется настройками. 3. Процессы в BEAM: Когда мы говорим о "процессах" в контексте Erlang или Elixir, мы обычно имеем в виду легковесные процессы BEAM, а не процессы ОС. Эти процессы очень дешевы по ресурсам и их можно создать миллионы. Они не связаны непосредственно с потоками или процессами ОС. 4. Треды и процессы: Процессы в BEAM действительно не порождают отдельные потоки или процессы на уровне ОС. Они полностью управляются и планируются BEAM. Таким образом, когда ты говоришь о процессах в Elixir, ты действительно имеешь в виду абстракцию, предоставляемую BEAM, а не реальные процессы или потоки ОС. Удачи на собеседовании! Если будут еще вопросы – обращайся!
В дополнение к ответу выше: observer помогает разобраться с тем, что происходит внутри проекта, включая деревья. из iex можно запустить как :observer.start() только нужно, чтобы erlang был собран с wx и был в наличии X-сервер (то есть на винде нужно будет дополнительно кое-что доставить). Скрин во вложении. Видно, что десять ядер обнаружила BEAM и запустила 10 планировщиков [1] и [2]. И что запущено 920 процессов (или 915… похоже на баг, но моет быть и фича) [3]. Про “миллионы процессов” - запустить их мжно, но существуют лимиты на максимальное количество процессов, по умолчанию (до OTP26 включительно) - 262144. Обычно больше не нужно даже на нагруженных проектах (потому что вряд ли там один инстанс обслуживает всех клиентов), но если нужно - всегда можно возпользоваться флагом -P <num> для того, чтобы лимит изменить. Расскажи потом про успехи на собесе :)
Обсуждают сегодня