PVM allows tasks to be spawned on independent, heterogeneous workstations and permits them to communicate over a network via message passing. It handles such problems as guaranteed message delivery, the correct sequence of message delivery, and differences in internal data representations on dissimilar architectures, thus freeing the programmer from such concerns. PVM guarantees delivery by using the TCP/IP protocol suite. This also aids in portability as any machine connected to the Internet must communicate via TCP/IP.
The developer is presented with a simple programming interface to create messages of a specified type. First a message buffer is initialized, next the message components are packed according to type and finally the message is sent with a designated message tag. On the receiving end, either a blocking or non-blocking receive can be used to retrieve any message or messages with a specific tag. The elements of the message are then unpacked by the receiver according to the same types in which they were packed.
To initialize PVM, a pvmd daemon process must be started on each of the machines participating in the virtual machine. Once the virtual machine is running, all messages are communicated from the user process to the local pvmd daemon via TCP sockets, which then sends the messages across the network to the remote pvmd daemon via UDP sockets. The remote pvmd then relays the information to the remote version of the user process again via TCP. The PVM libraries [12] are required for a user program to be able to communicate with the local pvmd daemon.