There are two basic types of communication primitives: message passing and
remote procedure call (RPC). Systems such as Camelot, Distributed Ingres, and Locus
use such primities as send and receive, while R* and Argus use RPC as their basic means
of inter-process communication.
The use of message-based primitives has its advantage in flexibility of supporting
different programming languages and applications. But it introduces a new mechanism
of inter-module interaction in distributed environments, syntactically and semantically
different from procedure calls used for inter-module interaction in single processor systems.
It is also error-prone because the send and receive primitives are syntactically unrelated.
In contrast, RPC shares not only the same syntax but also certain properties such
as compile-time type checking, with conventional procedure call. However, it is difficult
for RPC to have the same semantics as the conventional procedure call because of the
possibility of processor and communication failure. For instance, it is nontrivial to ensure
that every RPC always returns. We will discuss more on RPC semantics below