В чем разница между «зелеными нитями» и процессами Эрланга? - PullRequest
11 голосов
/ 22 декабря 2009

После прочтения об облегченных процессах Эрланга я был почти уверен, что они были "зелеными нитями". Пока я не прочитал, что есть различия между зелеными нитями и процессами Эрланга. Но я не понимаю.

Каковы фактические различия?

Ответы [ 3 ]

11 голосов
/ 22 декабря 2009

Зеленые потоки могут совместно использовать память данных между собой (хотя, конечно, требуется синхронизация).

Эрланг не использует «зеленые потоки», а скорее что-то ближе к «зеленым процессам»: процессы не разделяют память данных напрямую, а делают это, «копируя» ее (т.е. имея независимые копии исходных данных).

9 голосов
/ 22 декабря 2009

Это упрощение, которое заходит слишком далеко, говоря о том, что процессы Эрланга не могут напрямую совместно использовать память данных, и что они только копируют значения между собой.Это скорее описание того, как это может быть реализовано, и как можно делать вид, что оно реализовано.По крайней мере, для всех целей, кроме проблем с производительностью.

Эрланг налагает несколько семантических ограничений на то, что вы можете делать как программист.Например, значения являются неизменяемыми, что означает, что вы не можете изменить их после того, как они созданы.Затем понимаешь, что нескольким процессам Эрланга было бы совершенно нормально получить доступ к одному и тому же значению в памяти, поскольку ни один из них все равно не может его изменить.И блокировки тогда не нужны.

Известные ситуации, когда это делается в Erlang / OTP:

  • Большие двоичные файлы (более 64 байт) - это ссылки, подсчитанные в специальной двоичной кучеи ссылки в эту кучу передаются при обмене сообщениями.
  • Литеральные значения помещаются в специальную область памяти, все процессы, ссылающиеся на них, ссылаются на значения в той же области памяти (но как только значение отправляется всообщение получает дубликат в процессе получения).
  • Каждый узел представляет собой глобальную таблицу атомов, и значения атомов действительно являются ссылками на эту таблицу, что делает тестирование на равенство атомов очень эффективным (сравнивайте указатель вместо строки).
  • Экспериментальная настройка erl -hybrid, которая объединяет кучи процессов и общие кучи, заставляя процессы сначала копировать значения из кучи процессов в общую кучу при использовании в сообщении.Я нашел этот поток о гибридных кучах , который также объясняет некоторые проблемы с концепцией.

Еще один прием, который можно сделать, - это фактически изменить значения, но убедившись, что это не так.не видноЭто должно дополнительно объяснить, что неизменные значения являются семантическим ограничением.

Вот некоторые примеры, когда OTP / Erlang фактически изменяет значения:

  • «Недавние» (R12) оптимизации в обработке двоичного синтаксиса позволяют добавлять в конец двоичных файлови на самом деле не создавать полностью новый двоичный файл с добавленным новым хвостом.
  • Было сказано, что вновь созданные кортежи с непосредственным set_element могут быть или когда-то были переведены компилятором для фактического изменения элементана месте для кортежа.

Эта оптимизация подпадает под теорию, что "если дерево падает в лесу, и его никто не слышит, действительно ли оно издает звук?«.То есть ссылки не должны были выходить на объект, который должен быть видоизменен.Потому что тогда можно заметить, что он изменился.

И это действительно то, что представляет собой семантика Эрланга, вещи не должны меняться как побочный эффект того, что делает какой-то другой процесс.Мы бы назвали это общим состоянием , и нам это совсем не нравится.

Другое упрощение, которое заходит слишком далеко, - это сказать, что у Эрланга нет побочных эффектов.Но это для другого вопроса, если он когда-либо задается.

6 голосов
/ 23 декабря 2009

Когда люди возражают против того, чтобы называть процессы Эрланга «зелеными нитями», они не возражают против «зеленой» части, они возражают против «нитей».

Различие между потоками и процессами заключается в том, что потоки имеют только свой собственный указатель инструкций, но совместно используют все остальное (особенно состояние, память, адресное пространство). Процессы OTOH полностью изолированы и ничего не разделяют.

Процессы Эрланга ничего не разделяют, поэтому они являются настоящими процессами. Однако они обычно реализуются «зеленым» способом. Таким образом, технически они являются «зелеными процессами».

Я обычно называю их "зелеными нитями", когда хочу подчеркнуть легкий вес реализации , и называю их "процессами", когда я хочу подчеркнуть семантику с общим доступом . Таким образом, мне не нужно объяснять, что я имею в виду под «зелеными процессами».

...