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