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)、设置该虚拟机的物理机。
虚拟机创建源码如下:
-
public boolean vmCreate(Vm vm) {
-
// 如果物理机的存储小于虚拟机所需的存储,则虚拟机创建失败(注:CloudSim未仿真存储分配策略,只是简单的量化运算,可以写自己的分配策略)
-
-
if (getStorage() < vm.getSize()) {
-
Log.printLine("[VmScheduler.vmCreate] Allocation of VM #" + vm.getId() + " to Host #" + getId()
-
+ " failed by storage");
-
return false;
-
}
-
-
// 如果为虚拟机分配内存策略函数返回false,则虚拟机创建失败
-
-
if (!getRamProvisioner().allocateRamForVm(vm, vm.getCurrentRequestedRam())) {
-
Log.printLine("[VmScheduler.vmCreate] Allocation of VM #" + vm.getId() + " to Host #" + getId()
-
+ " failed by RAM");
-
return false;
-
}
-
-
// 如果为虚拟机分配带宽策略函数返回false,则虚拟机创建失败,并且要为该虚拟机释放与内存的映射关系
-
-
if (!getBwProvisioner().allocateBwForVm(vm, vm.getCurrentRequestedBw())) {
-
Log.printLine("[VmScheduler.vmCreate] Allocation of VM #" + vm.getId() + " to Host #" + getId()
-
+ " failed by BW");
-
getRamProvisioner().deallocateRamForVm(vm);
-
return false;
-
}
-
-
// 如果为虚拟机分配PE策略函数返回false,则虚拟机创建失败,并且要为该虚拟机释放与内存以及带宽的映射关系
-
-
if (!getVmScheduler().allocatePesForVm(vm, vm.getCurrentRequestedMips())) {
-
Log.printLine("[VmScheduler.vmCreate] Allocation of VM #" + vm.getId() + " to Host #" + getId()
-
+ " failed by MIPS");
-
getRamProvisioner().deallocateRamForVm(vm);
-
getBwProvisioner().deallocateBwForVm(vm);
-
return false;
-
}
-
-
// 更新该物理机的存储
-
-
setStorage(getStorage() - vm.getSize());
-
// 将新创建的虚拟机添加到vmList
-
-
getVmList().add(vm);
-
// 设置该虚拟机的物理机
-
-
vm.setHost(this);
-
return true;
-
}
虚拟机销毁步骤:
(1)、释放内存,删除虚拟机与内存的映射;
(2)、释放带宽,删除虚拟机与带宽的映射;
(3)、释放处理单元PE,删除虚拟机与PE的映射;
(4)、释放存储,更新物理机的存储;
(5)、从vmList中删除虚拟机。
虚拟机销毁源码:
-
// 销毁虚拟机
-
-
public void vmDestroy(Vm vm) {
-
if (vm != null) {
-
vmDeallocate(vm);
-
// 从vmList中删除虚拟机
-
-
getVmList().remove(vm);
-
vm.setHost(null);
-
}
-
}
阅读(4270) | 评论(1) | 转发(1) |