Это упрощение, которое заходит слишком далеко, говоря о том, что процессы Эрланга не могут напрямую совместно использовать память данных, и что они только копируют значения между собой.Это скорее описание того, как это может быть реализовано, и как можно делать вид, что оно реализовано.По крайней мере, для всех целей, кроме проблем с производительностью.
Эрланг налагает несколько семантических ограничений на то, что вы можете делать как программист.Например, значения являются неизменяемыми, что означает, что вы не можете изменить их после того, как они созданы.Затем понимаешь, что нескольким процессам Эрланга было бы совершенно нормально получить доступ к одному и тому же значению в памяти, поскольку ни один из них все равно не может его изменить.И блокировки тогда не нужны.
Известные ситуации, когда это делается в Erlang / OTP:
- Большие двоичные файлы (более 64 байт) - это ссылки, подсчитанные в специальной двоичной кучеи ссылки в эту кучу передаются при обмене сообщениями.
- Литеральные значения помещаются в специальную область памяти, все процессы, ссылающиеся на них, ссылаются на значения в той же области памяти (но как только значение отправляется всообщение получает дубликат в процессе получения).
- Каждый узел представляет собой глобальную таблицу атомов, и значения атомов действительно являются ссылками на эту таблицу, что делает тестирование на равенство атомов очень эффективным (сравнивайте указатель вместо строки).
- Экспериментальная настройка
erl -hybrid
, которая объединяет кучи процессов и общие кучи, заставляя процессы сначала копировать значения из кучи процессов в общую кучу при использовании в сообщении.Я нашел этот поток о гибридных кучах , который также объясняет некоторые проблемы с концепцией.
Еще один прием, который можно сделать, - это фактически изменить значения, но убедившись, что это не так.не видноЭто должно дополнительно объяснить, что неизменные значения являются семантическим ограничением.
Вот некоторые примеры, когда OTP / Erlang фактически изменяет значения:
- «Недавние» (R12) оптимизации в обработке двоичного синтаксиса позволяют добавлять в конец двоичных файлови на самом деле не создавать полностью новый двоичный файл с добавленным новым хвостом.
- Было сказано, что вновь созданные кортежи с непосредственным set_element могут быть или когда-то были переведены компилятором для фактического изменения элементана месте для кортежа.
Эта оптимизация подпадает под теорию, что "если дерево падает в лесу, и его никто не слышит, действительно ли оно издает звук?«.То есть ссылки не должны были выходить на объект, который должен быть видоизменен.Потому что тогда можно заметить, что он изменился.
И это действительно то, что представляет собой семантика Эрланга, вещи не должны меняться как побочный эффект того, что делает какой-то другой процесс.Мы бы назвали это общим состоянием , и нам это совсем не нравится.
Другое упрощение, которое заходит слишком далеко, - это сказать, что у Эрланга нет побочных эффектов.Но это для другого вопроса, если он когда-либо задается.