消息队列
- Cloudsim消息队列futureQueue,用于保存所有的Entity之间传递的消息;
- SimEntity事件队列evbuf,用于保存Entity需要执行事件;
Cloudsim
- 执行startSimulation(),开始模拟器工作;
- 执行runStart()函数,表示开始模拟操作,把初始工作做好:其中是遍历Entity,执行Entity:startEntity()操作,每个实体执行自己的sendNow()产生消息给对应需要执行的其他实体;
- sendNow()最终会调用Cloudsim里面的send操作将这些消息放倒futureQueue中,等待调用;
- 死循环:跳出条件futureQueue队列为空
- 执行runClockTick(),返回True时,消息队列为空,跳出死循环,其中:
- 先扫描所有的Entity执行每个实体的消息队列;
- 取出futureQueue队列中的第一个消息,执行processEvent,把消息分发给对应的实体;
- 判断futureQueue队列是否为空;
- 不空:循环遍历futureQueue队列,分发执行processEvent所有当前时刻,即event时间和系统clock相同时间的消息,分发给对应的实体(添加至自己的事件队列);此时队列即使处理完了,也是返回False;
- 继续循环,执行runClockTick(),遍历Entity,由其清空/执行完自己的事件队列(这些事件是cloudSim执行processEvent中调度得到的),事件执行过程可能产生新的消息,进一步由cloudSim进行调度分配到对应的实体事件队列;
- 此时由于Entity事件发生时产生新的消息,故futureQueue队列仍不为空;
- Cloudsim继续遍历消息队列,把这些消息分发给对应的实体事件队列,死循环继续不跳出;
- 继续循环,执行runClockTick(),遍历Entity,由其清空/执行完自己的事件队列,如果此时没有新的消息产生,那么CloudSim中消息队列为空;
- 此时继续遍历futureQueue队列,发现队列为空,那么返回True,跳出死循环;
- Cloudsim:finishSimulation(),遍历实体的所有事件队列;
- Cloudsim:runStop();