Можно ли исчерпать идентификаторы процессов Erlang?

В ответе на этот вопрос говорится, что Erlang PID на самом деле представляют собой 28-битные целые числа, первые 10 из которых являются номером узла (всегда 0 для локального узла), а следующие 18 из которых являются индексом в глобальной таблице процессов. Итак, если я правильно понимаю, предполагая, что мы работаем только с одним узлом, максимальное количество уникальных PID составляет 2 ^ 18, или около 262000. Является ли это максимальным количеством процессов, которые я могу запустить на одном узле Erlang с течением времени? Если у меня очень долго работающий узел Erlang, произойдет ли сбой виртуальной машины после того, как я выделю свой узел 2 ^ 18 + 1, или старые неиспользуемые идентификаторы PID будут повторно использованы? Если да, то как этот процесс реализован на уровне виртуальной машины?


person Ricky Stewart    schedule 30.12.2014    source источник


Ответы (1)


ответ на другой вопрос, похоже, относится к более старой версии среды выполнения Erlang, она изменилась после R9 (R17 - это последний на данный момент). Согласно реализации идентификатор процесса использует 28 бит для внутренних идентификаторов.

Идентификаторы обрабатываются повторно, когда процесс умирает и какие-либо мониторы были уведомлены, поэтому 2 ^ 28 - это верхний предел количества одновременных процессов на узле.

Предел процесса по умолчанию составляет 2 ^ 18 и может быть увеличен с помощью параметра +P до erl, см. документация по параметрам erl.

Примечание: в документации указано, что верхний предел составляет 2 ^ 27 процессов, что не согласуется с кодом.

person johlo    schedule 30.12.2014