N-version programming is defined as the independent generation of N 2 functionally equivalent programs from the same initial specification. The N programs possess all the necessary attributes for concurrent execution, during which comparison vectors ("c-vectors") are generated by the programs at certain points. The program state variables that are to be included in each c-vector and the cross-check points ("cc-points") at which the c-vectors are to be generated are specified along with the initial specification. Independent generation of programs" here means that the programming efforts are carried out by N individuals or groups that do not interact with respect to the programming process. Wherever possible, different algorithms and programming languages (or translators) are used in each effort. The initial specification is a formal specification in a specification language. The goal of the initial specification is to state the functional requirements completely and unambiguously, while leaving the widest possible choice of implementations to the N programming efforts. The actions to be taken at the cc-points after the exchange of c-vectors are also specified along with the initial specification.
1. Reliability method description
The aim of NVP is to improve the reliability of software operation by building in fault tolerance or redundancy. In NVP, since all the versions are built to satisfy the same requirements, it requires considerable development effort. But the complexity is not greater than inherent complexity of building a single version. Comparison of outputs and declaration of single result is carried out by output selection algorithm or voting algorithm (Figure 2). The output selection algorithms should be capable of detecting erroneous version outputs and prevent the propagation of bad values to main output. The output selection algorithm should be developed considering the application attributes like safety and reliability.
For applications where safety is a main concern, algorithm should be capable of detecting erroneous outputs and prevent the propagation of bad values to the main output. Also, the algorithm should be capable of declaring an error condition or initiate an acceptable safe output sequence, when it cannot achieve a high confidence of selecting a correct output. For increased reliability, algorithm should be developed such that output is correct with a very high probability.
Some of the generalized selection algorithms are Formalized majority vote, generalized median voter, formalized plurality voter and weighted averaging techniques. Other voting techniques that are being investigated are based on neural network and Genetic algorithm techniques. They are implemented such that their performance is related to the application and the particular characteristic of the software versions.
Software reliability is defined as the probability of failure-free software operation over a specified period of time in a specified environment. Design perfection is reflected by software reliability. Software reliability problems are common because of the high software - complexity. Software reliability is considered to be an important attribute of software quality. Other attributes of software quality are: