4.1. CloudSim core simulation framework
As discussed previously, GridSim is one of the building blocks of CloudSim. However, GridSim
uses the SimJava library as a framework for event handling and inter-entity message passing.
SimJava has several limitations that impose some restrictions with regard to creation of scalable
simulation environments such as:
• It does not allow resetting the simulation programmatically at run-time.
• It does not support creation of new simulation entity at run-time (once simulation has been
initiated).
• Multi-threaded nature of SimJava leads to performance overhead with the increase in system
size. The performance degradation is caused by the excessive context switching between
threads.
• Multi-threading brings additional complexity with regard to system debugging.
To overcome these limitations and to enable simulation of complex scenarios that can involve a
large number of entities (on a scale of thousands), we developed a new discrete event management
framework. The class diagram of this new core is presented in Figure 7(a). The related classes are
the following:
CloudSim: This is the main class, which is responsible for managing event queues and controlling
step-by-step (sequential) execution of simulation events. Every event that is generated by the
CloudSim entity at run-time is stored in the queue called future events. These events are sorted
by their time parameter and inserted into the queue. Next, the events that are scheduled at each
step of the simulation are removed from the future events queue and transferred to the deferred
event queue. Following this, an event processing method is invoked for each entity, which chooses
events from the deferred event queue and performs appropriate actions. Such an organization allows
flexible management of simulation and provides the following powerful capabilities:
• Deactivation (holding) of entities.
• Context switching of entities between different states (e.g. waiting to active). Pausing and
resuming the process of simulation.
• Creation of new entities at run-time.
• Aborting and restarting simulation at run-time.
DeferredQueue: This class implements the deferred event queue used by CloudSim.
FutureQueue: This class implements the future event queue accessed by CloudSim.
CloudInformationService: A CIS is an entity that provides resource registration, indexing, and
discovering capabilities. CIS supports two basic primitives: (i) publish(), which allows entities to
register themselves with CIS and (ii) search(), which allows entities such as CloudCoordinator
and Brokers in discovering status and endpoint contact address of other entities. This entity also
notifies the (other?) entities about the end of simulation.
SimEntity: This is an abstract class, which represents a simulation entity that is able to send
messages to other entities and process received messages as well as fire and handle events. All
entities must extend this class and override its three core methods: startEntity(), processEvent() and
shutdownEntity(), which define actions for entity initialization, processing of events, and entity
destruction, respectively. SimEntity class provides the ability to schedule new events and send
messages to other entities, where network delay is calculated according to the BRITE model. Once
created, entities automatically register with CIS.
CloudSimTags. This class contains various static event/command tags that indicate the type of
action that needs to be undertaken by CloudSim entities when they receive or send events.
SimEvent: This entity represents a simulation event that is passed between two or more entities.
SimEvent stores the following information about an event: type, init time, time at which the event
should occur, finish time, time at which the event should be delivered to its destination entity, IDs
of the source(s?) and destination entities, tag of the event, and data that have to be passed to the
destination entity.
CloudSimShutdown: This is an entity that waits for the termination of all end-user and broker
entities, and then signals the end of simulation to CIS.
Predicate: Predicates are used for selecting events from the deferred queue. This is an abstract
class and must be extended to create a new predicate. Some standard predicates are provided that
are presented in Figure 7(b).
PredicateAny: This class represents a predicate that matches any event on the deferred event
queue. There is a publicly accessible instance of this predicate in the CloudSim class, called
CloudSim.SIM ANY, and hence no new instances need to be created.
PredicateFrom: This class represents a predicate that selects events fired by specific entities.
PredicateNone: This represents a predicate that does not match any event on the deferred event
queue. There is a publicly accessible static instance of this predicate in the CloudSim class, called
CloudSim.SIM NONE; hence, the users are not needed to create any new instances of this class.
PredicateNotFrom: This class represents a predicate that selects events that have not been sent
by specific entities.
PredicateNotType: This class represents a predicate to select events that do not match specific
tags.
PredicateType: This class represents a predicate to select events with specific tags.