Какая разница между "зелеными потоками" и процессами Erlang?

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

Ответ 3

Когда люди возражают против вызова процессов Erlang "зелеными потоками", они не возражают против "зеленой" части, они возражают против части "потоков".

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

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

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