CloudSim源码分析之虚拟机的创建与销毁

4390阅读 1评论2013-09-17 skyornig
分类:云计算

                               CloudSim源码分析之虚拟机的创建与销毁 


      虚拟机创
vmCreate(Vm vm)在为虚拟机分配一台物理机时调用allocateHostForVm(Vm vm)vmCreate(Vm vm)host.java中实现。

虚拟机创建步骤:

1)、为虚拟机分配存储。如果物理机的存储小于虚拟机所需的存储,则虚拟机创建失败(注:CloudSim未仿真存储分配策略,只是简单的量化运算,可以写自己的分配策略)

2)、为虚拟机分配内存。如果为虚拟机分配内存策略函数返回false,则虚拟机创建失败。

3)、为虚拟机分配带宽。如果为虚拟机分配带宽策略函数返回false,则虚拟机创建失败,并且要为该虚拟机释放与内存的映射关系。

4)、为虚拟机分配处理单元。如果为虚拟机分配PE策略函数返回false,则虚拟机创建失败,并且要为该虚拟机释放与内存以及带宽的映射关系。

5)、更新该物理机的存储。

6)、将新创建的虚拟机添加到vmList

7)、设置该虚拟机的物理机。
    虚拟机创建源码如下:

点击(此处)折叠或打开

  1. public boolean vmCreate(Vm vm) {
  2.         // 如果物理机的存储小于虚拟机所需的存储,则虚拟机创建失败(注:CloudSim未仿真存储分配策略,只是简单的量化运算,可以写自己的分配策略)

  3.         if (getStorage() < vm.getSize()) {
  4.             Log.printLine("[VmScheduler.vmCreate] Allocation of VM #" + vm.getId() + " to Host #" + getId()
  5.                     + " failed by storage");
  6.             return false;
  7.         }

  8.         // 如果为虚拟机分配内存策略函数返回false,则虚拟机创建失败

  9.         if (!getRamProvisioner().allocateRamForVm(vm, vm.getCurrentRequestedRam())) {
  10.             Log.printLine("[VmScheduler.vmCreate] Allocation of VM #" + vm.getId() + " to Host #" + getId()
  11.                     + " failed by RAM");
  12.             return false;
  13.         }
  14.         
  15.         // 如果为虚拟机分配带宽策略函数返回false,则虚拟机创建失败,并且要为该虚拟机释放与内存的映射关系

  16.          if (!getBwProvisioner().allocateBwForVm(vm, vm.getCurrentRequestedBw())) {
  17.             Log.printLine("[VmScheduler.vmCreate] Allocation of VM #" + vm.getId() + " to Host #" + getId()
  18.                     + " failed by BW");
  19.             getRamProvisioner().deallocateRamForVm(vm);
  20.             return false;
  21.         }

  22.          // 如果为虚拟机分配PE策略函数返回false,则虚拟机创建失败,并且要为该虚拟机释放与内存以及带宽的映射关系

  23.         if (!getVmScheduler().allocatePesForVm(vm, vm.getCurrentRequestedMips())) {
  24.             Log.printLine("[VmScheduler.vmCreate] Allocation of VM #" + vm.getId() + " to Host #" + getId()
  25.                     + " failed by MIPS");
  26.             getRamProvisioner().deallocateRamForVm(vm);
  27.             getBwProvisioner().deallocateBwForVm(vm);
  28.             return false;
  29.         }

  30.         // 更新该物理机的存储

  31.         setStorage(getStorage() - vm.getSize());
  32.         // 将新创建的虚拟机添加到vmList

  33.         getVmList().add(vm);
  34.         // 设置该虚拟机的物理机

  35.         vm.setHost(this);
  36.         return true;
  37.     }

虚拟机销毁步骤:

1)、释放内存,删除虚拟机与内存的映射;

2)、释放带宽,删除虚拟机与带宽的映射;

3)、释放处理单元PE,删除虚拟机与PE的映射;

4)、释放存储,更新物理机的存储;

5)、从vmList中删除虚拟机。
    虚拟机销毁源码:

点击(此处)折叠或打开

  1. // 销毁虚拟机

  2.     public void vmDestroy(Vm vm) {
  3.         if (vm != null) {
  4.             vmDeallocate(vm);
  5.             // 从vmList中删除虚拟机

  6.             getVmList().remove(vm);
  7.             vm.setHost(null);
  8.         }
  9.     }

上一篇:CloudSim源码分析之主机资源分配(内存篇)
下一篇:CloudSim源码分析之startSimulation()