Communication in Erlang is conceptually performed using asynchronous signaling. All different executing entities such as processes, and ports communicate via asynchronous signals. The most commonly used signal is a message. Other common signals are exit, link, unlink, monitor, demonitor signals.
The amount of time that passes between a signal being sent and the arrival of the signal at the destination is unspecified but positive. If the receiver has terminated, the signal will not arrive, but it is possible that it triggers another signal. For example, a link signal sent to a non-existing process will trigger an exit signal which will be sent back to where the link signal originated from. When communicating over the distribution, signals may be lost if the distribution channel goes down.
The only signal ordering guarantee given is the following. If
an entity sends multiple signals to the same destination entity,
the order will be preserved. That is, if
Some communication is synchronous. If broken down into pieces,
a synchronous communication operation, consists of two asynchronous
signals. One request signal and one reply signal. An example of
such a synchronous communication is a call to
The implementation of different asynchronous signals in the VM may vary over time, but the behavior will always respect this concept of asynchronous signals being passed between entities as described above.
By inspecting the implementation you might notice that some specific signal actually gives a stricter guarantee than described above. It is of vital importance that such knowledge about the implementation is not used by Erlang code, since the implementation might change at any time without prior notice.
Some example of major implementation changes: