每个CloudSim实体都继承并实现了SimEntity类的processEvent()方法,用来处理与其自身逻辑相关的事件,比如与DatacenterBroker相关的事件有:请求数据中心特征事件,虚拟机创建情况反馈事件,任务完成返回事件,仿真结束事件等。

CloudSim的事件都是在系统运行过程中不断产生的,并添加到等待队列,每个时钟要处理的事件会从等待队列(future)添加到延时队列中(deferred),在上一篇博文中详细分了runClockTick()方法,该方法实现在一个时钟心跳内处理在延时队列和等待队列中的事件,将队列中事件与相应的实体关联起来,利用该实体的processEvent()方法具体的处理事件。

DatacenterBroker是CloudSim中一个核心实体,它也有自己的事件处理方法,下面将详细分析其processEvent():

点击(此处)折叠或打开

  1. // 处理与DatacenterBroker相关的事件
  2. @Override
  3. public void processEvent(SimEvent ev) {
  4. switch (ev.getTag()) {
  5. // Resource characteristics request
  6. // 资源特征请求事件(数据中心特征)
  7. case CloudSimTags.RESOURCE_CHARACTERISTICS_REQUEST:
  8. processResourceCharacteristicsRequest(ev);
  9. break;
  10. // Resource characteristics answer
  11. // 资源特征反馈事件
  12. case CloudSimTags.RESOURCE_CHARACTERISTICS:
  13. processResourceCharacteristics(ev);
  14. break;
  15. // VM Creation answer
  16. // 虚拟机创建反馈事件
  17. case CloudSimTags.VM_CREATE_ACK:
  18. processVmCreate(ev);
  19. break;
  20. // A finished cloudlet returned
  21. // 任务完成返回事件
  22. case CloudSimTags.CLOUDLET_RETURN:
  23. processCloudletReturn(ev);
  24. break;
  25. // if the simulation finishes
  26. // 仿真结束事件
  27. case CloudSimTags.END_OF_SIMULATION:
  28. shutdownEntity();
  29. break;
  30. // other unknown tags are processed by this method
  31. default:
  32. // 处理其他未知事件,可扩展
  33. processOtherEvent(ev);
  34. break;
  35. }
  36. }

1、processResourceCharacteristicsRequest(SimEvent  ev)分析

点击(此处)折叠或打开

  1. // 处理数据中心特征请求事件
  2. protected void processResourceCharacteristicsRequest(SimEvent ev) {
  3. // 这是数据中心ID列表,实际每个数据中心ID对应该数据中心的所有物理机列表
  4. setDatacenterIdsList(CloudSim.getCloudResourceList());
  5. // 初始化数据中心特征列表
  6. setDatacenterCharacteristicsList(new HashMap<Integer, DatacenterCharacteristics>());
  7. Log.printLine(CloudSim.clock() + ": " + getName() + ": Cloud Resource List received with "
  8. + getDatacenterIdsList().size() + " resource(s)");
  9. // 向每个数据中心发送特征请求,创建数据中心特征事件
  10. for (Integer datacenterId : getDatacenterIdsList()) {
  11. sendNow(datacenterId, CloudSimTags.RESOURCE_CHARACTERISTICS, getId());
  12. }
  13. }

2、processResourceCharacteristics(ev)分析

点击(此处)折叠或打开

  1. // 处理数据中心返回的数据中心特征
  2. protected void processResourceCharacteristics(SimEvent ev) {
  3. // 获取数据中心返回的数据中心特征
  4. DatacenterCharacteristics characteristics = (DatacenterCharacteristics) ev.getData();
  5. // 添加数据中心特征ID与数据中心特征的映射
  6. getDatacenterCharacteristicsList().put(characteristics.getId(), characteristics);
  7. // DatacenterBroker获取了所有数据中心的特征
  8. if (getDatacenterCharacteristicsList().size() ==  getDatacenterIdsList().size()) {
  9. setDatacenterRequestedIdsList(new ArrayList<Integer>());
  10. // DatacenterBroker了解到所有数据中心后,开始向数据中心创建虚拟机
  11. createVmsInDatacenter(getDatacenterIdsList().get(0));
  12. }
  13. }

DatacenterBroker获取了所有数据中心特征,开始在数据中心创建虚拟机:

点击(此处)折叠或打开

  1. // 在数据中心上创建虚拟机
  2. protected void createVmsInDatacenter(intdatacenterId) {
  3. // send as much vms as possible for this datacenter before trying the next one
  4. // 尽量在一个数据中心上创建更多的虚拟机
  5. int requestedVms = 0;
  6. String datacenterName = CloudSim.getEntityName(datacenterId);
  7. for (Vm vm : getVmList()) {
  8. if (!getVmsToDatacentersMap().containsKey(vm.getId())) {
  9. Log.printLine(CloudSim.clock() + ": " + getName() + ": Trying to Create VM #" + vm.getId()
  10. + " in " + datacenterName);
  11. // 向该数据中心发送虚拟机创建请求事件,等待该数据中心处理该事件
  12. sendNow(datacenterId,CloudSimTags.VM_CREATE_ACK, vm);
  13. requestedVms++;// 向某数据中心请求创建虚拟机的次数
  14. }
  15. }
  16. // 将该数据中心ID添加到数据中心请求列表
  17. getDatacenterRequestedIdsList().add(datacenterId);
  18. setVmsRequested(requestedVms);// 设置请求次数
  19. setVmsAcks(0);// 设置应答次数
  20. }

3、processVmCreate(ev)分析

点击(此处)折叠或打开

  1. // 只是返回对虚拟机创建请求的一个响应,虚拟机的实际创建在这之前就完成了。
  2. protected void processVmCreate(SimEvent ev){
  3. int[] data = (int[]) ev.getData();
  4. int datacenterId = data[0];
  5. int vmId = data[1];
  6. int result = data[2];
  7. if (result == CloudSimTags.TRUE) {
  8. // 添加虚拟机ID与数据中心ID的映射
  9. getVmsToDatacentersMap().put(vmId,datacenterId);
  10. // 将创建的虚拟机从vmList添加到vmCreatedList(vmList保存待创建的vm列表)
  11. getVmsCreatedList().add(VmList.getById(getVmList(), vmId));
  12. Log.printLine(CloudSim.clock() + ": " + getName() + ": VM #" + vmId
  13. + " has been created in Datacenter #" + datacenterId + ", Host #"
  14. + VmList.getById(getVmsCreatedList(), vmId).getHost().getId());
  15. } else {
  16. Log.printLine(CloudSim.clock() + ": " + getName() + ": Creation of VM #" + vmId
  17. + " failed in Datacenter #" + datacenterId);
  18. }
  19. incrementVmsAcks(); // 增加创建vm应答的次数
  20. // all the requested VMs have been created
  21. // 所有待创建的虚拟机都创建完毕
  22. if (getVmsCreatedList().size() ==getVmList().size() - getVmsDestroyed()) {
  23. submitCloudlets(); // 提交用户任务至特定虚拟机
  24. } else {
  25. // all the acks received, but some VMs were not created
  26. // 所有的ack都收到了,但是有些vm未被创建
  27. if (getVmsRequested() ==getVmsAcks()) {
  28. // find id of the next datacenter that has not been tried
  29. // 尝试在其他数据中心上创建虚拟机
  30. for (int nextDatacenterId : getDatacenterIdsList()) {
  31. if (!getDatacenterRequestedIdsList().contains(nextDatacenterId)) {
  32. createVmsInDatacenter(nextDatacenterId);
  33. return;
  34. }
  35. }
  36. // all datacenters already queried
  37. if (getVmsCreatedList().size() > 0) { // if some vm were created
  38. submitCloudlets(); // 提交用户任务至特定虚拟机
  39. } else { // no vms created. abort
  40. Log.printLine(CloudSim.clock() + ": " + getName()
  41. + ": none of the required VMs could be created. Aborting");
  42. finishExecution(); // 结束仿真
  43. }
  44. }
  45. }
  46. }

所有虚拟机创建成功后,向虚拟机分配云任务

点击(此处)折叠或打开

  1. // 将任务列表中的所有任务,分别提交给虚拟机
  2. protected void submitCloudlets() {
  3. int vmIndex = 0;
  4. for (Cloudlet cloudlet : getCloudletList()) {
  5. Vm vm;
  6. // if user didn't bind this cloudlet and it has not been executed yet
  7. // 如果该云任务还没有绑定虚拟机
  8. if (cloudlet.getVmId() == -1) {
  9. // 直接从已创建的虚拟机中从索引0开始找一台虚拟机,可是这台虚拟机(资源利用率、性能下降)可用吗?
  10. vm = getVmsCreatedList().get(vmIndex);
  11. } else { // submit to the specific vm // 该任务之前已经指定了虚拟
  12. vm = VmList.getById(getVmsCreatedList(), cloudlet.getVmId());
  13. if (vm == null) { // vm was not created // 指定的虚拟机创建失败,重新分配
  14. Log.printLine( CloudSim.clock() + ": " + getName() + ": Postponing execution of cloudlet "
  15. + cloudlet.getCloudletId() + ": bount VM not available");
  16. continue;
  17. }
  18. }
  19. Log.printLine(CloudSim.clock() + ": " + getName() + ": Sending cloudlet "
  20. + cloudlet.getCloudletId() + " to VM #" + vm.getId());
  21. // 任务与虚拟机绑定
  22. cloudlet.setVmId(vm.getId());
  23. // 创建任务提交事件
  24. sendNow(getVmsToDatacentersMap().get(vm.getId()), CloudSimTags.CLOUDLET_SUBMIT, cloudlet);
  25. cloudletsSubmitted++; // 记录任务提交数
  26. vmIndex = (vmIndex + 1) %getVmsCreatedList().size(); // vmIndex加1,多于vm数时,再从第一台vm开始
  27. // 将该任务添加到已任务已提交列表
  28. getCloudletSubmittedList().add(cloudlet);
  29. }
  30. // remove submitted cloudlets from waiting list
  31. // 将已经提交的任务从cloudletList中移除
  32. for (Cloudlet cloudlet : getCloudletSubmittedList()) {
  33. getCloudletList().remove(cloudlet);
  34. }
  35. }

4、processCloudletReturn(ev)分析

点击(此处)折叠或打开

  1. // 处理任务完成返回事件
  2. protected void processCloudletReturn(SimEvent ev) {
  3. // 获取该执行完成的用户任务
  4. Cloudlet cloudlet = (Cloudlet) ev.getData();
  5. // 将该任务添加到已完成任务列表
  6. getCloudletReceivedList().add(cloudlet);
  7. Log.printLine(CloudSim.clock() + ": " + getName() + ": Cloudlet " + cloudlet.getCloudletId()
  8. + " received");
  9. cloudletsSubmitted--; // 任务提交数减一
  10. // 满足下面条件,说明所有用户任务都执行完毕
  11. if (getCloudletList().size() == 0 &&cloudletsSubmitted == 0) { // all cloudlets executed
  12. Log.printLine(CloudSim.clock() + ": " + getName() + ": All Cloudlets executed. Finishing...");
  13. clearDatacenters(); // 清理数据中心
  14. finishExecution(); // 仿真结束
  15. } else { // some cloudlets haven't finished yet // 有些任务还没有执行结束
  16. // 所有任务都已经提交,但是有些任务阻塞了,可能是在等待虚拟机的创建
  17. if (getCloudletList().size() > 0 &&cloudletsSubmitted == 0) {
  18. // all the cloudlets sent finished. It means that some bount
  19. // cloudlet is waiting its VM be created
  20. clearDatacenters(); // 清理数据中心
  21. createVmsInDatacenter(0); // 仿真结束
  22. }
  23. }
  24. }

5、shutdownEntity(),接收到END_OF_SIMULATION事件,仿真结束,清除所有实体。

