В чем разница между "зелеными нитями" и процессами Эрланга?

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам