Chinaunix首页 | 论坛 | 博客
  • 博客访问: 189429
  • 博文数量: 19
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1062
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-10 15:52
个人简介

经历过才能真的感受,做一个靠谱的人!

文章分类

全部博文(19)

文章存档

2015年(1)

2013年(18)

我的朋友

分类: 云计算

2013-09-17 17:28:48

                               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.     }

阅读(4201) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~