CloudSim源码分析之DatacenterBroker--processEvent()相关推荐

  1. CloudSim源码分析之虚拟机分配

    CloudSim源码分析之虚拟机分配 分类: 云计算 CloudSim2011-05-15 14:32 1629人阅读 评论(10) 收藏 举报 虚拟机integerlistnulltableobje ...

  2. Spark源码分析 – DAGScheduler

    DAGScheduler的架构其实非常简单, 1. eventQueue, 所有需要DAGScheduler处理的事情都需要往eventQueue中发送event 2. eventLoop Threa ...

  3. Fabric源码分析-共识模块

    正好这些天要有一个需求要帮客户魔改Fabric-v0.6,把一些hyperchain的高级特性移植过去,借此机会把之前看过的源码在梳理一下. 下面就是对Fabric共识模块的源码分析和梳理,代码都是以 ...

  4. 【转】Spark源码分析之-scheduler模块

    原文地址:http://jerryshao.me/architecture/2013/04/21/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B- ...

  5. Brpc 服务端收包源码分析(一)

    文章目录 server端使用 brpc::Server::AddService初始化各种数据 StartInternal内部其余服务也调用该函数 接收连接套接字StartAccept请求 ResetF ...

  6. 【akka】akka源码 Akka源码分析-FSM

    1.概述 转载自己学习,建议直接看原文:Akka源码分析-FSM akka还有一个不常使用.但我觉得比较方便的一个模块,那就是FSM(有限状态机).我们知道了akka中Actor模型的具体实现之后,就 ...

  7. CloudSim介绍和使用,CloudSim下载,CloudSim在IDEA中配置,CloudSim源码解读

    CloudSim介绍和使用 1. CloudSim简介: 2. CloudSim提供了以下新的特点: (1)支持大型云计算的基础设施的建模与仿真: (2)一个自足的支持数据中心.服务代理人.调度和分配 ...

  8. Spring 源码分析衍生篇十三 :事务扩展机制 TransactionSynchronization

    文章目录 一.前言 二.TransactionSynchronization 1. TransactionSynchronization 1.1 TransactionSynchronization ...

  9. Flink Cep 源码分析

    复合事件处理(Complex Event Processing,CEP)是一种基于动态环境中事件流的分析技术,事件在这里通常是有意义的状态变化,通过分析事件间的关系,利用过滤.关联.聚合等技术,根据事 ...

  10. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

最新文章

  1. 73-递归函数1:阶乘
  2. Python编程语言学习:python的列表的特殊应用之一行命令实现if判断中的两类判断
  3. python leetcode_LeetCode刷题——第8天(python)
  4. log4j - 日志
  5. 图解java工程师学习路线
  6. matlab启动不了jvm,MATLAB ::在-nojvm启动选项下不再支持此功能
  7. 通过hook实现禁止shift+delete快捷键
  8. react和angualr动态插入带html标签或不带html标签的数据
  9. RailsCasts中文版,#15 Fun with Find Conditions 使用hash为查询条件以便生成正确语法的SQL查询...
  10. C语言运算符优先级列表(超详细)
  11. Android日志分析工具的开发介绍
  12. google chrome的图标成一页纸了_10 款 Chrome 扩展,让你的浏览器好用到飞起
  13. getinfo怎么用php,PHP curl_getinfo函数
  14. sudo su与su的区别
  15. 优化About Us页面,提高网站询盘转化
  16. 金山系不惧微软,前有WPS力扛Office,后有eversheet接力再战
  17. 前端代码为什么会有低代码及无代码
  18. 一篇文章带你发中文核心期刊《计算机科学》
  19. 北京房价当日报20141013
  20. 波束形成,通过matlab仿真不同参数的波束形成以及旁絆级

热门文章

  1. matlab 矩阵累乘,matlab,SAS iml 矩阵运算
  2. 国庆集训1101+1103(未完成)
  3. Echarts中国地图json文件,去除诸岛
  4. html5 live,HTML5 live streaming
  5. php验证码一直错误,yii2.0验证码总是错误
  6. 从韩春雨事件看学术成果的辨别
  7. 工业读写器行业解决方案
  8. Weighing Features of Lung and Heart Regions forThoracic Disease Classification
  9. 大家谈之《区块链大革命》
  10. **使用InkScape绘制简易字母LOGO的教程**