In order to isolate the architecture’s abstraction layers, while avoiding modification of existing abstraction layers, a new layer is put between the logic layer and the physical layer: the virtual layer, a layer that implements the logic viewpoint by using virtual components as shown in figure bellow. Virtualization allows us to ignore the physical components while having a sufficient level of granularity to highlight the characteristics of the physical components used in the implementation of the logic components.

A distributed solution integrates links for communication between two logic components into the software solution. Only these communication links allow a component to use the services of another component. Since use is in one direction, and a single link represents this logical use of a service, such a link is unidirectional. The unidirectional characteristic of a link does not prevent bidirectional communication between two components. This is possible by establishing two unidirectional links representing mutual consumption of services, as shown in section *Abstraction of Virtual Components*.

The virtual layer is made of logic components which provide services. These logic components depend on virtual components. Dependencies between logic components are known thanks to unidirectional communication links linking the virtual components used for communication between logic components.

Since the dependencies are unidirectional, from the point of view of a specific component, a dependency can be incoming or outgoing. For example, when component A depends on component B, A has an outgoing dependency and B has an incoming dependency.

A distributed software solution introduces a paradigm different from that of a monolithic solution. Multiple logic components make up the solution; these components are connected by communication links.

A logic component connected to another logic component via a unidirectional link creates a unidirectional acyclic graph of components (Directed Acyclic Graph, DAG). A parent logic component depends therefore on child logic components. Conversely, a logic component can have more than one incoming dependency, thereby changing the structure into a one-way graph.

The figure above shows an example where an increase in the number of logic components in a solution increases the number of communication links. Since these communication links connect virtual components, the addition of communication links can multiply the number of virtual components, resulting in increased risk of inaccessibility. The number of logic components can be arbitrarily high (e.g. tens or hundreds), and a logic component can be connected to several others. We arrive at a concept of dependency: a dependency graph has a multiplier effect on the risk of inaccessibility of a software solution. The final chapter assesses the effect in a real case.

The dependencies of a logic component are therefore the sum of all logic components and virtual components where a logic component needs to provide all the services for which it was designed. A logic component cannot communicate with another logic component without the mediation of transitional virtual components.

In the current analysis, the availability is measured in the range [0..1] ; if *I* is unavailability, availability is then calculated 1-*I*.

A solution is available only when all services provided by the logical components of the solution offer the service for which they were designed. Availability of the solution is 1 if the solution is always available from its startup until its voluntary shutdown.

Since a solution represents a graph of dependencies between logic components, the availability of all the logic and virtual components impacts the availability of the solution. If, for example, logic component C1 depends on logic component C2, availability of C1 is calculated not only taking into account the availability of C2, but also the availability of virtual components allowing communication from C1 to C2. Also, the link between logic component and virtual component is part of the virtual component, and this link impacts the availability of this component.

Since the distributed solution is necessarily based on logical components with dependencies, this availability may tend towards 1 but without so much reaching 1, unless each of the dependencies of each of the components also offers an availability of 1.

The improvement of the availability of a software solution can be achieved in several ways. One of them targets the most critical logic components and improves their availability; this allows a solution which is only partially functional, but still available for the services most critical for the software solution. Quantifying the criticality of the service offered by a logic component allows this approach.

The objective of the present study is to improve the availability of a software solution; it is necessary that all components of the solution are available, no matter how important their services for the solution. Considering the equation:

with *δ(C)* being the availability of component *C*, it is clear that if *Ci*: 0 ≤ *i* ≤ *n* is unavailable, so that *δ(C) = 0*, then *Ds = 0*.

The criticality of a logic component is redundant in the context of this analysis. The exchanged information is then used only for the internal processing of a component of the solution. This is why the logic components of a solution can be considered as black boxes.

Virtual components are connected to the logic components. As mentioned in section *Availability of a solution*, the availability of these links is an integral part of the virtual component. Conversely, when a logic component must consume the service of another logical component, a communications link must be established. That is when the virtual components are added to the virtualization layer, and a communication link must be added between each pair of components, each connected to the two virtual components, to allow this communication.

When analyzing the various interactions of a distributed software solution as well as their dependencies, all logic components must be connected either by a direct link (through virtual components which have a communications link) or through one or more other interposed logic components of the solution (always with virtual components having a communication link between each of the logic components). If no link connects a component or set of components with the rest of the software solution, they have nothing in common, or they have in common only virtual components, without any communication link between the two sets of components. In each case, these two sets of components are two software solutions independent from one another.

Other software solutions can be accessed via a given solution. These solutions are external software solutions. They expose interfaces for accessing services they offer and are dependent on an external software layer. Each of these solutions can be analyzed as a logic component in itself.

A logic component provides services that cannot be abstract in the design of the solution. Virtual components can be abstract, and therefore bring flexibility to the implementation of the solution.