Automatic Generation of an Intelligent Concurrency Adaptor in order
to Mediate the Differences between Conflicting Concurrency Interfaces
THE DISSERTATION YOU ARE ABOUT TO READ, tries to
solve one of the more prominent problems within open distributed systems
namely: concurrency management between components written by different
manufacturers. All too often, the concurrency strategy provided or
required by a component is badly documented and rarely matches the
concurrency strategy provided or required by another component. Whenever
this happens there is a concurrency interface conflict. Solving these
conflicts requires a substantial amount of resources with respect
to software engineering: the time necessary to understand the problem,
the time necessary to solve the problem, and above all the resources
towards maintaining a working concurrency strategy that mediates between
the different components. Indeed, in open distributed systems, components
can be updated without prior notification and without guarantees that
the new interface is backward compatible. Such updates can range from
syntactic modifications over slight semantic differences to completely
new concurrency strategies. For example, changing a nested locking
strategy to a non-nested locking strategy or changing a non-blocking
server to work synchronously.
In order to solve the problem of conflicting concurrency interfaces
we will create a concurrency adaptor that resolves incompatibilities
between incompatible concurrency strategies. We do this in two steps:
first we require a certain amount of extra information to be present:
every provided and required interface should be documented by means
of colored Petri-nets and certain checkpoints are to be placed in
the code to check the liveness.
Second, we construct a concurrency adaptor that can be placed between
the different communicating components. This is done by means of a
hybrid approach: first the adaptor will try to gain freedom by bypassing
all the existing concurrency strategies. For a client a stub concurrency
interface is generated that will keep the client alive. For a server
a stub concurrency interface is generated that will allow anything
to happen; in essence bypassing the concurrency strategy entirely.
The concurrency adaptor is finished by plugging in an existing, formally
guaranteed to work concurrency strategy between the two stub concurrency
interfaces.
Bypassing a server's behavior is achieved by means of a runtime formal
deduction. Given the current state of the Petri-net and the required
state a prolog program deduces what should happen. Bypassing a clients
behavior is achieved with a reinforcement learning algorithm that
maximizes the reward it receives from the component itself. The rewards
are based on checkpoints as specified by the component itself.
When placing a guaranteed to work concurrency strategy between the
different stub concurrency-interfaces, we need a meta-protocol
that is understood by this central concurrency strategy. This meta-protocol
specifies which resources are present and which locking/unlocking
operations can work upon them. The meta-protocol is deduced entirely
from the Petri-nets involved.
The approach presented in this dissertation provides a substantial
added value to the programmer of components in open distributed systems.
He now only needs to specify what he requires or provides as a concurrency
strategy within his component. He no longer needs to take into account
the concurrency strategy offered by other components. This might reduce
development and maintenance time drastically. A second advantage of
using Petri-nets is that interfaces are not only documented, but that
this information can be verified automatically: whenever necessary
the formal specification can be tested against the actual working
of a component.
keywords: distributed systems, mobile multi-agent
systems, Petri-nets, concurrency strategies, reinforcement learning,
component based development.
Werner
2004-03-07