Advances in technology invariably lead to the construction of systems with additional layers of complexity being wrapped around more primitive but equally complex sub-systems. In the future, these systems may then, in turn, become sub-systems of larger, even more complex, super-systems. Simulators provide a means by which such abstract and real world systems may be understood and evaluated by duplicating the behaviour of these systems through hardware and software. Formally, we can define simulation as:
``...the process of designing a model of a real system and conducting experiments with this model for the purpose either of understanding the behaviour of the system of or evaluating various strategies (within the limits imposed by a criterion or a set of criteria) for the operation of the system.'' 
Simulators must adapt to increases in system complexity by permitting users to simulate a system at several conceptual levels. Unfortunately, the design and implementation of simulators is almost as complex as the systems being simulated. As a result, there has been a concerted effort by the software community to apply the latest advancements in software technology in an attempt to counteract this ever increasing complexity. Their efforts have lead to simulators which are easy to maintain and extend while at the same time preserving their relative efficiency. The prominent paradigm currently being used to implement simulators is the ubiquitous object-oriented  paradigm, in which software entities closely model their real world counterparts. This paradigm has been successfully employed to implement a wide variety of simulators ranging from sawmill production  to air base logistics .
This thesis represents a major enhancement to an existing discrete-event simulation engine  which employs distributed event queues as its primary mechanism for event management instead of the more commonly used global event queue. By adopting a concept of local time, it will be shown how the global event queue may be replaced by several distributed queues, each of which are self contained within a simulation component. The system being simulated can then be decomposed hierarchically into several such components thereby promoting extensibility and modularity of the simulation system. Details will also be provided regarding how this simulation technique addresses the need for extensibility and how the simulation entities may be reused from system to system so as to avoid needless duplication of effort when constructing a new system. The advantages and disadvantages of using a global queue versus distributed queues will be discussed as the two simulation techniques are compared from a design, implementation and philosophical perspective.
In addition to describing and comparing the two simulation strategies described above, this report will also discuss the design and implementation issues associated with providing the simulator engines with a graphical user interface. Such an interface can be used to layout and connect the simulation entities, observe the dynamics of the system during simulation and collect various reports upon completion of the simulation for verification or performance evaluation. The ability to observe the dynamic interaction between components makes the simulator an ideal tool for understanding subtle aspects of a particular design or to teach novice designers the fundamental behaviour of elementary systems.
Before presenting details about the design and implementation of a distributed queue simulator, this chapter will provide a general overview of simulation. The need for simulators will be explained as will the potential problems that may arise through their imprudent use. After discussing some different simulation models, a few practical uses of simulators will be described.