Cloudsim 3.0.3中Power系列类的解析——PowerDataCenter和PowerDCBroker
本文为旧文markdown重置版,旧文链接这里写链接内容
我在上一篇博客中提到了cloudsim模拟的函数调用逻辑,针对是DC、DCBroker等类,也即所有examples中的通用逻辑。但3.0.3中包含有power扩展包,里面的Power系列Java类(PowerDC, PowerDCBroker, PowerHost等)是之前描述的类的扩展,加入了能耗相关特征和调度方法。
本文在此介绍最核心的Power类——PowerDataCenter,重点讲述对父类的扩展内容:
1、PowerDataCenter
继承:继承DataCenter,沿用的主要函数包括setXXX(),getXXX()函数和大部分processXXX()系列函数(除了processCloudletSubmit()和processVmMigrate(),因为这两个是数据中心VM调度的关键)
增加的成员:
Double Power——数据中心的总功耗
Boolean disableMigratations——是否开启VM迁移
Double cloudletSubmitted —— 最近一个cloudlet的提交时刻,在每次调用processCloudletSubmit()函数的最后被设置为当前clock。
Int migrationCount——VM迁移计数
增加、重载的重要函数:
1)updateCloudetProcessingWithoutSchedulingFutureEventsForce():这个函数间接更新了每一台host上的VM的执行进度(通过调用父类的updateVmsProcessing()方式来更新,该函数内容见开头提及的博客),同时输出当前clock、各主机当前CPU利用率以及最近一个时间窗口(clock()- lastProcessTime)内的能耗,并将其累加至PowerDC对象中的总能耗(成员命名为Power,有点不合理);其中,lastProcessTime更新在本函数内完成,所以lastProcessTime就是上一次update的时刻。
2)@Override updateCloudletProcessing():更新DC中已经在执行的任务的进度;这个函数与父类的updateCloudletProcessing()实现风格迥然不同(应该是不同的人编写的)。
它首先进行判断:如果现在是首个任务(cloudletSubmitted==-1)或之前的任务都还没推进(cloudletSubmitted==clock()),那么就不必做update,只需要将future中的VM_DC_EVENT事件推进一个schedulingInterval再放回队列去。
否则,说明有先前的任务处于执行阶段,进度需要update,同时还可能触发迁移操作。具体来说,先进行进度更新,即调用updateCloudetProcessingWithoutSchedulingFutureEventsForce()函数来完成更新,再调用DC.getVmAllocationPolicy().optimizeAllocation()来取得一个migrationMap,这个结构里面记录了根据VM迁移策略制定的迁移方案(即哪些VM要迁移至哪些host),然后据此完成VM迁移(又涉及到host状态更新,比较繁杂)并产生tags.VM_MIGRATE事件。完成这一系列动作之后,将future中的VM_DC_EVENT事件推进一个schedulingInterval再放回队列去。
3)@Override processCloudletSubmit(SimEvent, boolean):处理当前这个任务的提交事件;通过调用父类(DataCenter类)的processCloudletSubmit(ev, ack),而processCloudletSubmit(ev, ack)又会调用updateCloudletProcessing()(下面会讲),最后设置cloudletSubmitted = clock();
4)@Override processCloudletMirgrate(SimEvent, boolean):处理VM迁移事件,逻辑大概是:先调用updateCloudetProcessingWithoutSchedulingFutureEventsForce()来更新所有Host上所有vm的进度,然后调用父类的processVmMigrate(ev, ack)完成迁移操作。
2、PowerDataCenterBroker
基本上等同于父类DCBroker,用于配合PowerDC来使用,仅重载了一个方法
继承:DataCenterBroker
新成员:无
重载的方法:
@Override
protected void processVmCreate(SimEvent ev):重载了父类DCBroker对VM创建(完成)事件(应该是DC完成创建并发回来的事件)的逻辑,但基本上就是简单判断创建成功与否然后直接调用父类的processVmCreate(ev)。