Remote procedure calls (RpC) are a useful paradigm for providing communication across a network between programs written in a high level language. This paper describes a package, written as part of the Cedar project, providing a remote procedure call facility. The paper describes the options that face a designer of such a package, and the decisions we made. We describe the overall structure of our RPC mechanism, our facilities for binding RPC clients, the transport level communication protocol, and some performance measurements. We include descriptions of some optimisations we used to achieve high performance and to minimize the load on server machines that have many clients. Our primary aim in building an RPC package was to make the building of distributed systems easier. Previous protocols were sufficiently hard to use that only members of a select group of communication experts were willing to undertake the construction of distributed systems. We hoped to overcome this by providing a communication paradigm as close as possible to the familiar facilities of our high level languages. To achieve this aim, we concentrated on making remote calls efficient, and on making the semantics of remote calls as close as possible to those of local calls. To use the package, a programmer designs an interface module (just as he would for a single-machine program), then uses a translator called Lupine to produce stub program modules which are responsible for converting local calls into calls on a package which provides node-to-node packet transport. A program wishing to make a remote call just makes a local rail to the appropriate stub module. The stub module causes the RPC runtime system to transport the appropriate packets Permission to copy without fee all or part of this material is granted provided that the copies are not made or distributed for direct commercial advantage, the ACM copyright notice and the title of the publication and its date appear, and notice is given that copying is by permission of the Association for Computing Machinery. To copy otherwise, or to republish, requires a fee and/or specific permission. © 1983 ACM 0-89791-115-6/83/010/0003 $00.75 to the corresponding stub module on the destination machine, where the packets are unpacked and a local call is made to the programmer's module implementing the desired procedure. We provide facilities for binding the parts of a distributed computation together at runtime. These facilities use the Grapevine distributed database to locate the appropriate nodes on our internet, then make an RPC call to the appropriate node to obtain the binding information. The binding is performed at the level of an interface module. Our packet transport protocol concentrates on two techniques to achieve efficiency. Firstly, we are careful to minimize the number of packets transmitted for simple calls. The simplest calls take just one packet in each direction. Secondly, we designed our connnection management to ensure that connection establishment and take down are cheap, and that maintenance of large numbers of connections does not impose an undue load on the server nodes. When a connection is idle, the only state maintained by a caller is the binding information and a machine-wide sequence number; the state maintained by a callee is just the identity and last sequence number of the caller. Furthermore, the callee (which we expect to be typically a server machine shared amongst many users) can discard the state information on a connection after a suitable interval. The package is fully implemented, and we are in the early stages of acquiring experience with its use. The paper includes some measurements of the performance of the system on test cases. We believe the parts of our RPC package that we discuss are of general interest in several ways. They represent a particular point in the design spectrum of RPC. We believe that we have achieved very good performance without adopting extreme measures, and without sacrificing useful call and parameter semantics. The techniques for managing transport level connections so as to minimize the communication costs and the state that must be maintained by a server are important in our experience of servers dealing with large numbers of users. Our binding semantics are quite powerful, but conceptually simple to a programmer familiar with single machine binding. They were easy and efficient to implement.
Remote Procedure Call (RPC) was first proposed by Birrel and Nelson in 1984 REF .