More precisely, the system consists of two parts. The first part is a daemon program, called pvmd3 or pvmd. This daemon must run on every computer in the network that is to be used in the computing network. If there is no daemon available for this system, the system cannot be used. The daemon allows a computer to be used in different PVM's. The second part in the PVM system is a library. This library contains a number of tools and routines necessary to start up programs, add or remove computers from the virtual machine etc. In the current implementation of PVM, three programming languages are supported, namely C, C++ and FORTRAN, since these languages are most often used in scientific computing.
Now, when designing an application using PVM, you have to take into account that the basic element of computation is a task. Such a task usually corresponds with a UNIX task. It can, using the functionality offered by the PVM library, start up and kill other tasks, communicate with them and much more. A complete description and manual can be found in [GBD+94]. It is important to notice that the execution of tasks can be handled completely by the PVM daemon. We can let PVM decide on which computer and when exactly the task is effectively executed (of course, as fast as possible and taking into account the dependencies between the computations performed in the tasks). On the other hand, if you know that a certain computer is particularly fast in handling the computation needed by a certain task, it is perfectly possible to assign that task to that computer. As you can see, PVM allows great flexibility in parallel and concurrent computation and at the same time provides an abstract interface to the network of computers so you don't have to worry about specific implementations for different architectures.