一、模拟平台初始化
首先,设置Cloudsim模拟平台参数,包括traceFlag,calendar,numUser等,然后执行CloudSim.init()初始化模拟平台。
CloudSim.init()功能有多种实现,其中一种实现包括
1、初始化A类静态变量(实体表,实体名字索引表,future表,deferred表,waitPredicates表,clock,running),标志是"Initialising...";和初始化B类静态变量(traceFlag,calendar,CloudSimShutdown实体),没有标志。
解释:
CloudSimShutdown实体的processEvent是numUser--,如果事件是CloudSimTags.ABRUPT_END_OF_SIMULATION或者用户数量减成了0就CloudSim.abruptallyTerminate()(就是令abruptTerminate = true)。
2、创建一个CloudInformationService实体(以下简称CIS)
解释:
CloudInformationService实体包括resList,arList,gisList(拼错了,应该是cisList),即在CIS中注册过的所有实体ID表,with Advanced Reservation feature的实体ID表,所有CIS的ID表。CIS实体的processEvent是根据ev.tag(时间分为添加gis、请求gisList,添加实体,添加withAR的实体,请求resList,请求arList,其他异常)。CIS实体还可以把CloudSimTags.END_OF_SIMULATION发给所有实体(resList,gisList),通知他们要结束模拟了。
二、创建数据中心及各类实体事件
首先,定义并创建容器分配策略(应该分配到哪个虚拟机)、迁移策略(虚拟机选择策略,主机选择策略),迁移阈值(overUtil和underUtil),Broker,物理机表,虚拟机表,容器表,虚拟机分配策略(应该分配到哪个主机),任务表(CloudletList),然后初始化它们(顺序有依赖,以上顺序不对),或者创建一个数据中心
然后,把任务表,容器表,虚拟机表提交给broker。
最后,设置模拟最迟结束时间CloudSim.terminateSimulation(86400.00)。
实体创建的时候会执行CloudSim.addEntity(),这个会往future里面添加CREATE事件。
三、开始模拟
执行CloudSim.startSimulation(),标志是"Starting CloudSim version ",返回结束时刻。
首先run,然后重置B类静态变量和cis,cisID。
1、run
run返回结束时刻
(1)runstart();
对于所有在entities表中的实体ent,执行ent.startEntity()。
而startEntity有很多实现,有些会往future里面添加SEND事件。
完成标志是"Entities started."。
(2)while(true)runClockTick();
当然,每次循环都会判断是否paused或者Terminate或者future是不是空。
关于runClockTick():
1)对于所有在entities表中的实体ent,如果是RUNNABLE的就执行ent.run()。
evbuf
ent.process(),处理deferred表里的相关事件。
2)处理future表中的发生时间最早的一个或多个事件(发生时间相同)。
注意,系统时钟clock在这里会变成事件的时间!
clock = e.eventTime();
事件类型大概有ENULL,CREATE,SEND,HOLD_DONE。
ENULL事件:事件是NULL。
CREATE事件:e.startEntity(),没有标志。
SEND事件:
dest存在是WAITING状态,(下面这段看不懂,直接copy过来了)
Integer destObj = Integer.valueOf(dest); Predicate p = waitPredicates.get(destObj); if ((p == null) || (tag == 9999) || (p.match(e))) { dest_ent.setEventBuffer((SimEvent) e.clone()); dest_ent.setState(SimEntity.RUNNABLE); waitPredicates.remove(destObj); } else { deferred.addEvent(e); }
dest存在不是WAITING状态,将这个事件添加到deferred表。
HOLD_DONE事件:将某个实体的状态设置成RUNNALE。
(3)finishSimulation();
如果不是abruptTerminate,所有实体再ent.run()一下。
所有实体执行ent.shutdownEntity()。
各种变量全部变null或者0。
(4)runStop();
printMessage("Simulation completed.");
四、结束模拟
执行CloudSim.stopSimulation()。
五、输出任务的模拟结果(ID,状态,数据中心ID,虚拟机ID,时刻,开始时刻,结束时刻)
List<ContainerCloudlet> newList = broker.getCloudletReceivedList(); printCloudletList(newList);