Reliability of distributed systems can be described in terms of the reliability of processing elements and communication links and also of the redundancy of programs and data files. The traditional terminal-pair reliability does not capture the redundancy of programs and files in a distributed system. Two reliability measures are introduced. These are: distributed program reliability, describing the probability of successful execution of a program requiring cooperation of several computers, and distributed system reliability, which is the probability that all the programs that make the system operational run without any faults or errors. A unified approach based on graph traversal to evaluate the proposed reliability measures is developed. A sensitivity analysis is included to determine, in a cost-effective manner, the number of redundant copies of programs and data files required to design reliable distributed systems.