Отправка сообщений в Erlang под капотом - PullRequest
0 голосов
/ 01 марта 2019

Отправка сообщения в Erlang - асинхронный , означающий, что выражение отправки, такое как PidB ! msg, вычисленное процессом PidA, немедленно дает результат msg, не блокируя последний.Естественно, его побочным эффектом является отправка msg на PidB.

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

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


Мне любопытно, как часть побочных эффектов !, т.е. , отправка сообщений, работает на уровне виртуальной машины, когда процессы отправителя и получателя находятся на одном и том же узле *1022*.В частности, я хотел бы знать, завершается ли операция отправки, прежде чем вернуться.Под завершением я имею в виду, что для конкретного случая локальных процессов отправитель: (i) получает блокировку в очереди сообщений получателя, (ii) записываетсообщение прямо в его очередь, (iii) снимает блокировку и, (iv) наконец возвращается.

Я натолкнулся на этот пост , который я до конца не понял, хотя, кажется, это указывает на то, что это может быть так.

1 Ответ

0 голосов
/ 02 марта 2019

Erik Stenman's The Beam Book , который объясняет многие детали реализации Erlang VM, подробно отвечает на ваш вопрос в «Lock Free Passing Message Passing» раздел.Полный ответ здесь слишком длинный, чтобы его скопировать, но краткий ответ на ваш вопрос таков: да, процесс отправки полностью копирует свое сообщение в область памяти, доступную для получателя.Если вы обратитесь к книге, то обнаружите, что она сложнее, чем шаги i-iv , которые вы описываете в своем вопросе, из-за таких проблем, как различные send флаги, то, были ли блокировки уже приняты другими процессами, несколькообласти памяти и состояние процесса приема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...