Cloudsim之ContainerCloudsimExample1.java运行机理剖析

一、模拟平台初始化

首先,设置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);
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值